From 6f9c7f3da2d0a70aaf0af1bf094211bcd7d3c4b8 Mon Sep 17 00:00:00 2001 From: Liang Yi Date: Sat, 14 Aug 2021 20:59:08 +0800 Subject: [PATCH 01/67] Update Redux Implementation with Redux-Toolkit --- .github/workflows/ci.yml | 4 + frontend/.env | 3 +- frontend/README.md | 6 + frontend/package-lock.json | 13299 ++++++++-------- frontend/package.json | 9 +- .../@redux/__tests__/entity-reducer.test.ts | 379 + .../src/@redux/__tests__/item-reducer.test.ts | 155 + .../src/@redux/__tests__/list-reducer.test.ts | 248 + frontend/src/@redux/actions/factory.ts | 123 - frontend/src/@redux/actions/movie.ts | 95 +- frontend/src/@redux/actions/series.ts | 121 +- frontend/src/@redux/actions/site.ts | 78 +- frontend/src/@redux/actions/system.ts | 111 +- frontend/src/@redux/constants/index.ts | 43 - frontend/src/@redux/hooks/async.ts | 29 + frontend/src/@redux/hooks/base.ts | 34 +- frontend/src/@redux/hooks/index.ts | 397 +- frontend/src/@redux/hooks/movies.ts | 70 + frontend/src/@redux/hooks/series.ts | 102 + frontend/src/@redux/hooks/site.ts | 16 +- frontend/src/@redux/hooks/system.ts | 131 + frontend/src/@redux/reducers/index.ts | 13 +- frontend/src/@redux/reducers/movie.ts | 135 +- frontend/src/@redux/reducers/series.ts | 202 +- frontend/src/@redux/reducers/site.ts | 161 +- frontend/src/@redux/reducers/system.ts | 187 +- frontend/src/@redux/redux.d.ts | 62 - frontend/src/@redux/store/index.ts | 24 +- frontend/src/@redux/tests/helper.ts | 31 + frontend/src/@redux/types.d.ts | 22 - .../src/@redux/utils/__tests__/async-test.ts | 32 + frontend/src/@redux/utils/async.ts | 71 + frontend/src/@redux/utils/factory.ts | 303 + frontend/src/@redux/utils/index.ts | 10 - frontend/src/@redux/utils/mapper.ts | 181 - frontend/src/@socketio/hooks.ts | 15 +- frontend/src/@socketio/index.ts | 9 +- frontend/src/@socketio/reducer.ts | 125 +- frontend/src/@types/api.d.ts | 60 +- frontend/src/@types/async.d.ts | 22 + frontend/src/@types/basic.d.ts | 16 - frontend/src/@types/form.d.ts | 4 +- frontend/src/@types/react-table.d.ts | 3 + frontend/src/@types/server.d.ts | 16 + frontend/src/@types/settings.d.ts | 4 +- frontend/src/@types/socket.d.ts | 27 +- frontend/src/@types/system.d.ts | 2 +- frontend/src/@types/utilities.d.ts | 16 +- frontend/src/App/Header.tsx | 4 +- frontend/src/App/index.tsx | 64 +- frontend/src/App/notifications/index.tsx | 47 +- frontend/src/Blacklist/Movies/index.tsx | 14 +- frontend/src/Blacklist/Series/index.tsx | 14 +- frontend/src/History/Movies/index.tsx | 2 +- frontend/src/History/Series/index.tsx | 2 +- frontend/src/History/Statistics/index.tsx | 24 +- frontend/src/History/generic/index.tsx | 12 +- frontend/src/Movies/Detail/index.tsx | 18 +- frontend/src/Movies/Detail/table.tsx | 6 +- frontend/src/Movies/index.tsx | 14 +- frontend/src/Series/Episodes/index.tsx | 60 +- frontend/src/Series/Episodes/table.tsx | 29 +- frontend/src/Series/index.tsx | 21 +- .../src/Settings/Languages/components.tsx | 10 +- frontend/src/Settings/Languages/index.tsx | 28 +- frontend/src/Settings/Languages/modal.tsx | 23 +- frontend/src/Settings/Languages/table.tsx | 18 +- frontend/src/Settings/Router.tsx | 7 +- frontend/src/Settings/components/hooks.ts | 3 +- frontend/src/Settings/components/provider.tsx | 26 +- frontend/src/System/Logs/index.tsx | 17 +- frontend/src/System/Providers/index.tsx | 17 +- frontend/src/System/Releases/index.tsx | 59 +- frontend/src/System/Status/index.tsx | 25 +- frontend/src/System/Status/table.tsx | 10 +- frontend/src/System/Tasks/index.tsx | 17 +- frontend/src/Wanted/Movies/index.tsx | 4 +- frontend/src/Wanted/Series/index.tsx | 2 +- frontend/src/Wanted/generic/index.tsx | 8 +- frontend/src/__tests__/render-test.tsx | 9 + frontend/src/apis/episodes.ts | 28 +- frontend/src/apis/history.ts | 2 +- frontend/src/apis/hooks.ts | 36 +- frontend/src/apis/index.ts | 20 +- frontend/src/apis/movies.ts | 20 +- frontend/src/apis/providers.ts | 4 +- frontend/src/apis/series.ts | 4 +- frontend/src/apis/system.ts | 26 +- frontend/src/components/LanguageSelector.tsx | 8 +- frontend/src/components/async.tsx | 152 +- frontend/src/components/index.tsx | 2 +- frontend/src/components/inputs/Selector.tsx | 3 + .../src/components/modals/HistoryModal.tsx | 73 +- .../src/components/modals/ItemEditorModal.tsx | 6 +- .../components/modals/ManualSearchModal.tsx | 2 +- .../components/modals/MovieUploadModal.tsx | 10 +- .../components/modals/SeriesUploadModal.tsx | 6 +- .../components/modals/SubtitleToolModal.tsx | 14 +- .../src/components/tables/AsyncPageTable.tsx | 122 +- frontend/src/generic/BaseItemView/index.tsx | 64 +- frontend/src/generic/BaseItemView/table.tsx | 18 +- frontend/src/generic/ItemOverview.tsx | 4 +- frontend/src/index.tsx | 42 +- frontend/src/utilites/async.ts | 95 + frontend/src/utilites/entity.ts | 63 + frontend/src/utilites/hooks.ts | 16 +- frontend/src/utilites/index.ts | 50 +- frontend/tsconfig.json | 4 +- 108 files changed, 9735 insertions(+), 8979 deletions(-) create mode 100644 frontend/src/@redux/__tests__/entity-reducer.test.ts create mode 100644 frontend/src/@redux/__tests__/item-reducer.test.ts create mode 100644 frontend/src/@redux/__tests__/list-reducer.test.ts delete mode 100644 frontend/src/@redux/actions/factory.ts delete mode 100644 frontend/src/@redux/constants/index.ts create mode 100644 frontend/src/@redux/hooks/async.ts create mode 100644 frontend/src/@redux/hooks/movies.ts create mode 100644 frontend/src/@redux/hooks/series.ts create mode 100644 frontend/src/@redux/hooks/system.ts delete mode 100644 frontend/src/@redux/redux.d.ts create mode 100644 frontend/src/@redux/tests/helper.ts delete mode 100644 frontend/src/@redux/types.d.ts create mode 100644 frontend/src/@redux/utils/__tests__/async-test.ts create mode 100644 frontend/src/@redux/utils/async.ts create mode 100644 frontend/src/@redux/utils/factory.ts delete mode 100644 frontend/src/@redux/utils/index.ts delete mode 100644 frontend/src/@redux/utils/mapper.ts create mode 100644 frontend/src/@types/async.d.ts create mode 100644 frontend/src/@types/server.d.ts create mode 100644 frontend/src/__tests__/render-test.tsx create mode 100644 frontend/src/utilites/async.ts create mode 100644 frontend/src/utilites/entity.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 962c10c89..e1d94998c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,6 +47,10 @@ jobs: run: npm run build working-directory: ${{ env.UI_DIRECTORY }} + - name: Unit Test + run: npm test + working-directory: ${{ env.UI_DIRECTORY }} + - uses: actions/upload-artifact@v2 with: name: ${{ env.UI_ARTIFACT_NAME }} diff --git a/frontend/.env b/frontend/.env index 848fdfb58..0e600cd13 100644 --- a/frontend/.env +++ b/frontend/.env @@ -4,5 +4,4 @@ REACT_APP_APIKEY="YOUR_SERVER_API_KEY" # Optional REACT_APP_CAN_UPDATE=true -REACT_APP_HAS_UPDATE=false -REACT_APP_LOG_REDUX_EVENT=false \ No newline at end of file +REACT_APP_HAS_UPDATE=false \ No newline at end of file diff --git a/frontend/README.md b/frontend/README.md index a5392649d..05f866171 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -46,6 +46,12 @@ Open `http://localhost:3000` to view it in the browser. The page will reload if you make edits. You will also see any lint errors in the console. +### `npm test` + +Run the Unit Test to validate app state. + +Please ensure all tests are passed before uploading the code + ### `npm run build` Builds the app for production to the `build` folder. diff --git a/frontend/package-lock.json b/frontend/package-lock.json index f5c7cbb10..7e8e40491 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -15,7 +15,9 @@ "@fortawesome/free-regular-svg-icons": "^5.15", "@fortawesome/free-solid-svg-icons": "^5.15", "@fortawesome/react-fontawesome": "^0.1.11", + "@reduxjs/toolkit": "^1.6", "@types/bootstrap": "^5", + "@types/jest": "~26.0.24", "@types/lodash": "^4", "@types/node": "^15", "@types/react": "^16", @@ -24,9 +26,6 @@ "@types/react-router-dom": "^5", "@types/react-select": "^4.0.3", "@types/react-table": "^7", - "@types/redux-actions": "^2", - "@types/redux-logger": "^3", - "@types/redux-promise": "^0.5", "axios": "^0.21", "bootstrap": "^4", "http-proxy-middleware": "^0.19", @@ -42,10 +41,6 @@ "react-select": "^4", "react-table": "^7", "recharts": "^2.0.8", - "redux-actions": "^2", - "redux-logger": "^3", - "redux-promise": "^0.6", - "redux-thunk": "^2.3", "rooks": "^5", "sass": "^1", "socket.io-client": "^4", @@ -59,38 +54,43 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", "dependencies": { - "@babel/highlight": "^7.12.13" + "@babel/highlight": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.13.11", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.11.tgz", - "integrity": "sha512-BwKEkO+2a67DcFeS3RLl0Z3Gs2OvdXewuWjc1Hfokhb5eQWP9YRYH1/+VrVZvql2CfjOiNGqSAFOYt4lsqTHzg==" + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", + "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.0", + "@babel/helper-module-transforms": "^7.15.0", + "@babel/helpers": "^7.14.8", + "@babel/parser": "^7.15.0", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", + "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", + "semver": "^6.3.0", "source-map": "^0.5.0" }, "engines": { @@ -101,51 +101,84 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/@babel/core/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", + "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", "dependencies": { - "@babel/types": "^7.13.0", + "@babel/types": "^7.15.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", - "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", + "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", "dependencies": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", - "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz", + "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-explode-assignable-expression": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.10.tgz", - "integrity": "sha512-/Xju7Qg1GQO4mHZ/Kcs6Au7gfafgZnwm+a7sy/ow/tV1sHeraRUHbjdat8/UvDor4Tez+siGKDk6zIKtCPKVJA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", + "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", "dependencies": { - "@babel/compat-data": "^7.13.8", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", "semver": "^6.3.0" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0" } @@ -159,36 +192,43 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.13.11", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz", - "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.0.tgz", + "integrity": "sha512-MdmDXgvTIi4heDVX/e9EFfeGpugqm9fobBVg/iioE8kueXrOHdRDe36FAY7SnE9xXLVeYCoJR/gdrBEIHRC83Q==", "dependencies": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-member-expression-to-functions": "^7.13.0", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-split-export-declaration": "^7.12.13" + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-member-expression-to-functions": "^7.15.0", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.0", + "@babel/helper-split-export-declaration": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", - "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-annotate-as-pure": "^7.14.5", "regexpu-core": "^4.7.1" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz", - "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", "dependencies": { "@babel/helper-compilation-targets": "^7.13.0", "@babel/helper-module-imports": "^7.12.13", @@ -203,6 +243,27 @@ "@babel/core": "^7.4.0-0" } }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -212,169 +273,224 @@ } }, "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", - "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz", + "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", "dependencies": { - "@babel/types": "^7.13.0" + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", + "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", "dependencies": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-get-function-arity": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", + "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", "dependencies": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz", - "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", + "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", "dependencies": { - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz", - "integrity": "sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", + "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", "dependencies": { - "@babel/types": "^7.13.0" + "@babel/types": "^7.15.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", - "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", + "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", "dependencies": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz", - "integrity": "sha512-Ls8/VBwH577+pw7Ku1QkUWIyRRNHpYlts7+qSqBBFCW3I8QteB9DxfcZ5YJpOwH6Ihe/wn8ch7fMGOP1OhEIvw==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", + "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", "dependencies": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-simple-access": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0", - "lodash": "^4.17.19" + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.0", + "@babel/helper-simple-access": "^7.14.8", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", + "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", "dependencies": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", - "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz", + "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-wrap-function": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-wrap-function": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz", - "integrity": "sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", + "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.13.0", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-member-expression-to-functions": "^7.15.0", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", - "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", + "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", "dependencies": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.8" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", + "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", "dependencies": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", + "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", "dependencies": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==" + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", - "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz", + "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==", "dependencies": { - "@babel/helper-function-name": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-function-name": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", - "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.8.tgz", + "integrity": "sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw==", "dependencies": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.8", + "@babel/types": "^7.14.8" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/highlight/node_modules/ansi-styles": { @@ -442,9 +558,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.13.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.11.tgz", - "integrity": "sha512-PhuoqeHoO9fc4ffMEVk4qb/w/s2iOSWohvbHxLtxui0eBg3Lg5gN1U8wp1V1u61hOWkPQJJyJzGH6Y+grwkq8Q==", + "version": "7.15.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.2.tgz", + "integrity": "sha512-bMJXql1Ss8lFnvr11TZDH4ArtwlAS5NG9qBmdiFW2UHHm6MVoR+GDc5XE2b9K938cyjc9O6/+vjjcffLDtfuDg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -452,31 +568,69 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz", - "integrity": "sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.9.tgz", + "integrity": "sha512-d1lnh+ZnKrFKwtTYdw320+sQWCTwgkB9fmUhNXRADA4akR6wLjaruSGnIEUjpt9HCOwTr4ynFTKu19b7rFRpmw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5", "@babel/plugin-syntax-async-generators": "^7.8.4" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", - "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz", + "integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, "node_modules/@babel/plugin-proposal-decorators": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.1.tgz", @@ -491,136 +645,183 @@ } }, "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", - "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", - "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", - "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-json-strings": "^7.8.3" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", - "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", - "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", - "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", - "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", + "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", "dependencies": { - "@babel/compat-data": "^7.13.8", - "@babel/helper-compilation-targets": "^7.13.8", - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.13.0" + "@babel/plugin-transform-parameters": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", - "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.8.tgz", - "integrity": "sha512-hpbBwbTgd7Cz1QryvwJZRo1U0k1q8uyBmeXOSQUjdg/A2TASkhR/rz7AyqZ/kS8kbpsNA80rOYbxySBJAqmhhQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", - "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", - "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=4" @@ -662,12 +863,29 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz", - "integrity": "sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA==", + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.14.5.tgz", + "integrity": "sha512-c4sZMRWL4GSvP1EXy0woIP7m4jkVcEuG8R1TOZxPBPtp4FSM/kiPZub9UIs/Jrb5ZAOzvTUSGYrWsrSu1JvoPw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -696,11 +914,14 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz", - "integrity": "sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.14.5.tgz", + "integrity": "sha512-9WK5ZwKCdWHxVuU13XNT6X73FGmutAXeor5lGFq6qhOFtMFUF4jkbijuyUdZZlpYq6E2hZeZf/u3959X9wsv0Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -729,11 +950,14 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", - "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", + "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -805,143 +1029,193 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", - "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz", - "integrity": "sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", - "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", - "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", "dependencies": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0" + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", - "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", - "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz", + "integrity": "sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", - "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.9.tgz", + "integrity": "sha512-NfZpTcxU3foGWbl4wxmZ35mTsYJy8oQocbeIMoDAGGFarAmSQlL+LWMkDx/tj6pNotpbX3rltIA4dprgAPOq5A==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", "globals": "^11.1.0" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", - "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz", - "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", - "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", - "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", - "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -960,237 +1234,297 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", - "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz", + "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", - "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", "dependencies": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", - "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", - "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz", - "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", "dependencies": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", "babel-plugin-dynamic-import-node": "^2.3.3" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", - "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.0.tgz", + "integrity": "sha512-3H/R9s8cXcOGE8kgMlmjYYC9nqr5ELiPkJn4q0mypBrjhYQoc+5/Maq69vV4xRPWnkzZuwJPf5rArxpB/35Cig==", "dependencies": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-module-transforms": "^7.15.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.14.8", "babel-plugin-dynamic-import-node": "^2.3.3" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", - "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz", + "integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==", "dependencies": { - "@babel/helper-hoist-variables": "^7.13.0", - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", "babel-plugin-dynamic-import-node": "^2.3.3" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz", - "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", "dependencies": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", - "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz", + "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", - "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", - "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", - "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz", + "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", - "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.13.10.tgz", - "integrity": "sha512-E+aCW9j7mLq01tOuGV08YzLBt+vSyr4bOPT75B6WrAlrUfmOYOZ/yWk847EH0dv0xXiCihWLEmlX//O30YhpIw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz", + "integrity": "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz", - "integrity": "sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA==", + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz", + "integrity": "sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.17.tgz", - "integrity": "sha512-mwaVNcXV+l6qJOuRhpdTEj8sT/Z0owAVWf9QujTZ0d2ye9X/K+MTOTSizcgKOj18PGnTc/7g1I4+cIUjsKhBcw==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz", + "integrity": "sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-jsx": "^7.12.13", - "@babel/types": "^7.12.17" + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-jsx": "^7.14.5", + "@babel/types": "^7.14.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz", - "integrity": "sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz", + "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.12.17" + "@babel/plugin-transform-react-jsx": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", - "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz", + "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz", - "integrity": "sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", "dependencies": { "regenerator-transform": "^0.14.2" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", - "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -1219,121 +1553,149 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", - "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", - "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", + "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", - "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", - "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", - "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz", - "integrity": "sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.0.tgz", + "integrity": "sha512-WIIEazmngMEEHDaPTx0IZY48SaAmjVWe3TRSX7cmJXn0bEv9midFzAjxiruOWYIVf5iQ10vFx7ASDpgEO08L5w==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-typescript": "^7.12.13" + "@babel/helper-create-class-features-plugin": "^7.15.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-typescript": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", - "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", - "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-env": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.10.tgz", - "integrity": "sha512-nOsTScuoRghRtUsRr/c69d042ysfPHcu+KOB4A9aAO9eJYqrkat+LF8G1yp1HD18QiwixT2CisZTr/0b3YZPXQ==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.0.tgz", + "integrity": "sha512-FhEpCNFCcWW3iZLg0L2NPE9UerdtsCR6ZcsGHUX6Om6kbCQeL5QZDqFDmeNHC6/fy6UH3jEge7K4qG5uC9In0Q==", "dependencies": { - "@babel/compat-data": "^7.13.8", - "@babel/helper-compilation-targets": "^7.13.10", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-proposal-async-generator-functions": "^7.13.8", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-dynamic-import": "^7.13.8", - "@babel/plugin-proposal-export-namespace-from": "^7.12.13", - "@babel/plugin-proposal-json-strings": "^7.13.8", - "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", - "@babel/plugin-proposal-numeric-separator": "^7.12.13", - "@babel/plugin-proposal-object-rest-spread": "^7.13.8", - "@babel/plugin-proposal-optional-catch-binding": "^7.13.8", - "@babel/plugin-proposal-optional-chaining": "^7.13.8", - "@babel/plugin-proposal-private-methods": "^7.13.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-async-generator-functions": "^7.14.9", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.14.5", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.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", @@ -1343,47 +1705,51 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.12.13", - "@babel/plugin-transform-arrow-functions": "^7.13.0", - "@babel/plugin-transform-async-to-generator": "^7.13.0", - "@babel/plugin-transform-block-scoped-functions": "^7.12.13", - "@babel/plugin-transform-block-scoping": "^7.12.13", - "@babel/plugin-transform-classes": "^7.13.0", - "@babel/plugin-transform-computed-properties": "^7.13.0", - "@babel/plugin-transform-destructuring": "^7.13.0", - "@babel/plugin-transform-dotall-regex": "^7.12.13", - "@babel/plugin-transform-duplicate-keys": "^7.12.13", - "@babel/plugin-transform-exponentiation-operator": "^7.12.13", - "@babel/plugin-transform-for-of": "^7.13.0", - "@babel/plugin-transform-function-name": "^7.12.13", - "@babel/plugin-transform-literals": "^7.12.13", - "@babel/plugin-transform-member-expression-literals": "^7.12.13", - "@babel/plugin-transform-modules-amd": "^7.13.0", - "@babel/plugin-transform-modules-commonjs": "^7.13.8", - "@babel/plugin-transform-modules-systemjs": "^7.13.8", - "@babel/plugin-transform-modules-umd": "^7.13.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", - "@babel/plugin-transform-new-target": "^7.12.13", - "@babel/plugin-transform-object-super": "^7.12.13", - "@babel/plugin-transform-parameters": "^7.13.0", - "@babel/plugin-transform-property-literals": "^7.12.13", - "@babel/plugin-transform-regenerator": "^7.12.13", - "@babel/plugin-transform-reserved-words": "^7.12.13", - "@babel/plugin-transform-shorthand-properties": "^7.12.13", - "@babel/plugin-transform-spread": "^7.13.0", - "@babel/plugin-transform-sticky-regex": "^7.12.13", - "@babel/plugin-transform-template-literals": "^7.13.0", - "@babel/plugin-transform-typeof-symbol": "^7.12.13", - "@babel/plugin-transform-unicode-escapes": "^7.12.13", - "@babel/plugin-transform-unicode-regex": "^7.12.13", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.14.5", + "@babel/plugin-transform-classes": "^7.14.9", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.14.5", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.15.0", + "@babel/plugin-transform-modules-systemjs": "^7.14.5", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.14.5", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.13.0", - "babel-plugin-polyfill-corejs2": "^0.1.4", - "babel-plugin-polyfill-corejs3": "^0.1.3", - "babel-plugin-polyfill-regenerator": "^0.1.2", - "core-js-compat": "^3.9.0", + "@babel/types": "^7.15.0", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.16.0", "semver": "^6.3.0" }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } @@ -1412,15 +1778,19 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.13.tgz", - "integrity": "sha512-TYM0V9z6Abb6dj1K7i5NrEhA13oS5ujUYQYDfqIBXYHOc2c2VkFgc+q9kyssIyUfy4/hEwqrgSlJ/Qgv8zJLsA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", + "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-transform-react-display-name": "^7.12.13", - "@babel/plugin-transform-react-jsx": "^7.12.13", - "@babel/plugin-transform-react-jsx-development": "^7.12.12", - "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-react-display-name": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.5", + "@babel/plugin-transform-react-jsx-development": "^7.14.5", + "@babel/plugin-transform-react-pure-annotations": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -1439,9 +1809,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.5.tgz", - "integrity": "sha512-121rumjddw9c3NCQ55KGkyE1h/nzWhU/owjhw0l4mQrkzz4x9SGS1X8gFLraHwX7td3Yo4QTL+qj0NcIzN87BA==", + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz", + "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==", "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -1450,48 +1820,80 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.13.10.tgz", - "integrity": "sha512-x/XYVQ1h684pp1mJwOV4CyvqZXqbc8CMsMGUnAbuc82ZCdv1U63w5RSUzgDSXQHG5Rps/kiksH6g2D5BuaKyXg==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.9.tgz", + "integrity": "sha512-64RiH2ON4/y8qYtoa8rUiyam/tUVyGqRyNYhe+vCRGmjnV4bUlZvY+mwd0RrmLoCpJpdq3RsrNqKb7SJdw/4kw==", "dependencies": { - "core-js-pure": "^3.0.0", + "core-js-pure": "^3.16.0", "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.0.tgz", - "integrity": "sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", + "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.0", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.0", - "@babel/types": "^7.13.0", + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz", - "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==", + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@bcoe/v8-coverage": { @@ -1550,14 +1952,14 @@ "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" }, "node_modules/@emotion/react": { - "version": "11.1.5", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.1.5.tgz", - "integrity": "sha512-xfnZ9NJEv9SU9K2sxXM06lzjK245xSeHRpUh67eARBm3PBHjjKIZlfWZ7UQvD0Obvw6ZKjlC79uHrlzFYpOB/Q==", + "version": "11.4.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.4.1.tgz", + "integrity": "sha512-pRegcsuGYj4FCdZN6j5vqCALkNytdrKw3TZMekTzNXixRg4wkLsU5QEaBG5LC6l01Vppxlp7FE3aTHpIG5phLg==", "dependencies": { - "@babel/runtime": "^7.7.2", - "@emotion/cache": "^11.1.3", - "@emotion/serialize": "^1.0.0", - "@emotion/sheet": "^1.0.1", + "@babel/runtime": "^7.13.10", + "@emotion/cache": "^11.4.0", + "@emotion/serialize": "^1.0.2", + "@emotion/sheet": "^1.0.2", "@emotion/utils": "^1.0.0", "@emotion/weak-memoize": "^0.2.5", "hoist-non-react-statics": "^3.3.1" @@ -1576,9 +1978,9 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.1.tgz", - "integrity": "sha512-TXlKs5sgUKhFlszp/rg4lIAZd7UUSmJpwaf9/lAEFcUh2vPi32i7x4wk7O8TN8L8v2Ol8k0CxnhRBY0zQalTxA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.2.tgz", + "integrity": "sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==", "dependencies": { "@emotion/hash": "^0.8.0", "@emotion/memoize": "^0.7.4", @@ -1588,9 +1990,9 @@ } }, "node_modules/@emotion/sheet": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.0.1.tgz", - "integrity": "sha512-GbIvVMe4U+Zc+929N1V7nW6YYJtidj31lidSmdYcWozwoBIObXBnaJkKNDjZrLm9Nc0BR+ZyHNaRZxqNZbof5g==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.0.2.tgz", + "integrity": "sha512-QQPB1B70JEVUHuNtzjHftMGv6eC3Y9wqavyarj4x4lg47RACkeSfNo5pxIOKizwS9AEFLohsqoaxGQj4p0vSIw==" }, "node_modules/@emotion/unitless": { "version": "0.7.5", @@ -1608,14 +2010,14 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "node_modules/@eslint/eslintrc": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", - "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dependencies": { "ajv": "^6.12.4", "debug": "^4.1.1", "espree": "^7.3.0", - "globals": "^12.1.0", + "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", "js-yaml": "^3.13.1", @@ -1626,12 +2028,28 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dependencies": { - "type-fest": "^0.8.1" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "dependencies": { + "type-fest": "^0.20.2" }, "engines": { "node": ">=8" @@ -1648,80 +2066,88 @@ "node": ">= 4" } }, + "node_modules/@eslint/eslintrc/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@fontsource/roboto": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-4.2.3.tgz", - "integrity": "sha512-lEnB089GcK3uU3d0MPjwYTUPZBhpKQ2HxvgC+0ib2ElJNISBoS3fHE2sKuZIcCeghWW0fX58OJrZiPgZ3essBg==" + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-4.5.0.tgz", + "integrity": "sha512-ja4XYw/9kNRFM5Ndk9vwzHWsdBMXczyBazFkTXJQ74QQBnT0BbSsHn0pF60AU0Iznig1Wt9x3rADfG8LANvMpw==" }, "node_modules/@fortawesome/fontawesome-common-types": { - "version": "0.2.35", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.35.tgz", - "integrity": "sha512-IHUfxSEDS9dDGqYwIW7wTN6tn/O8E0n5PcAHz9cAaBoZw6UpG20IG/YM3NNLaGPwPqgjBAFjIURzqoQs3rrtuw==", + "version": "0.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", + "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==", "hasInstallScript": true, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "1.2.35", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.35.tgz", - "integrity": "sha512-uLEXifXIL7hnh2sNZQrIJWNol7cTVIzwI+4qcBIq9QWaZqUblm0IDrtSqbNg+3SQf8SMGHkiSigD++rHmCHjBg==", + "version": "1.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", + "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.35" + "@fortawesome/fontawesome-common-types": "^0.2.36" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-brands-svg-icons": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-5.15.3.tgz", - "integrity": "sha512-1hirPcbjj72ZJtFvdnXGPbAbpn3Ox6mH3g5STbANFp3vGSiE5u5ingAKV06mK6ZVqNYxUPlh4DlTnaIvLtF2kw==", + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-5.15.4.tgz", + "integrity": "sha512-f1witbwycL9cTENJegcmcZRYyawAFbm8+c6IirLmwbbpqz46wyjbQYLuxOc7weXFXfB7QR8/Vd2u5R3q6JYD9g==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.35" + "@fortawesome/fontawesome-common-types": "^0.2.36" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-regular-svg-icons": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.3.tgz", - "integrity": "sha512-q4/p8Xehy9qiVTdDWHL4Z+o5PCLRChePGZRTXkl+/Z7erDVL8VcZUuqzJjs6gUz6czss4VIPBRdCz6wP37/zMQ==", + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.4.tgz", + "integrity": "sha512-9VNNnU3CXHy9XednJ3wzQp6SwNwT3XaM26oS4Rp391GsxVYA+0oDR2J194YCIWf7jNRCYKjUCOduxdceLrx+xw==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.35" + "@fortawesome/fontawesome-common-types": "^0.2.36" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.3.tgz", - "integrity": "sha512-XPeeu1IlGYqz4VWGRAT5ukNMd4VHUEEJ7ysZ7pSSgaEtNvSo+FLurybGJVmiqkQdK50OkSja2bfZXOeyMGRD8Q==", + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", + "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.35" + "@fortawesome/fontawesome-common-types": "^0.2.36" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/react-fontawesome": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.14.tgz", - "integrity": "sha512-4wqNb0gRLVaBm/h+lGe8UfPPivcbuJ6ecI4hIgW0LjI7kzpYB9FkN0L9apbVzg+lsBdcTf0AlBtODjcSX5mmKA==", + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.15.tgz", + "integrity": "sha512-/HFHdcoLESxxMkqZAcZ6RXDJ69pVApwdwRos/B2kiMWxDSAX2dFK8Er2/+rG+RsrzWB/dsAyjefLmemgmfE18g==", "dependencies": { "prop-types": "^15.7.2" }, @@ -1769,6 +2195,45 @@ "@hapi/hoek": "^8.3.0" } }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==" + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1910,6 +2375,28 @@ "node": ">= 10.14.2" } }, + "node_modules/@jest/core/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/core/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -1922,6 +2409,50 @@ "node": ">=8" } }, + "node_modules/@jest/core/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@jest/core/node_modules/jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, "node_modules/@jest/core/node_modules/jest-resolve": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", @@ -1951,6 +2482,18 @@ "node": ">=8" } }, + "node_modules/@jest/core/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/@jest/core/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -2014,6 +2557,17 @@ "node": ">=8" } }, + "node_modules/@jest/core/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/@jest/core/node_modules/type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -2297,6 +2851,48 @@ "node": ">= 10.14.2" } }, + "node_modules/@jest/transform/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@jest/transform/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/@jest/transform/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -2305,6 +2901,17 @@ "node": ">=0.10.0" } }, + "node_modules/@jest/transform/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/@jest/types": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", @@ -2321,11 +2928,11 @@ } }, "node_modules/@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dependencies": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" }, "engines": { @@ -2333,19 +2940,19 @@ } }, "node_modules/@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dependencies": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { @@ -2430,14 +3037,37 @@ } }, "node_modules/@popperjs/core": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.2.tgz", - "integrity": "sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.3.tgz", + "integrity": "sha512-xDu17cEfh7Kid/d95kB6tZsLOmSWKCZKtprnhVepjsSaCij+lM3mItSJDuuHDMbCWTh8Ejmebwb+KONcCJ0eXQ==", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" } }, + "node_modules/@reduxjs/toolkit": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.6.1.tgz", + "integrity": "sha512-pa3nqclCJaZPAyBhruQtiRwtTjottRrVJqziVZcWzI73i6L3miLTtUyWfauwv08HWtiXLx1xGyGt+yLFfW/d0A==", + "dependencies": { + "immer": "^9.0.1", + "redux": "^4.1.0", + "redux-thunk": "^2.3.0", + "reselect": "^4.0.0" + }, + "peerDependencies": { + "react": "^16.14.0 || ^17.0.0", + "react-redux": "^7.2.1" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, "node_modules/@restart/context": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz", @@ -2447,12 +3077,11 @@ } }, "node_modules/@restart/hooks": { - "version": "0.3.26", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.26.tgz", - "integrity": "sha512-7Hwk2ZMYm+JLWcb7R9qIXk1OoUg1Z+saKWqZXlrvFwT3w6UArVNWgxYOzf+PJoK9zZejp8okPAKTctthhXLt5g==", + "version": "0.3.27", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.27.tgz", + "integrity": "sha512-s984xV/EapUIfkjlf8wz9weP2O9TNKR96C68FfMEy2bE69+H4cNv3RD4Mf97lW7Htt7PjZrYTjSC8f3SB9VCXw==", "dependencies": { - "lodash": "^4.17.20", - "lodash-es": "^4.17.20" + "dequal": "^2.0.2" }, "peerDependencies": { "react": ">=16.8.0" @@ -2477,9 +3106,9 @@ } }, "node_modules/@rollup/plugin-replace": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.1.tgz", - "integrity": "sha512-XwC1oK5rrtRJ0tn1ioLHS6OV5JTluJF7QE1J/q1hN3bquwjnVxjtMyY9iCnoyH9DQbf92CxajB3o98wZbP3oAQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", "dependencies": { "@rollup/pluginutils": "^3.1.0", "magic-string": "^0.25.7" @@ -2510,9 +3139,9 @@ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" }, "node_modules/@sinonjs/commons": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.2.tgz", - "integrity": "sha512-sruwd86RJHdsVf/AtBoijDmUqJp3B6hF/DGC23C+JaegnDHaZyewCjoVGTdg3J0uz3Zs7NnIT05OBOmML72lQw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", "dependencies": { "type-detect": "4.0.8" } @@ -2741,15 +3370,18 @@ "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@types/anymatch": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", - "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==" + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "engines": { + "node": ">= 6" + } }, "node_modules/@types/babel__core": { - "version": "7.1.14", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", - "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", + "version": "7.1.15", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.15.tgz", + "integrity": "sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew==", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -2759,34 +3391,34 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", + "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", - "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", "dependencies": { "@babel/types": "^7.3.0" } }, "node_modules/@types/bootstrap": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.0.15.tgz", - "integrity": "sha512-ETmmPf2DvCfNvemlgbX/dCbxVufCU0PrGT0YQ8gjOCgKYR5AfV9lVjBmWdA7L6mJIGvKFFJr0ZmZKP4Dp1k+5g==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.1.0.tgz", + "integrity": "sha512-cR+eQJ/IrgcJZheb7xkKPiPNOa48zkc6fLZ4U9lDNNQp3qiiq3tW1xgrd+VzVJCram/Bnh+DdBsdsPdXKIYClA==", "dependencies": { "@popperjs/core": "^2.9.2", "@types/jquery": "*" @@ -2798,49 +3430,49 @@ "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==" }, "node_modules/@types/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-NaIeSIBiFgSC6IGUBjZWcscUJEq7vpVu7KthHN8eieTV9d9MqkSOZLH4chq1PmcKy06PNe3axLeKmRIyxJ+PZQ==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-2.0.1.tgz", + "integrity": "sha512-6K8LaFlztlhZO7mwsZg7ClRsdLg3FJRzIIi6SZXDWmmSJc2x8dd2VkESbLXdk3p8cuvz71f36S0y8Zv2AxqvQw==" }, "node_modules/@types/d3-scale": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-3.2.2.tgz", - "integrity": "sha512-qpQe8G02tzUwt9sdWX1h8A/W0Q1+N48wMnYXVOkrzeLUkCfvzJYV9Ee3aORCS4dN4ONRLFmMvaXdziQ29XGLjQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-3.3.2.tgz", + "integrity": "sha512-gGqr7x1ost9px3FvIfUMi5XA/F/yAf4UkUDtdQhpH92XCT0Oa7zkkRzY61gPVJq+DxpHn/btouw5ohWkbBsCzQ==", "dependencies": { - "@types/d3-time": "*" + "@types/d3-time": "^2" } }, "node_modules/@types/d3-shape": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-2.0.0.tgz", - "integrity": "sha512-NLzD02m5PiD1KLEDjLN+MtqEcFYn4ZL9+Rqc9ZwARK1cpKZXd91zBETbe6wpBB6Ia0D0VZbpmbW3+BsGPGnCpA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-2.1.3.tgz", + "integrity": "sha512-HAhCel3wP93kh4/rq+7atLdybcESZ5bRHDEZUojClyZWsRuEMo3A52NGYJSh48SxfxEU6RZIVbZL2YFZ2OAlzQ==", "dependencies": { - "@types/d3-path": "^1" + "@types/d3-path": "^2" } }, "node_modules/@types/d3-time": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-2.0.0.tgz", - "integrity": "sha512-Abz8bTzy8UWDeYs9pCa3D37i29EWDjNTjemdk0ei1ApYVNqulYlGUKip/jLOpogkPSsPz/GvZCYiC7MFlEk0iQ==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-2.1.1.tgz", + "integrity": "sha512-9MVYlmIgmRR31C5b4FVSWtuMmBHh2mOWQYfl7XAYOa8dsnb7iEmUmRSWSFgXFtkjxO65d7hTUHQC+RhR/9IWFg==" }, "node_modules/@types/eslint": { - "version": "7.2.7", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.7.tgz", - "integrity": "sha512-EHXbc1z2GoQRqHaAT7+grxlTJ3WE2YNeD6jlpPoRc83cCoThRY+NUWjCUZaYmk51OICkPXn2hhphcWcWXgNW0Q==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", + "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "node_modules/@types/estree": { - "version": "0.0.46", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", - "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==" + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==" }, "node_modules/@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", "dependencies": { "@types/minimatch": "*", "@types/node": "*" @@ -2855,9 +3487,9 @@ } }, "node_modules/@types/history": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.8.tgz", - "integrity": "sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA==" + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.9.tgz", + "integrity": "sha512-MUc6zSmU3tEVnkQ78q0peeEjKWPUADMlC/t++2bI8WnAG2tvYRPIgHG8lWkXwqc8MsUF6Z2MOf+Mh5sazOmhiQ==" }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.1", @@ -2869,9 +3501,9 @@ } }, "node_modules/@types/html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", + "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==" }, "node_modules/@types/invariant": { "version": "2.2.34", @@ -2892,50 +3524,54 @@ } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dependencies": { "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/jest": { + "version": "26.0.24", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", + "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", + "dependencies": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, "node_modules/@types/jquery": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.5.tgz", - "integrity": "sha512-6RXU9Xzpc6vxNrS6FPPapN1SxSHgQ336WC6Jj/N8q30OiaBZ00l1GBgeP7usjVZPivSkGUfL1z/WW6TX989M+w==", + "version": "3.5.6", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.6.tgz", + "integrity": "sha512-SmgCQRzGPId4MZQKDj9Hqc6kSXFNWZFHpELkyK8AQhf8Zr6HKfCzFv9ZC1Fv3FyQttJZOlap3qYb12h61iZAIg==", "dependencies": { "@types/sizzle": "*" } }, "node_modules/@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" }, "node_modules/@types/lodash": { - "version": "4.14.168", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", - "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==" + "version": "4.14.172", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.172.tgz", + "integrity": "sha512-/BHF5HAx3em7/KkzVKm3LrsD6HZAXuXO1AJZQ3cRRBZj4oHZDviWPYu0aEplAqDFNHZPW6d3G7KN+ONcCCC7pw==" }, "node_modules/@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" }, "node_modules/@types/node": { - "version": "15.12.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.5.tgz", - "integrity": "sha512-se3yX7UHv5Bscf8f1ERKvQOD6sTyycH3hdaoozvaLxgUiY5lIGEeH37AD0G0Qi9kPqihPn0HOfd2yaIEN9VwEg==" + "version": "15.14.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.14.7.tgz", + "integrity": "sha512-FA45p37/mLhpebgbPWWCKfOisTjxGK9lwcHlJ6XVLfu3NgfcazOJHdYUZCWPMK8QX4LhNZdmfo6iMz9FqpUbaw==" }, "node_modules/@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==" + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -2943,24 +3579,24 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "node_modules/@types/prettier": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", - "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.2.tgz", + "integrity": "sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==" }, "node_modules/@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" + "version": "15.7.4", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", + "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" }, "node_modules/@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" }, "node_modules/@types/react": { - "version": "16.14.5", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.5.tgz", - "integrity": "sha512-YRRv9DNZhaVTVRh9Wmmit7Y0UFhEVqXqCSw3uazRWMxa2x85hWQZ5BN24i7GXZbaclaLXEcodEeIHsjBA8eAMw==", + "version": "16.14.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.12.tgz", + "integrity": "sha512-7nOJgNsRbARhZhvwPm7cnzahtzEi5VJ9OvcQk8ExEEb1t+zaFklwLVkJz7G1kfxX4X/mDa/icTmzE0vTmqsqBg==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -2976,9 +3612,9 @@ } }, "node_modules/@types/react-helmet": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.1.tgz", - "integrity": "sha512-VmSCMz6jp/06DABoY60vQa++h1YFt0PfAI23llxBJHbowqFgLUL0dhS1AQeVPNqYfRp9LAfokrfWACTNeobOrg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.2.tgz", + "integrity": "sha512-dcfAZNlWb5JYFbO9CGfrPWLJAyFcT6UeR3u35eBbv8liY2Rg4K7fM1G5+HnwVgot+C+kVwXAZ8pLEn2jsMfTDg==", "dependencies": { "@types/react": "*" } @@ -2995,18 +3631,18 @@ } }, "node_modules/@types/react-router": { - "version": "5.1.12", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.12.tgz", - "integrity": "sha512-0bhXQwHYfMeJlCh7mGhc0VJTRm0Gk+Z8T00aiP4702mDUuLs9SMhnd2DitpjWFjdOecx2UXtICK14H9iMnziGA==", + "version": "5.1.16", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.16.tgz", + "integrity": "sha512-8d7nR/fNSqlTFGHti0R3F9WwIertOaaA1UEB8/jr5l5mDMOs4CidEgvvYMw4ivqrBK+vtVLxyTj2P+Pr/dtgzg==", "dependencies": { "@types/history": "*", "@types/react": "*" } }, "node_modules/@types/react-router-dom": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.7.tgz", - "integrity": "sha512-D5mHD6TbdV/DNHYsnwBTv+y73ei+mMjrkGrla86HthE4/PVvL1J94Bu3qABU+COXzpL23T1EZapVVpwHuBXiUg==", + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.8.tgz", + "integrity": "sha512-03xHyncBzG0PmDmf8pf3rehtjY0NpUj7TIN46FrT5n1ZWHPZvXz32gUyNboJ+xsL8cpg8bQVLcllptcQHvocrw==", "dependencies": { "@types/history": "*", "@types/react": "*", @@ -3014,9 +3650,9 @@ } }, "node_modules/@types/react-select": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@types/react-select/-/react-select-4.0.15.tgz", - "integrity": "sha512-GPyBFYGMVFCtF4eg9riodEco+s2mflR10Nd5csx69+bcdvX6Uo9H/jgrIqovBU9yxBppB9DS66OwD6xxgVqOYQ==", + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@types/react-select/-/react-select-4.0.17.tgz", + "integrity": "sha512-ZK5wcBhJaqC8ntQl0CJvK2KXNNsk1k5flM7jO+vNPPlceRzdJQazA6zTtQUyNr6exp5yrAiwiudtYxgGlgGHLg==", "dependencies": { "@emotion/serialize": "^1.0.0", "@types/react": "*", @@ -3025,57 +3661,25 @@ } }, "node_modules/@types/react-table": { - "version": "7.0.29", - "resolved": "https://registry.npmjs.org/@types/react-table/-/react-table-7.0.29.tgz", - "integrity": "sha512-RCGVKGlTDv3jbj37WJ5HhN3sPb0W/2rqlvyGUtvawnnyrxgI2BGgASvU93rq2jwanVp5J9l1NYAeiGlNhdaBGw==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@types/react-table/-/react-table-7.7.2.tgz", + "integrity": "sha512-NwB78t3YV5pZ1NK3m2vylb/d0DKVyWH4y4GMCtlE4tg2n5ENM4ejzKnT46YKuqG2cPjWc+PIxuRVMd5OYX1z4A==", "dependencies": { "@types/react": "*" } }, "node_modules/@types/react-transition-group": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.1.tgz", - "integrity": "sha512-vIo69qKKcYoJ8wKCJjwSgCTM+z3chw3g18dkrDfVX665tMH7tmbDxEAnPdey4gTlwZz5QuHGzd+hul0OVZDqqQ==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-KibDWL6nshuOJ0fu8ll7QnV/LVTo3PzQ9aCPnRUYPfX7eZohHwLIdNHj7pftanREzHNP4/nJa8oeM73uSiavMQ==", "dependencies": { "@types/react": "*" } }, - "node_modules/@types/redux-actions": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@types/redux-actions/-/redux-actions-2.6.1.tgz", - "integrity": "sha512-zKgK+ATp3sswXs6sOYo1tk8xdXTy4CTaeeYrVQlClCjeOpag5vzPo0ASWiiBJ7vsiQRAdb3VkuFLnDoBimF67g==" - }, - "node_modules/@types/redux-logger": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/redux-logger/-/redux-logger-3.0.8.tgz", - "integrity": "sha512-zM+cxiSw6nZtRbxpVp9SE3x/X77Z7e7YAfHD1NkxJyJbAGSXJGF0E9aqajZfPOa/sTYnuwutmlCldveExuCeLw==", - "dependencies": { - "redux": "^4.0.0" - } - }, - "node_modules/@types/redux-promise": { - "version": "0.5.29", - "resolved": "https://registry.npmjs.org/@types/redux-promise/-/redux-promise-0.5.29.tgz", - "integrity": "sha512-lCBCTiJCweYtW5YgOIAG400dAi2Cr2IW6mfh1eZ8WqgxTRqPZjLAFQzxQ6oRZaB9g8mdzr28vOc3CAo8y/Na2w==", - "dependencies": { - "redux": "^3.6.0" - } - }, - "node_modules/@types/redux-promise/node_modules/redux": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", - "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", - "dependencies": { - "lodash": "^4.2.1", - "lodash-es": "^4.2.1", - "loose-envify": "^1.1.0", - "symbol-observable": "^1.0.3" - } - }, "node_modules/@types/resize-observer-browser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.5.tgz", - "integrity": "sha512-8k/67Z95Goa6Lznuykxkfhq9YU3l1Qe6LNZmwde1u7802a3x8v44oq0j91DICclxatTr0rNnhXx7+VTIetSrSQ==" + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.6.tgz", + "integrity": "sha512-61IfTac0s9jvNtBCpyo86QeaN8qqpMGHdK0uGKCCIy2dt5/Yk84VduHIdWAcmkC5QvdkPL0p5eWYgUZtHKKUVg==" }, "node_modules/@types/resolve": { "version": "0.0.8", @@ -3086,14 +3690,14 @@ } }, "node_modules/@types/scheduler": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", - "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, "node_modules/@types/sizzle": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz", - "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==" + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==" }, "node_modules/@types/source-list-map": { "version": "0.1.2", @@ -3101,19 +3705,19 @@ "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" }, "node_modules/@types/stack-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" }, "node_modules/@types/tapable": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz", - "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==" + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", + "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==" }, "node_modules/@types/uglify-js": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.0.tgz", - "integrity": "sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", + "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", "dependencies": { "source-map": "^0.6.1" } @@ -3132,22 +3736,22 @@ "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=" }, "node_modules/@types/webpack": { - "version": "4.41.26", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.26.tgz", - "integrity": "sha512-7ZyTfxjCRwexh+EJFwRUM+CDB2XvgHl4vfuqf1ZKrgGvcS5BrNvPQqJh3tsZ0P6h6Aa1qClVHaJZszLPzpqHeA==", + "version": "4.41.30", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.30.tgz", + "integrity": "sha512-GUHyY+pfuQ6haAfzu4S14F+R5iGRwN6b2FRNJY7U0NilmFAqbsOfK6j1HwuLBAqwRIT+pVdNDJGJ6e8rpp0KHA==", "dependencies": { - "@types/anymatch": "*", "@types/node": "*", - "@types/tapable": "*", + "@types/tapable": "^1", "@types/uglify-js": "*", "@types/webpack-sources": "*", + "anymatch": "^3.0.0", "source-map": "^0.6.0" } }, "node_modules/@types/webpack-sources": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", - "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", "dependencies": { "@types/node": "*", "@types/source-list-map": "*", @@ -3171,31 +3775,30 @@ } }, "node_modules/@types/yargs": { - "version": "15.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==" + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.18.0.tgz", - "integrity": "sha512-Lzkc/2+7EoH7+NjIWLS2lVuKKqbEmJhtXe3rmfA8cyiKnZm3IfLf51irnBcmow8Q/AptVV0XBZmBJKuUJTe6cQ==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.1.tgz", + "integrity": "sha512-AHqIU+SqZZgBEiWOrtN94ldR3ZUABV5dUG94j8Nms9rQnHFc8fvDOue/58K4CFz6r8OtDDc35Pw9NQPWo0Ayrw==", "dependencies": { - "@typescript-eslint/experimental-utils": "4.18.0", - "@typescript-eslint/scope-manager": "4.18.0", - "debug": "^4.1.1", + "@typescript-eslint/experimental-utils": "4.29.1", + "@typescript-eslint/scope-manager": "4.29.1", + "debug": "^4.3.1", "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { "node": "^10.12.0 || >=12.0.0" @@ -3214,17 +3817,52 @@ } } }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.18.0.tgz", - "integrity": "sha512-92h723Kblt9JcT2RRY3QS2xefFKar4ZQFVs3GityOKWQYgtajxt/tuXIzL7sVCUlM1hgreiV5gkGYyBpdOwO6A==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.18.0", - "@typescript-eslint/types": "4.18.0", - "@typescript-eslint/typescript-estree": "4.18.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.1.tgz", + "integrity": "sha512-kl6QG6qpzZthfd2bzPNSJB2YcZpNOrP6r9jueXupcZHnL74WiuSjaft7WSu17J9+ae9zTlk0KJMXPUj0daBxMw==", + "dependencies": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.29.1", + "@typescript-eslint/types": "4.29.1", + "@typescript-eslint/typescript-estree": "4.29.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" }, "engines": { "node": "^10.12.0 || >=12.0.0" @@ -3238,14 +3876,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.18.0.tgz", - "integrity": "sha512-W3z5S0ZbecwX3PhJEAnq4mnjK5JJXvXUDBYIYGoweCyWyuvAKfGHvzmpUzgB5L4cRBb+cTu9U/ro66dx7dIimA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.29.1.tgz", + "integrity": "sha512-3fL5iN20hzX3Q4OkG7QEPFjZV2qsVGiDhEwwh+EkmE/w7oteiOvUNzmpu5eSwGJX/anCryONltJ3WDmAzAoCMg==", "dependencies": { - "@typescript-eslint/scope-manager": "4.18.0", - "@typescript-eslint/types": "4.18.0", - "@typescript-eslint/typescript-estree": "4.18.0", - "debug": "^4.1.1" + "@typescript-eslint/scope-manager": "4.29.1", + "@typescript-eslint/types": "4.29.1", + "@typescript-eslint/typescript-estree": "4.29.1", + "debug": "^4.3.1" }, "engines": { "node": "^10.12.0 || >=12.0.0" @@ -3263,13 +3901,34 @@ } } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.18.0.tgz", - "integrity": "sha512-olX4yN6rvHR2eyFOcb6E4vmhDPsfdMyfQ3qR+oQNkAv8emKKlfxTWUXU5Mqxs2Fwe3Pf1BoPvrwZtwngxDzYzQ==", + "node_modules/@typescript-eslint/parser/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dependencies": { - "@typescript-eslint/types": "4.18.0", - "@typescript-eslint/visitor-keys": "4.18.0" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.1.tgz", + "integrity": "sha512-Hzv/uZOa9zrD/W5mftZa54Jd5Fed3tL6b4HeaOpwVSabJK8CJ+2MkDasnX/XK4rqP5ZTWngK1ZDeCi6EnxPQ7A==", + "dependencies": { + "@typescript-eslint/types": "4.29.1", + "@typescript-eslint/visitor-keys": "4.29.1" }, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" @@ -3280,9 +3939,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.18.0.tgz", - "integrity": "sha512-/BRociARpj5E+9yQ7cwCF/SNOWwXJ3qhjurMuK2hIFUbr9vTuDeu476Zpu+ptxY2kSxUHDGLLKy+qGq2sOg37A==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.1.tgz", + "integrity": "sha512-Jj2yu78IRfw4nlaLtKjVaGaxh/6FhofmQ/j8v3NXmAiKafbIqtAPnKYrf0sbGjKdj0hS316J8WhnGnErbJ4RCA==", "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, @@ -3292,17 +3951,17 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.18.0.tgz", - "integrity": "sha512-wt4xvF6vvJI7epz+rEqxmoNQ4ZADArGQO9gDU+cM0U5fdVv7N+IAuVoVAoZSOZxzGHBfvE3XQMLdy+scsqFfeg==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.1.tgz", + "integrity": "sha512-lIkkrR9E4lwZkzPiRDNq0xdC3f2iVCUjw/7WPJ4S2Sl6C3nRWkeE1YXCQ0+KsiaQRbpY16jNaokdWnm9aUIsfw==", "dependencies": { - "@typescript-eslint/types": "4.18.0", - "@typescript-eslint/visitor-keys": "4.18.0", - "debug": "^4.1.1", - "globby": "^11.0.1", + "@typescript-eslint/types": "4.29.1", + "@typescript-eslint/visitor-keys": "4.29.1", + "debug": "^4.3.1", + "globby": "^11.0.3", "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "semver": "^7.3.5", + "tsutils": "^3.21.0" }, "engines": { "node": "^10.12.0 || >=12.0.0" @@ -3317,12 +3976,47 @@ } } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.18.0.tgz", - "integrity": "sha512-Q9t90JCvfYaN0OfFUgaLqByOfz8yPeTAdotn/XYNm5q9eHax90gzdb+RJ6E9T5s97Kv/UHWKERTmqA0jTKAEHw==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dependencies": { - "@typescript-eslint/types": "4.18.0", + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.1.tgz", + "integrity": "sha512-zLqtjMoXvgdZY/PG6gqA73V8BjqPs4af1v2kiiETBObp+uC6gRYnJLmJHxC0QyUrrHDLJPIWNYxoBV3wbcRlag==", + "dependencies": { + "@typescript-eslint/types": "4.29.1", "eslint-visitor-keys": "^2.0.0" }, "engines": { @@ -3538,9 +4232,9 @@ } }, "node_modules/acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -3573,6 +4267,38 @@ "node": ">=8.9" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -3630,11 +4356,11 @@ } }, "node_modules/ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dependencies": { - "type-fest": "^0.11.0" + "type-fest": "^0.21.3" }, "engines": { "node": ">=8" @@ -3677,9 +4403,9 @@ } }, "node_modules/anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -3844,14 +4570,6 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, "node_modules/asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -3877,14 +4595,6 @@ "util": "0.10.3" } }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "engines": { - "node": ">=0.8" - } - }, "node_modules/assert/node_modules/inherits": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", @@ -3982,23 +4692,10 @@ "url": "https://tidelift.com/funding/github/npm/autoprefixer" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, "node_modules/axe-core": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.1.3.tgz", - "integrity": "sha512-vwPpH4Aj4122EW38mxO/fxhGKtwWTMLDIJfZ1He0Edbtjcfna/R3YB67yVhezUMzqc3Jr3+Ii50KRntlENL4xQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.2.tgz", + "integrity": "sha512-5LMaDRWm8ZFPAEdzTYmgjjEdj1YnQcpfrVajO/sn/LhbpGp0Y0H64c2hLZI1gRMxfA+w1S71Uc/nHaOXgcCvGg==", "engines": { "node": ">=4" } @@ -4190,12 +4887,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz", - "integrity": "sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", "dependencies": { - "@babel/compat-data": "^7.13.0", - "@babel/helper-define-polyfill-provider": "^0.1.5", + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", "semver": "^6.1.1" }, "peerDependencies": { @@ -4211,23 +4908,23 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz", - "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz", + "integrity": "sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.1.5", - "core-js-compat": "^3.8.1" + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.14.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz", - "integrity": "sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.1.5" + "@babel/helper-define-polyfill-provider": "^0.2.2" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -4311,6 +5008,36 @@ "babel-plugin-transform-react-remove-prop-types": "0.4.24" } }, + "node_modules/babel-preset-react-app/node_modules/@babel/core": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-class-properties": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", @@ -4465,22 +5192,28 @@ } }, "node_modules/babel-preset-react-app/node_modules/@babel/preset-react/node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.13.tgz", - "integrity": "sha512-FXYw98TTJ125GVCCkFLZXlZ1qGcsYqNQhVBQcZjyrwf8FEUtVfKIoidnO8S0q+KBQpDYNTmiGo1gn67Vti04lQ==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.14.9.tgz", + "integrity": "sha512-Fqqu0f8zv9W+RyOnx29BX/RlEsBRANbOf5xs5oxb2aHP4FKbLXxIaVPUiCti56LAR1IixMH4EyaixhUsKqoBHw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-preset-react-app/node_modules/@babel/preset-react/node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.13.tgz", - "integrity": "sha512-O5JJi6fyfih0WfDgIJXksSPhGP/G0fQpfxYy87sDc+1sFmsCS6wr3aAn+whbzkhbjtq4VMqLRaSzR6IsshIC0Q==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.14.5.tgz", + "integrity": "sha512-1TpSDnD9XR/rQ2tzunBVPThF5poaYT9GqP+of8fAtguYuI/dm2RkrMBDemsxtY0XBzvW7nXjYM0hRyKX9QYj7Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -4494,6 +5227,27 @@ "regenerator-runtime": "^0.13.4" } }, + "node_modules/babel-preset-react-app/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/babel-preset-react-app/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/babel-preset-react-app/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -4515,7 +5269,7 @@ "version": "2.6.12", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3 is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js@3.", + "deprecated": "core-js@<3.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", "hasInstallScript": true }, "node_modules/babel-runtime/node_modules/regenerator-runtime": { @@ -4537,9 +5291,9 @@ "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" }, "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base": { "version": "0.11.2", @@ -4601,14 +5355,6 @@ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/bfj": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", @@ -4686,27 +5432,6 @@ "node": ">= 0.8" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "engines": { - "node": ">=0.6" - } - }, "node_modules/bonjour": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", @@ -4748,14 +5473,42 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dependencies": { - "fill-range": "^7.0.1" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" + } + }, + "node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/braces/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" } }, "node_modules/brorand": { @@ -4827,6 +5580,19 @@ "safe-buffer": "^5.2.0" } }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/browserify-sign/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -4855,15 +5621,15 @@ } }, "node_modules/browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "version": "4.16.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.7.tgz", + "integrity": "sha512-7I4qVwqZltJ7j37wObBe3SoTz+nS8APaNcrBOlgoirb6/HbEU2XxW/LpUDTCngM6iauwFqmRTuOMfyKnFGY5JA==", "dependencies": { - "caniuse-lite": "^1.0.30001181", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.649", + "caniuse-lite": "^1.0.30001248", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.793", "escalade": "^3.1.1", - "node-releases": "^1.1.70" + "node-releases": "^1.1.73" }, "bin": { "browserslist": "cli.js" @@ -4895,9 +5661,9 @@ } }, "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/buffer-indexof": { "version": "1.1.1", @@ -4939,9 +5705,9 @@ } }, "node_modules/cacache": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", - "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", + "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==", "dependencies": { "@npmcli/move-file": "^1.0.1", "chownr": "^2.0.0", @@ -4957,7 +5723,7 @@ "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", - "ssri": "^8.0.0", + "ssri": "^8.0.1", "tar": "^6.0.2", "unique-filename": "^1.1.1" }, @@ -5077,9 +5843,13 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001203", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001203.tgz", - "integrity": "sha512-/I9tvnzU/PHMH7wBPrfDMSuecDeUKerjCPX7D0xBbaJZPxoT9m+yYxt0zCTkcijCkjTdim3H56Zm0i5Adxch4w==" + "version": "1.0.30001249", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001249.tgz", + "integrity": "sha512-vcX4U8lwVXPdqzPWi6cAJ3FnQaqXbBqy/GZseKNQzRj37J7qZdGcBtxq/QLFNLLlfsoXLUdHw8Iwenri86Tagw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } }, "node_modules/capture-exit": { "version": "2.0.0", @@ -5100,15 +5870,10 @@ "node": ">=4" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, "node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5134,23 +5899,64 @@ "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==" }, "node_modules/chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", "dependencies": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "glob-parent": "~5.1.0", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { - "fsevents": "~2.3.1" + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/chokidar/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, "node_modules/chownr": { @@ -5162,21 +5968,13 @@ } }, "node_modules/chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dependencies": { - "tslib": "^1.9.0" - }, + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "engines": { "node": ">=6.0" } }, - "node_modules/chrome-trace-event/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -5432,12 +6230,12 @@ } }, "node_modules/color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", - "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "dependencies": { - "color-convert": "^1.9.1", - "color-string": "^1.5.4" + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, "node_modules/color-convert": { @@ -5457,9 +6255,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", + "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -5562,19 +6360,6 @@ "node": ">= 0.8.0" } }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -5594,33 +6379,6 @@ "typedarray": "^0.0.6" } }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "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" - } - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/confusing-browser-globals": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", @@ -5644,14 +6402,6 @@ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" }, - "node_modules/contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", @@ -5672,9 +6422,9 @@ } }, "node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "dependencies": { "safe-buffer": "~5.1.1" } @@ -5725,9 +6475,9 @@ } }, "node_modules/core-js": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.9.1.tgz", - "integrity": "sha512-gSjRvzkxQc1zjM/5paAmL4idJBFzuJoo+jDjF1tStYFMV2ERfD02HhahhCGXUyHxQRG4yFKVSdO6g62eoRMcDg==", + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.16.1.tgz", + "integrity": "sha512-AAkP8i35EbefU+JddyWi12AWE9f2N/qr/pwnDtWz4nyUIBGMJPX99ANFFRSw6FefM374lDujdtLDyhN2A/btHw==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -5735,11 +6485,11 @@ } }, "node_modules/core-js-compat": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.9.1.tgz", - "integrity": "sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA==", + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.16.1.tgz", + "integrity": "sha512-NHXQXvRbd4nxp9TEmooTJLUf94ySUG6+DSsscBpTftN1lQLQ4LjnWvc7AoIo4UjDsFF3hB8Uh5LLCRRdaiT5MQ==", "dependencies": { - "browserslist": "^4.16.3", + "browserslist": "^4.16.7", "semver": "7.0.0" }, "funding": { @@ -5756,9 +6506,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.9.1.tgz", - "integrity": "sha512-laz3Zx0avrw9a4QEIdmIblnVuJz8W51leY9iLThatCsFawWxC3sE4guASC78JbCin+DkwMpCdp1AVAuzL/GN7A==", + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.16.1.tgz", + "integrity": "sha512-TyofCdMzx0KMhi84mVRS8rL1XsRk2SPUNz2azmth53iRN0/08Uim9fdhQTaZTG1LqaXHYVci4RDHka6WrXfnvg==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -5994,14 +6744,18 @@ } }, "node_modules/css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", "dependencies": { "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, "node_modules/css-select-base-adapter": { @@ -6035,9 +6789,9 @@ "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==" }, "node_modules/css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", "engines": { "node": ">= 6" }, @@ -6070,12 +6824,12 @@ } }, "node_modules/cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", "dependencies": { "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", + "cssnano-preset-default": "^4.0.8", "is-resolvable": "^1.0.0", "postcss": "^7.0.0" }, @@ -6084,9 +6838,9 @@ } }, "node_modules/cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", "dependencies": { "css-declaration-sorter": "^4.0.1", "cssnano-util-raw-cache": "^4.0.1", @@ -6116,7 +6870,7 @@ "postcss-ordered-values": "^4.1.2", "postcss-reduce-initial": "^4.0.3", "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", + "postcss-svgo": "^4.0.3", "postcss-unique-selectors": "^4.0.1" }, "engines": { @@ -6216,9 +6970,9 @@ } }, "node_modules/csso/node_modules/css-tree": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", - "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" @@ -6262,9 +7016,9 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" }, "node_modules/csstype": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.7.tgz", - "integrity": "sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g==" + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" }, "node_modules/cyclist": { "version": "1.0.1", @@ -6281,9 +7035,9 @@ } }, "node_modules/d3-array": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.0.tgz", - "integrity": "sha512-T6H/qNldyD/1OlRkJbonb3u3MPhNwju8OPxYv0YSjDb/B2RUeeBEHzIpNrYiinwpmz8+am+puMrpcrDWgY9wRg==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", "dependencies": { "internmap": "^1.0.0" } @@ -6312,14 +7066,14 @@ "integrity": "sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA==" }, "node_modules/d3-scale": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", - "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.3.0.tgz", + "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", "dependencies": { "d3-array": "^2.3.0", "d3-format": "1 - 2", "d3-interpolate": "1.2.0 - 2", - "d3-time": "1 - 2", + "d3-time": "^2.1.1", "d3-time-format": "2 - 3" } }, @@ -6332,9 +7086,12 @@ } }, "node_modules/d3-time": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.0.0.tgz", - "integrity": "sha512-2mvhstTFcMvwStWd9Tj3e6CEqtOivtD8AUiHT8ido/xmzrI9ijrUUihZ6nHuf/vsScRBonagOdj0Vv+SEL5G3Q==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz", + "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", + "dependencies": { + "d3-array": "2" + } }, "node_modules/d3-time-format": { "version": "3.0.0", @@ -6345,20 +7102,9 @@ } }, "node_modules/damerau-levenshtein": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", - "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==" - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", + "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==" }, "node_modules/data-urls": { "version": "2.0.0", @@ -6374,19 +7120,11 @@ } }, "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "ms": "2.0.0" } }, "node_modules/decamelize": { @@ -6398,9 +7136,9 @@ } }, "node_modules/decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==" + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" }, "node_modules/decimal.js-light": { "version": "2.5.1", @@ -6420,11 +7158,6 @@ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" }, - "node_modules/deep-diff": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz", - "integrity": "sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ=" - }, "node_modules/deep-equal": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", @@ -6683,6 +7416,14 @@ "node": ">= 0.6" } }, + "node_modules/dequal": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", + "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==", + "engines": { + "node": ">=6" + } + }, "node_modules/des.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", @@ -6706,9 +7447,9 @@ } }, "node_modules/detect-node": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.5.tgz", - "integrity": "sha512-qi86tE6hRcFHy8jI1m2VG+LaPUR1LhqDa5G8tVjuUXmOrpuAgqsA1pN0+ldgr3aKUH+QLI9hCY/OcRYisERejw==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, "node_modules/detect-port-alt": { "version": "1.1.6", @@ -6726,19 +7467,6 @@ "node": ">= 4.2.1" } }, - "node_modules/detect-port-alt/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/detect-port-alt/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "node_modules/diff-sequences": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", @@ -6779,9 +7507,9 @@ "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" }, "node_modules/dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", "dependencies": { "ip": "^1.1.0", "safe-buffer": "^5.0.1" @@ -6807,9 +7535,9 @@ } }, "node_modules/dom-align": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.0.tgz", - "integrity": "sha512-YkoezQuhp3SLFGdOlr5xkqZ640iXrnHAwVYcDg8ZKRUtO7mSzSC2BA5V0VuyAwPSJA4CLIc6EDDJh4bEsD2+zA==" + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.2.tgz", + "integrity": "sha512-pHuazgqrsTFrGU2WLDdXxCFabkdQDx72ddkraZNih1KsMcN5qsRSTR9O4VJRlwTPCPb5COYg3LOfiMHHcPInHg==" }, "node_modules/dom-converter": { "version": "0.2.0", @@ -6829,25 +7557,18 @@ } }, "node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "dependencies": { "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", - "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, "node_modules/domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", @@ -6858,9 +7579,15 @@ } }, "node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] }, "node_modules/domexception": { "version": "2.0.1", @@ -6882,20 +7609,30 @@ } }, "node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", "dependencies": { - "domelementtype": "1" + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, "node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, "node_modules/dot-case": { @@ -6955,42 +7692,6 @@ "stream-shift": "^1.0.0" } }, - "node_modules/duplexify/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/duplexify/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "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" - } - }, - "node_modules/duplexify/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -7006,9 +7707,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.3.693", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.693.tgz", - "integrity": "sha512-vUdsE8yyeu30RecppQtI+XTz2++LWLVEIYmzeCaCRLSdtKZ2eXqdJcrs85KwLiPOPVc6PELgWyXBsfqIvzGZag==" + "version": "1.3.799", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.799.tgz", + "integrity": "sha512-V2rbYWdGvSqrg+95KjkVuSi41bGfrhrOzjl1tSi2VLnm0mRe3FsSvhiqidSiSll9WiMhrQAhpDcW/wcqK3c+Yw==" }, "node_modules/elliptic": { "version": "6.5.4", @@ -7085,6 +7786,27 @@ "yeast": "0.1.2" } }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io-client/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/engine.io-parser": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", @@ -7109,11 +7831,6 @@ "node": ">=6.9.0" } }, - "node_modules/enhanced-resolve/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "node_modules/enhanced-resolve/node_modules/memory-fs": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", @@ -7126,28 +7843,6 @@ "node": ">=4.3.0 <5.0.0 || >=5.10" } }, - "node_modules/enhanced-resolve/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "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" - } - }, - "node_modules/enhanced-resolve/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", @@ -7195,9 +7890,9 @@ } }, "node_modules/es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "version": "1.18.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz", + "integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==", "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", @@ -7205,16 +7900,17 @@ "get-intrinsic": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", "is-callable": "^1.2.3", "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", - "object-inspect": "^1.9.0", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.11.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" + "unbox-primitive": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -7282,11 +7978,14 @@ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/escodegen": { @@ -7375,27 +8074,30 @@ } }, "node_modules/eslint": { - "version": "7.22.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.22.0.tgz", - "integrity": "sha512-3VawOtjSJUQiiqac8MQc+w457iGLfuNGLFn8JmF051tTKbh5/x/0vlcEj8OgDCaw7Ysa2Jn8paGshV7x2abKXg==", + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dependencies": { "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.0", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", "eslint-scope": "^5.1.1", "eslint-utils": "^2.1.0", "eslint-visitor-keys": "^2.0.0", "espree": "^7.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", + "glob-parent": "^5.1.2", "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", @@ -7404,7 +8106,7 @@ "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.21", + "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", @@ -7413,7 +8115,7 @@ "semver": "^7.2.1", "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", - "table": "^6.0.4", + "table": "^6.0.9", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, @@ -7460,33 +8162,45 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.5.tgz", + "integrity": "sha512-XMoPKjSpXbkeJ7ZZ9icLnJMTY5Mc1kZbCakHquaFsXPpyWOwK0TK6CODO+0ca54UoM9LKOxyUNnoVZRl8TeaAg==", "dependencies": { - "debug": "^2.6.9", - "resolve": "^1.13.1" + "debug": "^3.2.7", + "resolve": "^1.20.0" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "node_modules/eslint-import-resolver-node/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz", + "integrity": "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==", "dependencies": { - "debug": "^2.6.9", + "debug": "^3.2.7", "pkg-dir": "^2.0.0" }, "engines": { @@ -7494,11 +8208,11 @@ } }, "node_modules/eslint-module-utils/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "node_modules/eslint-module-utils/node_modules/find-up": { @@ -7525,9 +8239,9 @@ } }, "node_modules/eslint-module-utils/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/eslint-module-utils/node_modules/p-limit": { "version": "1.3.0", @@ -7579,9 +8293,9 @@ } }, "node_modules/eslint-plugin-flowtype": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.4.0.tgz", - "integrity": "sha512-O0s0iTT5UxYuoOpHMLSIO2qZMyvrb9shhk1EM5INNGtJ2CffrfUmsnh6TVsnoT41fkXIEndP630WNovhoO87xQ==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.9.0.tgz", + "integrity": "sha512-aBUVPA5Wt0XyuV3Wg8flfVqYJR6yR2nRLuyPwoTjCg5VTk4G1X1zQpInr39tUGgRxqrA+d+B9GYK4+/d1i0Rfw==", "dependencies": { "lodash": "^4.17.15", "string-natural-compare": "^3.0.1" @@ -7594,22 +8308,24 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", - "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.0.tgz", + "integrity": "sha512-Kc6xqT9hiYi2cgybOc0I2vC9OgAYga5o/rAFinam/yF/t5uBqxQbauNPMC6fgb640T/89P0gFoO27FOilJ/Cqg==", "dependencies": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", - "contains-path": "^0.1.0", + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.0", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.5", + "eslint-module-utils": "^2.6.2", + "find-up": "^2.0.0", "has": "^1.0.3", + "is-core-module": "^2.4.0", "minimatch": "^3.0.4", - "object.values": "^1.1.1", - "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", + "object.values": "^1.1.3", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", "tsconfig-paths": "^3.9.0" }, "engines": { @@ -7619,40 +8335,94 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dependencies": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "esutils": "^2.0.2" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "node_modules/eslint-plugin-import/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/eslint-plugin-import/node_modules/ms": { + "node_modules/eslint-plugin-import/node_modules/locate-path": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/eslint-plugin-jest": { - "version": "24.3.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.3.2.tgz", - "integrity": "sha512-cicWDr+RvTAOKS3Q/k03+Z3odt3VCiWamNUHWd6QWbVQWcYJyYgUTu8x0mx9GfeDEimawU5kQC+nQ3MFxIM6bw==", + "version": "24.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.4.0.tgz", + "integrity": "sha512-8qnt/hgtZ94E9dA6viqfViKBfkJwFHXgJmTWlMGDgunw1XJEGqm3eiPjDsTanM3/u/3Az82nyQM9GX7PM/QGmg==", "dependencies": { "@typescript-eslint/experimental-utils": "^4.0.1" }, @@ -7694,21 +8464,22 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.22.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.22.0.tgz", - "integrity": "sha512-p30tuX3VS+NWv9nQot9xIGAHBXR0+xJVaZriEsHoJrASGCJZDJ8JLNM0YqKqI0AKm6Uxaa1VUHoNEibxRCMQHA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz", + "integrity": "sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q==", "dependencies": { - "array-includes": "^3.1.1", - "array.prototype.flatmap": "^1.2.3", + "array-includes": "^3.1.3", + "array.prototype.flatmap": "^1.2.4", "doctrine": "^2.1.0", "has": "^1.0.3", "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "object.entries": "^1.1.2", - "object.fromentries": "^2.0.2", - "object.values": "^1.1.1", + "minimatch": "^3.0.4", + "object.entries": "^1.1.4", + "object.fromentries": "^2.0.4", + "object.values": "^1.1.4", "prop-types": "^15.7.2", - "resolve": "^1.18.1", - "string.prototype.matchall": "^4.0.2" + "resolve": "^2.0.0-next.3", + "string.prototype.matchall": "^4.0.5" }, "engines": { "node": ">=4" @@ -7739,6 +8510,18 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/eslint-plugin-testing-library": { "version": "3.10.2", "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz", @@ -7830,6 +8613,36 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/eslint-plugin-testing-library/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-testing-library/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, "node_modules/eslint-plugin-testing-library/node_modules/eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", @@ -7838,6 +8651,11 @@ "node": ">=4" } }, + "node_modules/eslint-plugin-testing-library/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -7851,44 +8669,40 @@ } }, "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": ">=6" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "engines": { - "node": ">=4" + }, + "peerDependencies": { + "eslint": ">=5" } }, "node_modules/eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "engines": { "node": ">=10" } }, "node_modules/eslint-webpack-plugin": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.2.tgz", - "integrity": "sha512-ndD9chZ/kaGnjjx7taRg7c6FK/YKb29SSYzaLtPBIYLYJQmZtuKqtQbAvTS2ymiMQT6X0VW9vZIHK0KLstv93Q==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.4.tgz", + "integrity": "sha512-7rYh0m76KyKSDE+B+2PUQrlNS4HJ51t3WKpkJg6vo2jFMbEPTG99cBV0Dm7LXSHucN4WGCG65wQcRiTFrj7iWw==", "dependencies": { "@types/eslint": "^7.2.6", "arrify": "^2.0.1", "jest-worker": "^26.6.2", "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", "schema-utils": "^3.0.0" }, "engines": { @@ -7903,12 +8717,54 @@ "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "node_modules/eslint-webpack-plugin/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { - "@types/json-schema": "^7.0.6", + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -7920,6 +8776,17 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/eslint-webpack-plugin/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/eslint/node_modules/@babel/code-frame": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", @@ -7928,10 +8795,48 @@ "@babel/highlight": "^7.10.4" } }, + "node_modules/eslint/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "engines": { + "node": ">=4" + } + }, "node_modules/eslint/node_modules/globals": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.7.0.tgz", - "integrity": "sha512-Aipsz6ZKRxa/xQkZhNg0qIWXT6x6rD46f6x/PCnBomlttdIyAPak4YD9jTmKpZ72uROSMU87qJtcgpgHaVchiA==", + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", "dependencies": { "type-fest": "^0.20.2" }, @@ -7950,6 +8855,11 @@ "node": ">= 4" } }, + "node_modules/eslint/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/eslint/node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -8095,9 +9005,9 @@ } }, "node_modules/exec-sh": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==" + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==" }, "node_modules/execa": { "version": "4.1.0", @@ -8146,14 +9056,6 @@ "node": ">=0.10.0" } }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, "node_modules/expand-brackets/node_modules/define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -8249,11 +9151,6 @@ "node": ">=0.10.0" } }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "node_modules/expect": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", @@ -8315,32 +9212,11 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "node_modules/express/node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, - "node_modules/express/node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "engines": { - "node": ">=0.6" - } - }, "node_modules/ext": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", @@ -8354,11 +9230,6 @@ "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, "node_modules/extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", @@ -8419,40 +9290,84 @@ "node": ">=0.10.0" } }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "engines": [ - "node >=0.6.0" - ] - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-equals": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-2.0.0.tgz", - "integrity": "sha512-u6RBd8cSiLLxAiC04wVsLV6GBFDOXcTCgWkd3wEoFXgidPSoAJENqC9m7Jb2vewSvjBIfXV6icKeh3GTKfIaXA==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-2.0.3.tgz", + "integrity": "sha512-0EMw4TTUxsMDpDkCg0rXor2gsg+npVrMIHbEhvD0HZyIhUX6AktC/yasm+qKwfyswd06Qy95ZKk8p2crTo0iPA==" }, "node_modules/fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" }, "engines": { "node": ">=8" } }, + "node_modules/fast-glob/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/fast-glob/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/fast-glob/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -8464,17 +9379,17 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "node_modules/fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz", + "integrity": "sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -8526,11 +9441,11 @@ } }, "node_modules/file-loader/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dependencies": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -8557,14 +9472,36 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dependencies": { - "to-regex-range": "^5.0.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" + } + }, + "node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" } }, "node_modules/finalhandler": { @@ -8584,19 +9521,6 @@ "node": ">= 0.8" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "node_modules/find-cache-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", @@ -8721,9 +9645,9 @@ } }, "node_modules/flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==" + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==" }, "node_modules/flatten": { "version": "1.0.3", @@ -8739,45 +9663,10 @@ "readable-stream": "^2.3.6" } }, - "node_modules/flush-write-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/flush-write-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "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" - } - }, - "node_modules/flush-write-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/flux-standard-action": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/flux-standard-action/-/flux-standard-action-2.1.1.tgz", - "integrity": "sha512-W86GzmXmIiTVq/dpYVd2HtTIUX9c35Iq3ao3xR6qcKtuXgbu+BDEj72op5VnEIe/kpuSbhl+I8kT1iS2hpcusw==", - "dependencies": { - "lodash": "^4.17.15" - } - }, "node_modules/follow-redirects": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", - "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", "funding": [ { "type": "individual", @@ -8801,14 +9690,6 @@ "node": ">=0.10.0" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "engines": { - "node": "*" - } - }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", @@ -8838,37 +9719,6 @@ "node": ">=4" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -8903,31 +9753,6 @@ "node": ">=0.8.0" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -8936,59 +9761,6 @@ "node": ">=4" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -9008,35 +9780,23 @@ "node": ">=4" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dependencies": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" }, "engines": { - "node": ">= 0.12" + "node": ">= 6" } }, "node_modules/forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "engines": { "node": ">= 0.6" } @@ -9069,33 +9829,6 @@ "readable-stream": "^2.0.0" } }, - "node_modules/from2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/from2/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "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" - } - }, - "node_modules/from2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -9132,33 +9865,6 @@ "readable-stream": "1 || 2" } }, - "node_modules/fs-write-stream-atomic/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/fs-write-stream-atomic/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "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" - } - }, - "node_modules/fs-write-stream-atomic/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -9251,18 +9957,10 @@ "node": ">=0.10.0" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9333,9 +10031,9 @@ } }, "node_modules/globby": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", - "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -9352,9 +10050,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, "node_modules/growly": { "version": "1.3.0", @@ -9379,31 +10077,10 @@ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/harmony-reflect": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", - "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==" + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" }, "node_modules/has": { "version": "1.0.3", @@ -9448,6 +10125,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -9473,28 +10164,6 @@ "node": ">=0.10.0" } }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/has-values/node_modules/kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", @@ -9519,6 +10188,19 @@ "node": ">=4" } }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/hash-base/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -9600,9 +10282,9 @@ } }, "node_modules/hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, "node_modules/hpack.js": { "version": "2.1.6", @@ -9615,33 +10297,6 @@ "wbuf": "^1.1.0" } }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "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" - } - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/hsl-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", @@ -9652,11 +10307,6 @@ "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" }, - "node_modules/html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" - }, "node_modules/html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", @@ -9745,23 +10395,23 @@ } }, "node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" } }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -9805,12 +10455,46 @@ "node": ">=8.0.0" } }, - "node_modules/http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dependencies": { - "http-proxy": "^1.17.0", + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/http-proxy-middleware": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.2.tgz", + "integrity": "sha512-aYk1rTKqLTus23X3L96LGNCGNgWpG4cG0XoZIT1GUPhhulEHX/QalnO6Vbo+WmKWi4AL2IidjuC0wZtbpg0yhQ==", + "dependencies": { + "http-proxy": "^1.18.1", "is-glob": "^4.0.0", "lodash": "^4.17.11", "micromatch": "^3.1.10" @@ -9819,146 +10503,44 @@ "node": ">=4.0.0" } }, - "node_modules/http-proxy-middleware/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, "node_modules/https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", @@ -10063,9 +10645,9 @@ } }, "node_modules/immer": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", - "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.5.tgz", + "integrity": "sha512-2WuIehr2y4lmYz9gaQzetPR2ECniCifk4ORaQbU3g5EalLt+0IVTosEPJ5BoYl/75ky2mivzdRzV8wWgQGOSYQ==", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -10314,11 +10896,12 @@ } }, "node_modules/is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dependencies": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -10333,9 +10916,9 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "node_modules/is-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", - "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.3.tgz", + "integrity": "sha512-ZU538ajmYJmzysE5yU4Y7uIrPQ2j704u+hXFiIPQExpqzzUbpe5jCPdTfmz7jXRxZdvjY3KZ3ZNenoXQovX+Dg==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10352,11 +10935,12 @@ } }, "node_modules/is-boolean-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", - "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dependencies": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -10371,9 +10955,9 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "node_modules/is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", "engines": { "node": ">= 0.4" }, @@ -10406,9 +10990,9 @@ } }, "node_modules/is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", + "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", "dependencies": { "has": "^1.0.3" }, @@ -10428,9 +11012,12 @@ } }, "node_modules/is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -10460,9 +11047,9 @@ } }, "node_modules/is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "bin": { "is-docker": "cli.js" }, @@ -10536,17 +11123,23 @@ } }, "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, "engines": { - "node": ">=0.12.0" + "node": ">=0.10.0" } }, "node_modules/is-number-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", - "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -10554,6 +11147,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", @@ -10612,22 +11216,17 @@ } }, "node_modules/is-potential-custom-element-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", - "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=" - }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, "node_modules/is-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", - "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dependencies": { "call-bind": "^1.0.2", - "has-symbols": "^1.0.1" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -10658,17 +11257,23 @@ } }, "node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -10676,23 +11281,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "dependencies": { - "html-comment-regex": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dependencies": { - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -10743,11 +11337,6 @@ "node": ">=0.10.0" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, "node_modules/istanbul-lib-coverage": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", @@ -10826,6 +11415,27 @@ "node": ">=8" } }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/istanbul-lib-source-maps/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -10932,7 +11542,49 @@ "node": ">= 10.14.2" } }, - "node_modules/jest-config": { + "node_modules/jest-cli/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-cli/node_modules/jest-config": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", @@ -10968,19 +11620,7 @@ } } }, - "node_modules/jest-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/jest-resolve": { + "node_modules/jest-cli/node_modules/jest-resolve": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", @@ -10998,7 +11638,7 @@ "node": ">= 10.14.2" } }, - "node_modules/jest-config/node_modules/locate-path": { + "node_modules/jest-cli/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", @@ -11009,7 +11649,19 @@ "node": ">=8" } }, - "node_modules/jest-config/node_modules/p-limit": { + "node_modules/jest-cli/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/jest-cli/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", @@ -11023,7 +11675,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-config/node_modules/p-locate": { + "node_modules/jest-cli/node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", @@ -11034,7 +11686,7 @@ "node": ">=8" } }, - "node_modules/jest-config/node_modules/read-pkg": { + "node_modules/jest-cli/node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", @@ -11048,7 +11700,7 @@ "node": ">=8" } }, - "node_modules/jest-config/node_modules/read-pkg-up": { + "node_modules/jest-cli/node_modules/read-pkg-up": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", @@ -11064,7 +11716,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-config/node_modules/read-pkg/node_modules/type-fest": { + "node_modules/jest-cli/node_modules/read-pkg/node_modules/type-fest": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", @@ -11072,7 +11724,18 @@ "node": ">=8" } }, - "node_modules/jest-config/node_modules/type-fest": { + "node_modules/jest-cli/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/jest-cli/node_modules/type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", @@ -11187,6 +11850,59 @@ "fsevents": "^2.1.2" } }, + "node_modules/jest-haste-map/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-haste-map/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-haste-map/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-haste-map/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/jest-haste-map/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/jest-jasmine2": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", @@ -11260,6 +11976,59 @@ "node": ">= 10.14.2" } }, + "node_modules/jest-message-util/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-message-util/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/jest-message-util/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/jest-mock": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", @@ -11451,6 +12220,28 @@ "node": ">= 10.14.2" } }, + "node_modules/jest-runner/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-runner/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -11463,6 +12254,50 @@ "node": ">=8" } }, + "node_modules/jest-runner/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-runner/node_modules/jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, "node_modules/jest-runner/node_modules/jest-resolve": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", @@ -11492,6 +12327,18 @@ "node": ">=8" } }, + "node_modules/jest-runner/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/jest-runner/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -11555,6 +12402,17 @@ "node": ">=8" } }, + "node_modules/jest-runner/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/jest-runner/node_modules/type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -11603,6 +12461,28 @@ "node": ">= 10.14.2" } }, + "node_modules/jest-runtime/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-runtime/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -11615,6 +12495,50 @@ "node": ">=8" } }, + "node_modules/jest-runtime/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, "node_modules/jest-runtime/node_modules/jest-resolve": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", @@ -11644,6 +12568,18 @@ "node": ">=8" } }, + "node_modules/jest-runtime/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/jest-runtime/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -11707,6 +12643,17 @@ "node": ">=8" } }, + "node_modules/jest-runtime/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/jest-runtime/node_modules/type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -11881,6 +12828,59 @@ "node": ">= 10.14.2" } }, + "node_modules/jest-util/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jest-util/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/jest-util/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/jest-validate": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", @@ -11970,18 +12970,13 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, "node_modules/jsdom": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.1.tgz", - "integrity": "sha512-pF73EOsJgwZekbDHEY5VO/yKXUkab/DuvrQB/ANVizbr6UAHJsDdHXuotZYwkJSGQl1JM+ivXaqY+XBDDL4TiA==", + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", "dependencies": { "abab": "^2.0.5", - "acorn": "^8.0.5", + "acorn": "^8.2.4", "acorn-globals": "^6.0.0", "cssom": "^0.4.4", "cssstyle": "^2.3.0", @@ -11989,12 +12984,13 @@ "decimal.js": "^10.2.1", "domexception": "^2.0.1", "escodegen": "^2.0.0", + "form-data": "^3.0.0", "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.0", "parse5": "6.0.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.9", "saxes": "^5.0.1", "symbol-tree": "^3.2.4", "tough-cookie": "^4.0.0", @@ -12003,8 +12999,8 @@ "webidl-conversions": "^6.1.0", "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0", - "ws": "^7.4.4", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", "xml-name-validator": "^3.0.0" }, "engines": { @@ -12020,9 +13016,9 @@ } }, "node_modules/jsdom/node_modules/acorn": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.1.0.tgz", - "integrity": "sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", + "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", "bin": { "acorn": "bin/acorn" }, @@ -12051,11 +13047,6 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, - "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -12066,11 +13057,6 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, "node_modules/json3": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", @@ -12101,20 +13087,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, "node_modules/jsx-ast-utils": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", @@ -12127,11 +13099,6 @@ "node": ">=4.0" } }, - "node_modules/just-curry-it": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/just-curry-it/-/just-curry-it-3.1.0.tgz", - "integrity": "sha512-mjzgSOFzlrurlURaHVjnQodyPNvrHrf1TbQP2XU9NSqBtHQPuHZ+Eb6TAJP7ASeJN9h9K0KXoRTs8u6ouHBKvg==" - }, "node_modules/killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -12209,13 +13176,13 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, "node_modules/load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dependencies": { "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", + "parse-json": "^4.0.0", + "pify": "^3.0.0", "strip-bom": "^3.0.0" }, "engines": { @@ -12223,22 +13190,23 @@ } }, "node_modules/load-json-file/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dependencies": { - "error-ex": "^1.2.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, "node_modules/load-json-file/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, "node_modules/load-json-file/node_modules/strip-bom": { @@ -12290,16 +13258,16 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, "node_modules/lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -12310,10 +13278,10 @@ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "node_modules/lodash.template": { "version": "4.5.0", @@ -12337,6 +13305,11 @@ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -12463,9 +13436,9 @@ } }, "node_modules/memoize-one": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.1.1.tgz", - "integrity": "sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" }, "node_modules/memory-fs": { "version": "0.4.1", @@ -12476,33 +13449,6 @@ "readable-stream": "^2.0.1" } }, - "node_modules/memory-fs/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/memory-fs/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "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" - } - }, - "node_modules/memory-fs/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -12535,15 +13481,26 @@ "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" }, "node_modules/micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/miller-rabin": { @@ -12575,19 +13532,19 @@ } }, "node_modules/mime-db": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", - "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==", + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.29", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", - "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", "dependencies": { - "mime-db": "1.46.0" + "mime-db": "1.49.0" }, "engines": { "node": ">= 0.6" @@ -12831,9 +13788,9 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "node_modules/multicast-dns": { "version": "6.2.3", @@ -12869,15 +13826,15 @@ } }, "node_modules/nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", "optional": true }, "node_modules/nanoid": { - "version": "3.1.22", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz", - "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==", + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -12994,38 +13951,11 @@ "vm-browserify": "^1.0.1" } }, - "node_modules/node-libs-browser/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "node_modules/node-libs-browser/node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, - "node_modules/node-libs-browser/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "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" - } - }, - "node_modules/node-libs-browser/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/node-modules-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", @@ -13049,9 +13979,9 @@ } }, "node_modules/node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==" + "version": "1.1.73", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", + "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==" }, "node_modules/normalize-package-data": { "version": "2.5.0", @@ -13114,11 +14044,14 @@ } }, "node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", + "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", "dependencies": { - "boolbase": "~1.0.0" + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, "node_modules/num2fraction": { @@ -13131,14 +14064,6 @@ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -13226,9 +14151,9 @@ } }, "node_modules/object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -13285,14 +14210,13 @@ } }, "node_modules/object.entries": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", - "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", + "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", "dependencies": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" + "es-abstract": "^1.18.2" }, "engines": { "node": ">= 0.4" @@ -13343,14 +14267,13 @@ } }, "node_modules/object.values": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", - "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has": "^1.0.3" + "es-abstract": "^1.18.2" }, "engines": { "node": ">= 0.4" @@ -13585,33 +14508,6 @@ "readable-stream": "^2.1.5" } }, - "node_modules/parallel-transform/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/parallel-transform/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "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" - } - }, - "node_modules/parallel-transform/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -13741,9 +14637,9 @@ } }, "node_modules/path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { "version": "1.8.0", @@ -13762,9 +14658,9 @@ } }, "node_modules/pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -13782,9 +14678,9 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "node_modules/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "engines": { "node": ">=8.6" }, @@ -13843,62 +14739,67 @@ } }, "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", "dependencies": { - "find-up": "^3.0.0" + "find-up": "^2.1.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dependencies": { - "locate-path": "^3.0.0" + "locate-path": "^2.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dependencies": { - "p-locate": "^3.0.0", + "p-locate": "^2.0.0", "path-exists": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dependencies": { - "p-try": "^2.0.0" + "p-try": "^1.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dependencies": { - "p-limit": "^2.0.0" + "p-limit": "^1.1.0" }, "engines": { - "node": ">=6" + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "engines": { + "node": ">=4" } }, "node_modules/pkg-up/node_modules/path-exists": { @@ -13961,6 +14862,11 @@ "ms": "^2.1.1" } }, + "node_modules/portfinder/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, "node_modules/posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -13970,9 +14876,9 @@ } }, "node_modules/postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dependencies": { "chalk": "^2.4.2", "source-map": "^0.6.1", @@ -14343,11 +15249,10 @@ } }, "node_modules/postcss-initial": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz", - "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", + "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", "dependencies": { - "lodash.template": "^4.5.0", "postcss": "^7.0.2" } }, @@ -15057,13 +15962,13 @@ } }, "node_modules/postcss-safe-parser/node_modules/postcss": { - "version": "8.2.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.8.tgz", - "integrity": "sha512-1F0Xb2T21xET7oQV9eKuctbM9S7BC0fetoHCc4H13z0PT6haiRLP4T0ZY4XWh7iLP0usgqykT6p9B2RtOf4FPw==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz", + "integrity": "sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==", "dependencies": { "colorette": "^1.2.2", - "nanoid": "^3.1.20", - "source-map": "^0.6.1" + "nanoid": "^3.1.23", + "source-map-js": "^0.6.2" }, "engines": { "node": "^10 || ^12 || >=14" @@ -15073,14 +15978,6 @@ "url": "https://opencollective.com/postcss/" } }, - "node_modules/postcss-safe-parser/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/postcss-selector-matches": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", @@ -15100,13 +15997,11 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", - "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", "dependencies": { "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1", "util-deprecate": "^1.0.2" }, "engines": { @@ -15114,11 +16009,10 @@ } }, "node_modules/postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", "dependencies": { - "is-svg": "^3.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", "svgo": "^1.0.0" @@ -15263,9 +16157,9 @@ } }, "node_modules/prettier": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", - "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz", + "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -15275,9 +16169,9 @@ } }, "node_modules/prettier-plugin-organize-imports": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-2.1.0.tgz", - "integrity": "sha512-P6TzXkuZRV4g9Fl363tN+r6/ecynu0fwmItKCb/04iksrUtwl/6Jf4DxBPuW8UbcgFRadltxB0VlV5Yh1Ec0Ow==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-2.3.3.tgz", + "integrity": "sha512-PBOwQ8vEIB2b7B3gCuBG7D+dqsr1fsTR4TSAjNacRVdHJrD0yzgz9grOLPSyfwJm+NUTZLyWeHoZ+1mHaUrk+g==", "dev": true, "peerDependencies": { "prettier": ">=2.0", @@ -15319,14 +16213,14 @@ } }, "node_modules/pretty-format/node_modules/react-is": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", - "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==" + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "node_modules/pretty-quick": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-3.1.0.tgz", - "integrity": "sha512-DtxIxksaUWCgPFN7E1ZZk4+Aav3CCuRdhrDSFZENb404sYMtuo9Zka823F+Mgeyt8Zt3bUiCjFzzWYE9LYqkmQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-3.1.1.tgz", + "integrity": "sha512-ZYLGiMoV2jcaas3vTJrLvKAYsxDoXQBUn8OSTxkl67Fyov9lyXivJTl0+2WVh+y6EovGcw7Lm5ThYpH+Sh3XxQ==", "dev": true, "dependencies": { "chalk": "^3.0.0", @@ -15480,11 +16374,11 @@ } }, "node_modules/proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dependencies": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" }, "engines": { @@ -15565,9 +16459,9 @@ } }, "node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "engines": { "node": ">=0.6" } @@ -15588,6 +16482,7 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", "engines": { "node": ">=0.4.x" } @@ -15606,9 +16501,9 @@ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, "node_modules/queue-microtask": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz", - "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", @@ -15696,9 +16591,9 @@ } }, "node_modules/rc-motion": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.4.1.tgz", - "integrity": "sha512-TWLvymfMu8SngPx5MDH8dQ0D2RYbluNTfam4hY/dNNx9RQ3WtGuZ/GXHi2ymLMzH+UNd6EEFYkOuR5JTTtm8Xg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.4.4.tgz", + "integrity": "sha512-ms7n1+/TZQBS0Ydd2Q5P4+wJTSOrhIrwNxLXCZpR7Fa3/oac7Yi803HDALc2hLAKaCTQtw9LmQeB58zcwOsqlQ==", "dependencies": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", @@ -15729,9 +16624,9 @@ } }, "node_modules/rc-tooltip": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.1.0.tgz", - "integrity": "sha512-pFqD1JZwNIpbdcefB7k5xREoHAWM/k3yQwYF0iminbmDXERgq4rvBfUwIvlCqqZSM7HDr9hYeYr6ZsVNaKtvCQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.1.1.tgz", + "integrity": "sha512-alt8eGMJulio6+4/uDm7nvV+rJq9bsfxFDCI0ljPdbuoygUscbsMYb6EQgwib/uqsXQUvzk+S7A59uYHmEgmDA==", "dependencies": { "@babel/runtime": "^7.11.2", "rc-trigger": "^5.0.0" @@ -15742,9 +16637,9 @@ } }, "node_modules/rc-trigger": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.2.3.tgz", - "integrity": "sha512-6Fokao07HUbqKIDkDRFEM0AGZvsvK0Fbp8A/KFgl1ngaqfO1nY037cISCG1Jm5fxImVsXp9awdkP7Vu5cxjjog==", + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.2.9.tgz", + "integrity": "sha512-0Bxsh2Xe+etejMn73am+jZBcOpsueAZiEKLiGoDfA0fvm/JHLNOiiww3zJ0qgyPOTmbYxhsxFcGOZu+VcbaZhQ==", "dependencies": { "@babel/runtime": "^7.11.2", "classnames": "^2.2.6", @@ -15761,9 +16656,9 @@ } }, "node_modules/rc-util": { - "version": "5.9.4", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.9.4.tgz", - "integrity": "sha512-pzFmYZsKLJ1p+Uv4NqA4aNBaFh8/hOQxOOxA5G4TiyPboa0o/PjminxUCKvoSwVJVW5YgleSM2XPCTpTV6DCsQ==", + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.13.2.tgz", + "integrity": "sha512-eYc71XXGlp96RMzg01Mhq/T3BL6OOVTDSS0urFEuvpi+e7slhJRhaHGCKy2hqJm18m9ff7VoRoptplKu60dYog==", "dependencies": { "@babel/runtime": "^7.12.5", "react-is": "^16.12.0", @@ -15830,16 +16725,6 @@ "react-dom": ">=16.8.0" } }, - "node_modules/react-bootstrap/node_modules/@types/react": { - "version": "17.0.11", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.11.tgz", - "integrity": "sha512-yFRQbD+whVonItSk7ZzP/L+gPTJVBkL/7shLEF+i9GC/1cV3JmUxEQz6+9ylhUpWSDuqo1N9qEvqS6vTj4USUA==", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, "node_modules/react-dev-utils": { "version": "11.0.4", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", @@ -15948,6 +16833,14 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "node_modules/react-dev-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, "node_modules/react-dev-utils/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -15987,6 +16880,15 @@ "node": ">=4" } }, + "node_modules/react-dev-utils/node_modules/immer": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", + "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/react-dev-utils/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -16023,6 +16925,59 @@ "node": ">=8" } }, + "node_modules/react-dev-utils/node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/react-dev-utils/node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/react-dev-utils/node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/react-dev-utils/node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, "node_modules/react-dev-utils/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -16093,9 +17048,9 @@ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "node_modules/react-overlays": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.0.1.tgz", - "integrity": "sha512-plwUJieTBbLSrgvQ4OkkbTD/deXgxiJdNuKzo6n1RWE3OVnQIU5hffCGS/nvIuu6LpXFs2majbzaXY8rcUVdWA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.1.1.tgz", + "integrity": "sha512-eCN2s2/+GVZzpnId4XVWtvDPYYBD2EtOGP74hE+8yDskPzFy9+pV1H3ZZihxuRdEbQzzacySaaDkR7xE0ydl4Q==", "dependencies": { "@babel/runtime": "^7.13.8", "@popperjs/core": "^2.8.6", @@ -16144,9 +17099,9 @@ } }, "node_modules/react-resize-detector": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-6.6.4.tgz", - "integrity": "sha512-sAAh8TmOp59MFs2HR7D1VGbAq+zL+2klQhFbkXOH5Gy/EBEyHGiWXWMStoB+axSYr/Xw54owg6QRGSFj3z0dew==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-6.7.4.tgz", + "integrity": "sha512-wzvGmUdEDMhiUHVZGnl4kuyj/TEQhvbB5LyAGkbYXetwJ2O+u/zftmPvU+kxiO1h+d9aUqQBKcNLS7TvB3ytqA==", "dependencies": { "@types/resize-observer-browser": "^0.1.5", "lodash.debounce": "^4.0.8", @@ -16182,7 +17137,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz", "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", - "license": "MIT", "dependencies": { "@babel/runtime": "^7.1.2", "history": "^4.9.0", @@ -16279,6 +17233,65 @@ } } }, + "node_modules/react-scripts/node_modules/@babel/core": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/react-scripts/node_modules/@babel/core/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/react-scripts/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/react-scripts/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/react-select": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/react-select/-/react-select-4.3.1.tgz", @@ -16344,9 +17357,9 @@ } }, "node_modules/react-table": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/react-table/-/react-table-7.6.3.tgz", - "integrity": "sha512-hfPF13zDLxPMpLKzIKCE8RZud9T/XrRTsaCIf8zXpWZIZ2juCl7qrGpo3AQw9eAetXV5DP7s2GDm+hht7qq5Dw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/react-table/-/react-table-7.7.0.tgz", + "integrity": "sha512-jBlj70iBwOTvvImsU9t01LjFjy4sXEtclBovl3mTiqjz23Reu0DKnRza4zlLtOPACx6j2/7MrQIthIK1Wi+LIA==", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -16356,9 +17369,9 @@ } }, "node_modules/react-transition-group": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz", - "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -16371,25 +17384,25 @@ } }, "node_modules/read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dependencies": { - "load-json-file": "^2.0.0", + "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "path-type": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "dependencies": { "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "read-pkg": "^3.0.0" }, "engines": { "node": ">=4" @@ -16457,41 +17470,55 @@ } }, "node_modules/read-pkg/node_modules/path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dependencies": { - "pify": "^2.0.0" + "pify": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/read-pkg/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "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" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" } }, "node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { "picomatch": "^2.2.1" }, @@ -16500,9 +17527,9 @@ } }, "node_modules/recharts": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.0.9.tgz", - "integrity": "sha512-JNsXE80PuF3hugUCE7JqDOMSvu5xQLxtjOaqFKKZI2pCJ1PVJzhwDv4TWk0nO4AvADbeWzYEHbg8C5Hcrh42UA==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.0.10.tgz", + "integrity": "sha512-yVIlHXPiSgxg8z+qApVnBcGVCLpluqNbXJenK3jKxsCb/FJzh77wyEztS6kXLXSC1RCZa7UABmBPBhqspMCF+g==", "dependencies": { "@types/d3-scale": "^3.0.0", "@types/d3-shape": "^2.0.0", @@ -16524,9 +17551,9 @@ } }, "node_modules/recharts-scale": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.4.tgz", - "integrity": "sha512-e7MCnuD1+gtY9N7TYxzB+QXvi4s30kvNqVbI1p5m4rf47GusEQaEHxi8zvlZkdOOZ90UhpGHcnkYlyYkUJ2JoQ==", + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", "dependencies": { "decimal.js-light": "^2.4.1" } @@ -16561,47 +17588,12 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" }, - "node_modules/reduce-reducers": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/reduce-reducers/-/reduce-reducers-0.4.3.tgz", - "integrity": "sha512-+CNMnI8QhgVMtAt54uQs3kUxC3Sybpa7Y63HR14uGLgI9/QR5ggHvpxwhGGe3wmx5V91YwqQIblN9k5lspAmGw==" - }, "node_modules/redux": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", - "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.1.tgz", + "integrity": "sha512-hZQZdDEM25UY2P493kPYuKqviVwZ58lEmGQNeQ+gXa+U0gYPUBf7NKYazbe3m+bs/DzM/ahN12DbF+NG8i0CWw==", "dependencies": { - "loose-envify": "^1.4.0", - "symbol-observable": "^1.2.0" - } - }, - "node_modules/redux-actions": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/redux-actions/-/redux-actions-2.6.5.tgz", - "integrity": "sha512-pFhEcWFTYNk7DhQgxMGnbsB1H2glqhQJRQrtPb96kD3hWiZRzXHwwmFPswg6V2MjraXRXWNmuP9P84tvdLAJmw==", - "dependencies": { - "invariant": "^2.2.4", - "just-curry-it": "^3.1.0", - "loose-envify": "^1.4.0", - "reduce-reducers": "^0.4.3", - "to-camel-case": "^1.0.0" - } - }, - "node_modules/redux-logger": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz", - "integrity": "sha1-91VZZvMJjzyIYExEnPC69XeCdL8=", - "dependencies": { - "deep-diff": "^0.3.5" - } - }, - "node_modules/redux-promise": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/redux-promise/-/redux-promise-0.6.0.tgz", - "integrity": "sha512-R2mGxJbPFgXyCNbFDE6LjTZhCEuACF54g1bxld3nqBhnRMX0OsUyWk77moF7UMGkUdl5WOAwc4BC5jOd1dunqQ==", - "dependencies": { - "flux-standard-action": "^2.0.3", - "is-promise": "^2.1.0" + "@babel/runtime": "^7.9.2" } }, "node_modules/redux-thunk": { @@ -16626,9 +17618,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "node_modules/regenerator-transform": { "version": "0.14.5", @@ -16671,9 +17663,9 @@ } }, "node_modules/regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "engines": { "node": ">=8" }, @@ -16703,9 +17695,9 @@ "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" }, "node_modules/regjsparser": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.7.tgz", - "integrity": "sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ==", + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", "dependencies": { "jsesc": "~0.5.0" }, @@ -16735,15 +17727,15 @@ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "node_modules/renderkid": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", - "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", "dependencies": { - "css-select": "^2.0.2", - "dom-converter": "^0.2", - "htmlparser2": "^3.10.1", - "lodash": "^4.17.20", - "strip-ansi": "^3.0.0" + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" } }, "node_modules/renderkid/node_modules/ansi-regex": { @@ -16766,9 +17758,9 @@ } }, "node_modules/repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", "engines": { "node": ">=0.10.0" } @@ -16781,100 +17773,6 @@ "node": ">=0.10" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dependencies": { - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", - "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "engines": { - "node": ">=0.12.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request-promise-native/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/request/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -16901,6 +17799,11 @@ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, + "node_modules/reselect": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz", + "integrity": "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==" + }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", @@ -16957,9 +17860,9 @@ "deprecated": "https://github.com/lydell/resolve-url#deprecated" }, "node_modules/resolve-url-loader": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz", - "integrity": "sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz", + "integrity": "sha512-D3sQ04o0eeQEySLrcz4DsX3saHfsr8/N6tfhblxgZKXxMT2Louargg12oGNfoTRLV09GXhVUe5/qgA5vdgNigg==", "dependencies": { "adjust-sourcemap-loader": "3.0.0", "camelcase": "5.3.1", @@ -16967,7 +17870,7 @@ "convert-source-map": "1.7.0", "es6-iterator": "2.0.3", "loader-utils": "1.2.3", - "postcss": "7.0.21", + "postcss": "7.0.36", "rework": "1.0.1", "rework-visit": "1.0.0", "source-map": "0.6.1" @@ -16976,17 +17879,6 @@ "node": ">=6.0.0" } }, - "node_modules/resolve-url-loader/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/resolve-url-loader/node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -16995,43 +17887,14 @@ "node": ">=6" } }, - "node_modules/resolve-url-loader/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/resolve-url-loader/node_modules/convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" + "safe-buffer": "~5.1.1" } }, - "node_modules/resolve-url-loader/node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-url-loader/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/resolve-url-loader/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, "node_modules/resolve-url-loader/node_modules/emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", @@ -17040,22 +17903,6 @@ "node": ">= 0.10" } }, - "node_modules/resolve-url-loader/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/resolve-url-loader/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, "node_modules/resolve-url-loader/node_modules/json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -17080,19 +17927,6 @@ "node": ">=4.0.0" } }, - "node_modules/resolve-url-loader/node_modules/postcss": { - "version": "7.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", - "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/resolve-url-loader/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -17101,17 +17935,6 @@ "node": ">=0.10.0" } }, - "node_modules/resolve-url-loader/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -17284,12 +18107,19 @@ "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" }, "node_modules/rooks": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/rooks/-/rooks-5.0.2.tgz", - "integrity": "sha512-GPydrZ6Sd0g1INCK6RrzM+xnu5I2Fiir/3WRGDw1XeaU026xibPiTl/lOct5Q9ErRerSi0ETHwzdpcHuCw7NlA==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/rooks/-/rooks-5.4.6.tgz", + "integrity": "sha512-BTVEPgCC2WFfLEYlvf1jtDPI7imbY6G2gbi75ksLSt5e2noJbAOfNx2hu1lp+A19d+KO+X/gwzvYnytruDA37Q==", "dependencies": { "lodash.debounce": "^4.0.8", "raf": "^3.4.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" } }, "node_modules/rsvp": { @@ -17352,6 +18182,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", "dependencies": { "@cnakazawa/watch": "^1.0.3", "anymatch": "^2.0.0", @@ -17379,37 +18210,6 @@ "normalize-path": "^2.1.1" } }, - "node_modules/sane/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sane/node_modules/cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -17442,31 +18242,6 @@ "node": ">=6" } }, - "node_modules/sane/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sane/node_modules/get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -17478,36 +18253,6 @@ "node": ">=6" } }, - "node_modules/sane/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sane/node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -17516,29 +18261,6 @@ "node": ">=0.10.0" } }, - "node_modules/sane/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sane/node_modules/normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", @@ -17596,18 +18318,6 @@ "node": ">=0.10.0" } }, - "node_modules/sane/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sane/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -17625,9 +18335,9 @@ "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" }, "node_modules/sass": { - "version": "1.32.10", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.10.tgz", - "integrity": "sha512-Nx0pcWoonAkn7CRp0aE/hket1UP97GiR1IFw3kcjV3pnenhWgZEWUf0ZcfPOV2fK52fnOcK3JdC/YYZ9E47DTQ==", + "version": "1.37.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.37.5.tgz", + "integrity": "sha512-Cx3ewxz9QB/ErnVIiWg2cH0kiYZ0FPvheDTVC6BsiEGBTZKKZJ1Gq5Kq6jy3PKtL6+EJ8NIoaBW/RSd2R6cZOA==", "dependencies": { "chokidar": ">=3.0.0 <4.0.0" }, @@ -17639,9 +18349,9 @@ } }, "node_modules/sass-loader": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.1.1.tgz", - "integrity": "sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.0.tgz", + "integrity": "sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw==", "dependencies": { "klona": "^2.0.4", "loader-utils": "^2.0.0", @@ -17658,7 +18368,7 @@ }, "peerDependencies": { "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0", "sass": "^1.3.0", "webpack": "^4.36.0 || ^5.0.0" }, @@ -17675,11 +18385,11 @@ } }, "node_modules/sass-loader/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dependencies": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -17739,9 +18449,9 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "node_modules/selfsigned": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", - "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", "dependencies": { "node-forge": "^0.10.0" } @@ -17798,19 +18508,6 @@ "node": ">= 0.8.0" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "node_modules/send/node_modules/ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", @@ -17841,14 +18538,6 @@ "node": ">= 0.8.0" } }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -17868,11 +18557,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", @@ -18111,14 +18795,6 @@ "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, "node_modules/snapdragon/node_modules/define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -18214,11 +18890,6 @@ "node": ">=0.10.0" } }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "node_modules/socket.io-client": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.1.3.tgz", @@ -18236,6 +18907,27 @@ "node": ">=10.0.0" } }, + "node_modules/socket.io-client/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-client/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/socket.io-parser": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", @@ -18249,6 +18941,27 @@ "node": ">=10.0.0" } }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/sockjs": { "version": "0.3.21", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", @@ -18260,16 +18973,16 @@ } }, "node_modules/sockjs-client": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.0.tgz", - "integrity": "sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", + "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", "dependencies": { "debug": "^3.2.6", "eventsource": "^1.0.7", "faye-websocket": "^0.11.3", "inherits": "^2.0.4", "json3": "^3.3.3", - "url-parse": "^1.4.7" + "url-parse": "^1.5.1" } }, "node_modules/sockjs-client/node_modules/debug": { @@ -18280,10 +18993,16 @@ "ms": "^2.1.1" } }, + "node_modules/sockjs-client/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, "node_modules/sockjs/node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "bin": { "uuid": "bin/uuid" } @@ -18312,6 +19031,14 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", @@ -18375,9 +19102,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==" + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", + "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==" }, "node_modules/spdy": { "version": "4.0.2", @@ -18407,6 +19134,61 @@ "wbuf": "^1.7.3" } }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/spdy/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -18423,25 +19205,6 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ssri": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", @@ -18469,6 +19232,14 @@ "node": ">=10" } }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, "node_modules/stackframe": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", @@ -18570,14 +19341,6 @@ "node": ">= 0.6" } }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", @@ -18587,33 +19350,6 @@ "readable-stream": "^2.0.2" } }, - "node_modules/stream-browserify/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/stream-browserify/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "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" - } - }, - "node_modules/stream-browserify/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/stream-each": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", @@ -18635,33 +19371,6 @@ "xtend": "^4.0.0" } }, - "node_modules/stream-http/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/stream-http/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "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" - } - }, - "node_modules/stream-http/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/stream-shift": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", @@ -18738,14 +19447,15 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/string.prototype.matchall": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz", - "integrity": "sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz", + "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has-symbols": "^1.0.1", + "es-abstract": "^1.18.2", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", "internal-slot": "^1.0.3", "regexp.prototype.flags": "^1.3.1", "side-channel": "^1.0.4" @@ -18895,9 +19605,9 @@ } }, "node_modules/stylis": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.7.tgz", - "integrity": "sha512-OFFeUXFgwnGOKvEXaSv0D0KQ5ADP0n6g3SVONx6I/85JzNZ3u50FRwB3lVIk1QO2HNdI75tbVzc4Z66Gdp9voA==" + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.10.tgz", + "integrity": "sha512-m3k+dk7QeJw660eIKRRn3xPF6uuvHs/FFzjX3HQ5ove0qYsiygoAhwn5a3IYKaZPo5LrYD0rfVmtv1gNY1uYwg==" }, "node_modules/supports-color": { "version": "7.2.0", @@ -18911,9 +19621,9 @@ } }, "node_modules/supports-hyperlinks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", - "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -18990,6 +19700,51 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, "node_modules/svgo/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -19006,6 +19761,14 @@ "node": ">=4" } }, + "node_modules/svgo/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dependencies": { + "boolbase": "~1.0.0" + } + }, "node_modules/svgo/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -19017,37 +19780,31 @@ "node": ">=4" } }, - "node_modules/symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "node_modules/table": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", - "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", "dependencies": { - "ajv": "^7.0.2", - "lodash": "^4.17.20", + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", "slice-ansi": "^4.0.0", - "string-width": "^4.2.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10.0.0" } }, "node_modules/table/node_modules/ajv": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.3.tgz", - "integrity": "sha512-idv5WZvKVXDqKralOImQgPM9v6WOdLNa0IY3B3doOjw/YxRGT8I+allIJ6kd7Uaj+SF1xZUSU+nPM5aDNBVtnw==", + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -19073,9 +19830,9 @@ } }, "node_modules/tar": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", - "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.6.tgz", + "integrity": "sha512-oaWyu5dQbHaYcyZCTfyPpC+VmI62/OM2RTUYavTk1MDr1cwW5Boi3baeYQKiZbY2uSQJGr+iMOzb/JFxLrft+g==", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -19280,11 +20037,11 @@ } }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dependencies": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -19313,9 +20070,9 @@ } }, "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.1.tgz", - "integrity": "sha512-yv9YLFQQ+3ZqgWCUk+pvNJwgUTdlIxUk1WTN+RnaFJe2L7ipG2csPT0ra2XRm7Cs8cxN7QXmK1rFzEwYEQkzXw==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.1.tgz", + "integrity": "sha512-b3e+d5JbHAe/JSjwsC3Zn55wsBIM7AsHLjKxT31kGCldgbpFePaFo+PiddtO6uwRZWRw7sPXmAN8dTW61xmnSg==", "dependencies": { "commander": "^2.20.0", "source-map": "~0.7.2", @@ -19381,33 +20138,6 @@ "xtend": "~4.0.1" } }, - "node_modules/through2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "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" - } - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -19449,14 +20179,6 @@ "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" }, - "node_modules/to-camel-case": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-camel-case/-/to-camel-case-1.0.0.tgz", - "integrity": "sha1-GlYFSy+daWKYzmamCJcyK29CPkY=", - "dependencies": { - "to-space-case": "^1.0.0" - } - }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -19465,11 +20187,6 @@ "node": ">=4" } }, - "node_modules/to-no-case": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-no-case/-/to-no-case-1.0.2.tgz", - "integrity": "sha1-xyKQcWTvaxeBMsjmmTAhLRtKoWo=" - }, "node_modules/to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -19507,22 +20224,15 @@ } }, "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dependencies": { - "is-number": "^7.0.0" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" }, "engines": { - "node": ">=8.0" - } - }, - "node_modules/to-space-case": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-space-case/-/to-space-case-1.0.0.tgz", - "integrity": "sha1-sFLar7Gysp3HcM6gFj5ewOvJ/Bc=", - "dependencies": { - "to-no-case": "^1.0.0" + "node": ">=0.10.0" } }, "node_modules/toidentifier": { @@ -19555,9 +20265,9 @@ } }, "node_modules/tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", "dependencies": { "punycode": "^2.1.1" }, @@ -19584,27 +20294,15 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz", + "integrity": "sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q==", "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^2.2.0", "minimist": "^1.2.0", "strip-bom": "^3.0.0" } }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/tsconfig-paths/node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -19614,9 +20312,9 @@ } }, "node_modules/tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -19642,22 +20340,6 @@ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, "node_modules/type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -19683,11 +20365,11 @@ } }, "node_modules/type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -19719,9 +20401,9 @@ } }, "node_modules/typescript": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", - "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -19731,14 +20413,17 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.0.tgz", - "integrity": "sha512-P/51NX+JXyxK/aigg1/ZgyccdAxm5K1+n8+tvqSntjOivPt19gvm1VC49RWYetsiub8WViUchdxl/KWHHB0kzA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", "dependencies": { "function-bind": "^1.1.1", - "has-bigints": "^1.0.0", - "has-symbols": "^1.0.0", - "which-boxed-primitive": "^1.0.1" + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/uncontrollable": { @@ -19979,11 +20664,11 @@ } }, "node_modules/url-loader/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dependencies": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -19996,9 +20681,9 @@ } }, "node_modules/url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", + "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -20013,6 +20698,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", "engines": { "node": ">=0.4.x" } @@ -20080,9 +20766,9 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" }, "node_modules/v8-to-istanbul": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz", - "integrity": "sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", + "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^1.6.0", @@ -20131,19 +20817,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -20237,39 +20910,6 @@ "node": ">=0.10.0" } }, - "node_modules/watchpack-chokidar2/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "optional": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/watchpack-chokidar2/node_modules/chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -20293,33 +20933,6 @@ "fsevents": "^1.2.7" } }, - "node_modules/watchpack-chokidar2/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "optional": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/watchpack-chokidar2/node_modules/fsevents": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", @@ -20372,84 +20985,6 @@ "node": ">=0.10.0" } }, - "node_modules/watchpack-chokidar2/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "optional": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "optional": true - }, - "node_modules/watchpack-chokidar2/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "optional": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "optional": true, - "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" - } - }, "node_modules/watchpack-chokidar2/node_modules/readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", @@ -20464,28 +20999,6 @@ "node": ">=0.10" } }, - "node_modules/watchpack-chokidar2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "optional": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "optional": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wbuf": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", @@ -20680,37 +21193,6 @@ "node": ">=0.10.0" } }, - "node_modules/webpack-dev-server/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/webpack-dev-server/node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -20783,36 +21265,27 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "node_modules/webpack-dev-server/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/webpack-dev-server/node_modules/emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, - "node_modules/webpack-dev-server/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/webpack-dev-server/node_modules/find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -20870,6 +21343,20 @@ "node": ">=4" } }, + "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/webpack-dev-server/node_modules/import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -20904,14 +21391,6 @@ "node": ">=0.10.0" } }, - "node_modules/webpack-dev-server/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/webpack-dev-server/node_modules/is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -20920,33 +21399,6 @@ "node": ">=4" } }, - "node_modules/webpack-dev-server/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "node_modules/webpack-dev-server/node_modules/locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -20959,28 +21411,10 @@ "node": ">=6" } }, - "node_modules/webpack-dev-server/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/webpack-dev-server/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/webpack-dev-server/node_modules/p-limit": { "version": "2.3.0", @@ -21026,20 +21460,6 @@ "node": ">=6" } }, - "node_modules/webpack-dev-server/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "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" - } - }, "node_modules/webpack-dev-server/node_modules/readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", @@ -21093,14 +21513,6 @@ "semver": "bin/semver.js" } }, - "node_modules/webpack-dev-server/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/webpack-dev-server/node_modules/string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -21155,18 +21567,6 @@ "node": ">=6" } }, - "node_modules/webpack-dev-server/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/webpack-dev-server/node_modules/wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", @@ -21200,9 +21600,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", "dependencies": { "async-limiter": "~1.0.0" } @@ -21257,6 +21657,7 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "bin": { "uuid": "bin/uuid" } @@ -21335,37 +21736,6 @@ "node": ">=0.4.0" } }, - "node_modules/webpack/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/webpack/node_modules/cacache": { "version": "12.0.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", @@ -21405,61 +21775,6 @@ "node": ">=4.0.0" } }, - "node_modules/webpack/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/webpack/node_modules/is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", @@ -21500,29 +21815,6 @@ "yallist": "^3.0.2" } }, - "node_modules/webpack/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/webpack/node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -21564,9 +21856,9 @@ } }, "node_modules/webpack/node_modules/ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "dependencies": { "figgy-pudding": "^3.5.1" } @@ -21593,18 +21885,6 @@ "webpack": "^4.0.0" } }, - "node_modules/webpack/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/webpack/node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -21650,12 +21930,12 @@ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" }, "node_modules/whatwg-url": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", - "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^2.0.2", + "lodash": "^4.7.0", + "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" }, "engines": { @@ -21969,9 +22249,9 @@ } }, "node_modules/ws": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", - "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==", + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "engines": { "node": ">=8.3.0" }, @@ -22007,9 +22287,9 @@ } }, "node_modules/y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, "node_modules/yallist": { "version": "4.0.0", @@ -22132,83 +22412,95 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", "requires": { - "@babel/highlight": "^7.12.13" + "@babel/highlight": "^7.14.5" } }, "@babel/compat-data": { - "version": "7.13.11", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.11.tgz", - "integrity": "sha512-BwKEkO+2a67DcFeS3RLl0Z3Gs2OvdXewuWjc1Hfokhb5eQWP9YRYH1/+VrVZvql2CfjOiNGqSAFOYt4lsqTHzg==" + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==" }, "@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", + "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.0", + "@babel/helper-module-transforms": "^7.15.0", + "@babel/helpers": "^7.14.8", + "@babel/parser": "^7.15.0", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", + "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", + "semver": "^6.3.0", "source-map": "^0.5.0" }, "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", + "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", "requires": { - "@babel/types": "^7.13.0", + "@babel/types": "^7.15.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-annotate-as-pure": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", - "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", + "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.5" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", - "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz", + "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", "requires": { - "@babel/helper-explode-assignable-expression": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-explode-assignable-expression": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/helper-compilation-targets": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.10.tgz", - "integrity": "sha512-/Xju7Qg1GQO4mHZ/Kcs6Au7gfafgZnwm+a7sy/ow/tV1sHeraRUHbjdat8/UvDor4Tez+siGKDk6zIKtCPKVJA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", + "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", "requires": { - "@babel/compat-data": "^7.13.8", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", "semver": "^6.3.0" }, "dependencies": { @@ -22220,30 +22512,31 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.13.11", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz", - "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.0.tgz", + "integrity": "sha512-MdmDXgvTIi4heDVX/e9EFfeGpugqm9fobBVg/iioE8kueXrOHdRDe36FAY7SnE9xXLVeYCoJR/gdrBEIHRC83Q==", "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-member-expression-to-functions": "^7.13.0", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-split-export-declaration": "^7.12.13" + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-member-expression-to-functions": "^7.15.0", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.0", + "@babel/helper-split-export-declaration": "^7.14.5" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", - "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-annotate-as-pure": "^7.14.5", "regexpu-core": "^4.7.1" } }, "@babel/helper-define-polyfill-provider": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz", - "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", "requires": { "@babel/helper-compilation-targets": "^7.13.0", "@babel/helper-module-imports": "^7.12.13", @@ -22255,6 +22548,19 @@ "semver": "^6.1.2" }, "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -22263,167 +22569,165 @@ } }, "@babel/helper-explode-assignable-expression": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", - "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz", + "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", "requires": { - "@babel/types": "^7.13.0" + "@babel/types": "^7.14.5" } }, "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", + "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/helper-get-function-arity": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", + "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.5" } }, "@babel/helper-hoist-variables": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz", - "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", + "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", "requires": { - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/types": "^7.14.5" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz", - "integrity": "sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", + "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", "requires": { - "@babel/types": "^7.13.0" + "@babel/types": "^7.15.0" } }, "@babel/helper-module-imports": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", - "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", + "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.5" } }, "@babel/helper-module-transforms": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz", - "integrity": "sha512-Ls8/VBwH577+pw7Ku1QkUWIyRRNHpYlts7+qSqBBFCW3I8QteB9DxfcZ5YJpOwH6Ihe/wn8ch7fMGOP1OhEIvw==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", + "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-simple-access": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0", - "lodash": "^4.17.19" + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.0", + "@babel/helper-simple-access": "^7.14.8", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" } }, "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", + "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.5" } }, "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" }, "@babel/helper-remap-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", - "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz", + "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==", "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-wrap-function": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-wrap-function": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/helper-replace-supers": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz", - "integrity": "sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", + "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.0", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-member-expression-to-functions": "^7.15.0", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" } }, "@babel/helper-simple-access": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", - "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", + "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.8" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", + "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.14.5" } }, "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", + "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", "requires": { - "@babel/types": "^7.12.13" + "@babel/types": "^7.14.5" } }, "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" }, "@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==" + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" }, "@babel/helper-wrap-function": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", - "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz", + "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==", "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/helper-function-name": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/helpers": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", - "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.8.tgz", + "integrity": "sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw==", "requires": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.8", + "@babel/types": "^7.14.8" } }, "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", "requires": { - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -22480,27 +22784,47 @@ } }, "@babel/parser": { - "version": "7.13.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.11.tgz", - "integrity": "sha512-PhuoqeHoO9fc4ffMEVk4qb/w/s2iOSWohvbHxLtxui0eBg3Lg5gN1U8wp1V1u61hOWkPQJJyJzGH6Y+grwkq8Q==" + "version": "7.15.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.2.tgz", + "integrity": "sha512-bMJXql1Ss8lFnvr11TZDH4ArtwlAS5NG9qBmdiFW2UHHm6MVoR+GDc5XE2b9K938cyjc9O6/+vjjcffLDtfuDg==" + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz", - "integrity": "sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.9.tgz", + "integrity": "sha512-d1lnh+ZnKrFKwtTYdw320+sQWCTwgkB9fmUhNXRADA4akR6wLjaruSGnIEUjpt9HCOwTr4ynFTKu19b7rFRpmw==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", - "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz", + "integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-decorators": { @@ -22514,106 +22838,117 @@ } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", - "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", - "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", - "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", - "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", - "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", - "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", - "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", + "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", "requires": { - "@babel/compat-data": "^7.13.8", - "@babel/helper-compilation-targets": "^7.13.8", - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.13.0" + "@babel/plugin-transform-parameters": "^7.14.5" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", - "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-plugin-utils": "^7.14.5", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.8.tgz", - "integrity": "sha512-hpbBwbTgd7Cz1QryvwJZRo1U0k1q8uyBmeXOSQUjdg/A2TASkhR/rz7AyqZ/kS8kbpsNA80rOYbxySBJAqmhhQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", - "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", - "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-async-generators": { @@ -22640,12 +22975,20 @@ "@babel/helper-plugin-utils": "^7.12.13" } }, - "@babel/plugin-syntax-decorators": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz", - "integrity": "sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA==", + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.14.5.tgz", + "integrity": "sha512-c4sZMRWL4GSvP1EXy0woIP7m4jkVcEuG8R1TOZxPBPtp4FSM/kiPZub9UIs/Jrb5ZAOzvTUSGYrWsrSu1JvoPw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-dynamic-import": { @@ -22665,11 +23008,11 @@ } }, "@babel/plugin-syntax-flow": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz", - "integrity": "sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.14.5.tgz", + "integrity": "sha512-9WK5ZwKCdWHxVuU13XNT6X73FGmutAXeor5lGFq6qhOFtMFUF4jkbijuyUdZZlpYq6E2hZeZf/u3959X9wsv0Q==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-import-meta": { @@ -22689,11 +23032,11 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", - "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", + "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -22744,110 +23087,118 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", - "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-typescript": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz", - "integrity": "sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", - "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", - "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0" + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", - "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", - "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz", + "integrity": "sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-classes": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", - "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.9.tgz", + "integrity": "sha512-NfZpTcxU3foGWbl4wxmZ35mTsYJy8oQocbeIMoDAGGFarAmSQlL+LWMkDx/tj6pNotpbX3rltIA4dprgAPOq5A==", "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-replace-supers": "^7.13.0", - "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", - "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-destructuring": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz", - "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", - "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", - "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", - "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-flow-strip-types": { @@ -22860,180 +23211,180 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", - "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz", + "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", - "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", - "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", - "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz", - "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", "requires": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", - "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.0.tgz", + "integrity": "sha512-3H/R9s8cXcOGE8kgMlmjYYC9nqr5ELiPkJn4q0mypBrjhYQoc+5/Maq69vV4xRPWnkzZuwJPf5rArxpB/35Cig==", "requires": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-module-transforms": "^7.15.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.14.8", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", - "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz", + "integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==", "requires": { - "@babel/helper-hoist-variables": "^7.13.0", - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-identifier": "^7.12.11", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz", - "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", "requires": { - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", - "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz", + "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5" } }, "@babel/plugin-transform-new-target": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", - "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-object-super": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", - "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" } }, "@babel/plugin-transform-parameters": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", - "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz", + "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-property-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", - "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.13.10.tgz", - "integrity": "sha512-E+aCW9j7mLq01tOuGV08YzLBt+vSyr4bOPT75B6WrAlrUfmOYOZ/yWk847EH0dv0xXiCihWLEmlX//O30YhpIw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz", + "integrity": "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz", - "integrity": "sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA==", + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz", + "integrity": "sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.17.tgz", - "integrity": "sha512-mwaVNcXV+l6qJOuRhpdTEj8sT/Z0owAVWf9QujTZ0d2ye9X/K+MTOTSizcgKOj18PGnTc/7g1I4+cIUjsKhBcw==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz", + "integrity": "sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-jsx": "^7.12.13", - "@babel/types": "^7.12.17" + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-jsx": "^7.14.5", + "@babel/types": "^7.14.9" } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz", - "integrity": "sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz", + "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", "requires": { - "@babel/plugin-transform-react-jsx": "^7.12.17" + "@babel/plugin-transform-react-jsx": "^7.14.5" } }, "@babel/plugin-transform-react-pure-annotations": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz", - "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz", + "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-regenerator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz", - "integrity": "sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", - "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-runtime": { @@ -23055,97 +23406,101 @@ } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", - "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-spread": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", - "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", + "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", - "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-template-literals": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", - "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", "requires": { - "@babel/helper-plugin-utils": "^7.13.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", - "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-typescript": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz", - "integrity": "sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.0.tgz", + "integrity": "sha512-WIIEazmngMEEHDaPTx0IZY48SaAmjVWe3TRSX7cmJXn0bEv9midFzAjxiruOWYIVf5iQ10vFx7ASDpgEO08L5w==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-typescript": "^7.12.13" + "@babel/helper-create-class-features-plugin": "^7.15.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-typescript": "^7.14.5" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", - "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", - "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/preset-env": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.10.tgz", - "integrity": "sha512-nOsTScuoRghRtUsRr/c69d042ysfPHcu+KOB4A9aAO9eJYqrkat+LF8G1yp1HD18QiwixT2CisZTr/0b3YZPXQ==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.0.tgz", + "integrity": "sha512-FhEpCNFCcWW3iZLg0L2NPE9UerdtsCR6ZcsGHUX6Om6kbCQeL5QZDqFDmeNHC6/fy6UH3jEge7K4qG5uC9In0Q==", "requires": { - "@babel/compat-data": "^7.13.8", - "@babel/helper-compilation-targets": "^7.13.10", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-proposal-async-generator-functions": "^7.13.8", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-dynamic-import": "^7.13.8", - "@babel/plugin-proposal-export-namespace-from": "^7.12.13", - "@babel/plugin-proposal-json-strings": "^7.13.8", - "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", - "@babel/plugin-proposal-numeric-separator": "^7.12.13", - "@babel/plugin-proposal-object-rest-spread": "^7.13.8", - "@babel/plugin-proposal-optional-catch-binding": "^7.13.8", - "@babel/plugin-proposal-optional-chaining": "^7.13.8", - "@babel/plugin-proposal-private-methods": "^7.13.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-async-generator-functions": "^7.14.9", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.14.5", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.14.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.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", @@ -23155,45 +23510,46 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.12.13", - "@babel/plugin-transform-arrow-functions": "^7.13.0", - "@babel/plugin-transform-async-to-generator": "^7.13.0", - "@babel/plugin-transform-block-scoped-functions": "^7.12.13", - "@babel/plugin-transform-block-scoping": "^7.12.13", - "@babel/plugin-transform-classes": "^7.13.0", - "@babel/plugin-transform-computed-properties": "^7.13.0", - "@babel/plugin-transform-destructuring": "^7.13.0", - "@babel/plugin-transform-dotall-regex": "^7.12.13", - "@babel/plugin-transform-duplicate-keys": "^7.12.13", - "@babel/plugin-transform-exponentiation-operator": "^7.12.13", - "@babel/plugin-transform-for-of": "^7.13.0", - "@babel/plugin-transform-function-name": "^7.12.13", - "@babel/plugin-transform-literals": "^7.12.13", - "@babel/plugin-transform-member-expression-literals": "^7.12.13", - "@babel/plugin-transform-modules-amd": "^7.13.0", - "@babel/plugin-transform-modules-commonjs": "^7.13.8", - "@babel/plugin-transform-modules-systemjs": "^7.13.8", - "@babel/plugin-transform-modules-umd": "^7.13.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", - "@babel/plugin-transform-new-target": "^7.12.13", - "@babel/plugin-transform-object-super": "^7.12.13", - "@babel/plugin-transform-parameters": "^7.13.0", - "@babel/plugin-transform-property-literals": "^7.12.13", - "@babel/plugin-transform-regenerator": "^7.12.13", - "@babel/plugin-transform-reserved-words": "^7.12.13", - "@babel/plugin-transform-shorthand-properties": "^7.12.13", - "@babel/plugin-transform-spread": "^7.13.0", - "@babel/plugin-transform-sticky-regex": "^7.12.13", - "@babel/plugin-transform-template-literals": "^7.13.0", - "@babel/plugin-transform-typeof-symbol": "^7.12.13", - "@babel/plugin-transform-unicode-escapes": "^7.12.13", - "@babel/plugin-transform-unicode-regex": "^7.12.13", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.14.5", + "@babel/plugin-transform-classes": "^7.14.9", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.14.5", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.15.0", + "@babel/plugin-transform-modules-systemjs": "^7.14.5", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.14.5", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.14.6", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.13.0", - "babel-plugin-polyfill-corejs2": "^0.1.4", - "babel-plugin-polyfill-corejs3": "^0.1.3", - "babel-plugin-polyfill-regenerator": "^0.1.2", - "core-js-compat": "^3.9.0", + "@babel/types": "^7.15.0", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.2", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.16.0", "semver": "^6.3.0" }, "dependencies": { @@ -23217,15 +23573,16 @@ } }, "@babel/preset-react": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.12.13.tgz", - "integrity": "sha512-TYM0V9z6Abb6dj1K7i5NrEhA13oS5ujUYQYDfqIBXYHOc2c2VkFgc+q9kyssIyUfy4/hEwqrgSlJ/Qgv8zJLsA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", + "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-transform-react-display-name": "^7.12.13", - "@babel/plugin-transform-react-jsx": "^7.12.13", - "@babel/plugin-transform-react-jsx-development": "^7.12.12", - "@babel/plugin-transform-react-pure-annotations": "^7.12.1" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-react-display-name": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.5", + "@babel/plugin-transform-react-jsx-development": "^7.14.5", + "@babel/plugin-transform-react-pure-annotations": "^7.14.5" } }, "@babel/preset-typescript": { @@ -23238,55 +23595,69 @@ } }, "@babel/runtime": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.5.tgz", - "integrity": "sha512-121rumjddw9c3NCQ55KGkyE1h/nzWhU/owjhw0l4mQrkzz4x9SGS1X8gFLraHwX7td3Yo4QTL+qj0NcIzN87BA==", + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz", + "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/runtime-corejs3": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.13.10.tgz", - "integrity": "sha512-x/XYVQ1h684pp1mJwOV4CyvqZXqbc8CMsMGUnAbuc82ZCdv1U63w5RSUzgDSXQHG5Rps/kiksH6g2D5BuaKyXg==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.9.tgz", + "integrity": "sha512-64RiH2ON4/y8qYtoa8rUiyam/tUVyGqRyNYhe+vCRGmjnV4bUlZvY+mwd0RrmLoCpJpdq3RsrNqKb7SJdw/4kw==", "requires": { - "core-js-pure": "^3.0.0", + "core-js-pure": "^3.16.0", "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" } }, "@babel/traverse": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.0.tgz", - "integrity": "sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", + "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.0", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.0", - "@babel/types": "^7.13.0", + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "globals": "^11.1.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "@babel/types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz", - "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", + "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" } }, @@ -23337,23 +23708,23 @@ "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" }, "@emotion/react": { - "version": "11.1.5", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.1.5.tgz", - "integrity": "sha512-xfnZ9NJEv9SU9K2sxXM06lzjK245xSeHRpUh67eARBm3PBHjjKIZlfWZ7UQvD0Obvw6ZKjlC79uHrlzFYpOB/Q==", + "version": "11.4.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.4.1.tgz", + "integrity": "sha512-pRegcsuGYj4FCdZN6j5vqCALkNytdrKw3TZMekTzNXixRg4wkLsU5QEaBG5LC6l01Vppxlp7FE3aTHpIG5phLg==", "requires": { - "@babel/runtime": "^7.7.2", - "@emotion/cache": "^11.1.3", - "@emotion/serialize": "^1.0.0", - "@emotion/sheet": "^1.0.1", + "@babel/runtime": "^7.13.10", + "@emotion/cache": "^11.4.0", + "@emotion/serialize": "^1.0.2", + "@emotion/sheet": "^1.0.2", "@emotion/utils": "^1.0.0", "@emotion/weak-memoize": "^0.2.5", "hoist-non-react-statics": "^3.3.1" } }, "@emotion/serialize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.1.tgz", - "integrity": "sha512-TXlKs5sgUKhFlszp/rg4lIAZd7UUSmJpwaf9/lAEFcUh2vPi32i7x4wk7O8TN8L8v2Ol8k0CxnhRBY0zQalTxA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.2.tgz", + "integrity": "sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==", "requires": { "@emotion/hash": "^0.8.0", "@emotion/memoize": "^0.7.4", @@ -23363,9 +23734,9 @@ } }, "@emotion/sheet": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.0.1.tgz", - "integrity": "sha512-GbIvVMe4U+Zc+929N1V7nW6YYJtidj31lidSmdYcWozwoBIObXBnaJkKNDjZrLm9Nc0BR+ZyHNaRZxqNZbof5g==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.0.2.tgz", + "integrity": "sha512-QQPB1B70JEVUHuNtzjHftMGv6eC3Y9wqavyarj4x4lg47RACkeSfNo5pxIOKizwS9AEFLohsqoaxGQj4p0vSIw==" }, "@emotion/unitless": { "version": "0.7.5", @@ -23383,14 +23754,14 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" }, "@eslint/eslintrc": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", - "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "requires": { "ajv": "^6.12.4", "debug": "^4.1.1", "espree": "^7.3.0", - "globals": "^12.1.0", + "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", "js-yaml": "^3.13.1", @@ -23398,12 +23769,20 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "requires": { - "type-fest": "^0.8.1" + "ms": "2.1.2" + } + }, + "globals": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "requires": { + "type-fest": "^0.20.2" } }, "ignore": { @@ -23411,59 +23790,64 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" } } }, "@fontsource/roboto": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-4.2.3.tgz", - "integrity": "sha512-lEnB089GcK3uU3d0MPjwYTUPZBhpKQ2HxvgC+0ib2ElJNISBoS3fHE2sKuZIcCeghWW0fX58OJrZiPgZ3essBg==" + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-4.5.0.tgz", + "integrity": "sha512-ja4XYw/9kNRFM5Ndk9vwzHWsdBMXczyBazFkTXJQ74QQBnT0BbSsHn0pF60AU0Iznig1Wt9x3rADfG8LANvMpw==" }, "@fortawesome/fontawesome-common-types": { - "version": "0.2.35", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.35.tgz", - "integrity": "sha512-IHUfxSEDS9dDGqYwIW7wTN6tn/O8E0n5PcAHz9cAaBoZw6UpG20IG/YM3NNLaGPwPqgjBAFjIURzqoQs3rrtuw==" + "version": "0.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", + "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==" }, "@fortawesome/fontawesome-svg-core": { - "version": "1.2.35", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.35.tgz", - "integrity": "sha512-uLEXifXIL7hnh2sNZQrIJWNol7cTVIzwI+4qcBIq9QWaZqUblm0IDrtSqbNg+3SQf8SMGHkiSigD++rHmCHjBg==", + "version": "1.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", + "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.35" + "@fortawesome/fontawesome-common-types": "^0.2.36" } }, "@fortawesome/free-brands-svg-icons": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-5.15.3.tgz", - "integrity": "sha512-1hirPcbjj72ZJtFvdnXGPbAbpn3Ox6mH3g5STbANFp3vGSiE5u5ingAKV06mK6ZVqNYxUPlh4DlTnaIvLtF2kw==", + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-5.15.4.tgz", + "integrity": "sha512-f1witbwycL9cTENJegcmcZRYyawAFbm8+c6IirLmwbbpqz46wyjbQYLuxOc7weXFXfB7QR8/Vd2u5R3q6JYD9g==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.35" + "@fortawesome/fontawesome-common-types": "^0.2.36" } }, "@fortawesome/free-regular-svg-icons": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.3.tgz", - "integrity": "sha512-q4/p8Xehy9qiVTdDWHL4Z+o5PCLRChePGZRTXkl+/Z7erDVL8VcZUuqzJjs6gUz6czss4VIPBRdCz6wP37/zMQ==", + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.4.tgz", + "integrity": "sha512-9VNNnU3CXHy9XednJ3wzQp6SwNwT3XaM26oS4Rp391GsxVYA+0oDR2J194YCIWf7jNRCYKjUCOduxdceLrx+xw==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.35" + "@fortawesome/fontawesome-common-types": "^0.2.36" } }, "@fortawesome/free-solid-svg-icons": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.3.tgz", - "integrity": "sha512-XPeeu1IlGYqz4VWGRAT5ukNMd4VHUEEJ7ysZ7pSSgaEtNvSo+FLurybGJVmiqkQdK50OkSja2bfZXOeyMGRD8Q==", + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", + "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.35" + "@fortawesome/fontawesome-common-types": "^0.2.36" } }, "@fortawesome/react-fontawesome": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.14.tgz", - "integrity": "sha512-4wqNb0gRLVaBm/h+lGe8UfPPivcbuJ6ecI4hIgW0LjI7kzpYB9FkN0L9apbVzg+lsBdcTf0AlBtODjcSX5mmKA==", + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.15.tgz", + "integrity": "sha512-/HFHdcoLESxxMkqZAcZ6RXDJ69pVApwdwRos/B2kiMWxDSAX2dFK8Er2/+rG+RsrzWB/dsAyjefLmemgmfE18g==", "requires": { "prop-types": "^15.7.2" } @@ -23502,6 +23886,36 @@ "@hapi/hoek": "^8.3.0" } }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==" + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -23612,6 +24026,22 @@ "strip-ansi": "^6.0.0" }, "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -23621,6 +24051,36 @@ "path-exists": "^4.0.0" } }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + } + }, "jest-resolve": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", @@ -23644,6 +24104,15 @@ "p-locate": "^4.1.0" } }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -23688,6 +24157,14 @@ "type-fest": "^0.8.1" } }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -23911,10 +24388,48 @@ "write-file-atomic": "^3.0.0" }, "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } } } }, @@ -23931,25 +24446,25 @@ } }, "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "requires": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" }, "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "requires": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, @@ -23990,9 +24505,20 @@ } }, "@popperjs/core": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.2.tgz", - "integrity": "sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q==" + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.3.tgz", + "integrity": "sha512-xDu17cEfh7Kid/d95kB6tZsLOmSWKCZKtprnhVepjsSaCij+lM3mItSJDuuHDMbCWTh8Ejmebwb+KONcCJ0eXQ==" + }, + "@reduxjs/toolkit": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.6.1.tgz", + "integrity": "sha512-pa3nqclCJaZPAyBhruQtiRwtTjottRrVJqziVZcWzI73i6L3miLTtUyWfauwv08HWtiXLx1xGyGt+yLFfW/d0A==", + "requires": { + "immer": "^9.0.1", + "redux": "^4.1.0", + "redux-thunk": "^2.3.0", + "reselect": "^4.0.0" + } }, "@restart/context": { "version": "2.1.4", @@ -24001,12 +24527,11 @@ "requires": {} }, "@restart/hooks": { - "version": "0.3.26", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.26.tgz", - "integrity": "sha512-7Hwk2ZMYm+JLWcb7R9qIXk1OoUg1Z+saKWqZXlrvFwT3w6UArVNWgxYOzf+PJoK9zZejp8okPAKTctthhXLt5g==", + "version": "0.3.27", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.27.tgz", + "integrity": "sha512-s984xV/EapUIfkjlf8wz9weP2O9TNKR96C68FfMEy2bE69+H4cNv3RD4Mf97lW7Htt7PjZrYTjSC8f3SB9VCXw==", "requires": { - "lodash": "^4.17.20", - "lodash-es": "^4.17.20" + "dequal": "^2.0.2" } }, "@rollup/plugin-node-resolve": { @@ -24022,9 +24547,9 @@ } }, "@rollup/plugin-replace": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.1.tgz", - "integrity": "sha512-XwC1oK5rrtRJ0tn1ioLHS6OV5JTluJF7QE1J/q1hN3bquwjnVxjtMyY9iCnoyH9DQbf92CxajB3o98wZbP3oAQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", "requires": { "@rollup/pluginutils": "^3.1.0", "magic-string": "^0.25.7" @@ -24048,9 +24573,9 @@ } }, "@sinonjs/commons": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.2.tgz", - "integrity": "sha512-sruwd86RJHdsVf/AtBoijDmUqJp3B6hF/DGC23C+JaegnDHaZyewCjoVGTdg3J0uz3Zs7NnIT05OBOmML72lQw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", "requires": { "type-detect": "4.0.8" } @@ -24181,15 +24706,15 @@ "loader-utils": "^2.0.0" } }, - "@types/anymatch": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", - "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==" + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" }, "@types/babel__core": { - "version": "7.1.14", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", - "integrity": "sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==", + "version": "7.1.15", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.15.tgz", + "integrity": "sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -24199,34 +24724,34 @@ } }, "@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", + "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "@types/babel__traverse": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.1.tgz", - "integrity": "sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", "requires": { "@babel/types": "^7.3.0" } }, "@types/bootstrap": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.0.15.tgz", - "integrity": "sha512-ETmmPf2DvCfNvemlgbX/dCbxVufCU0PrGT0YQ8gjOCgKYR5AfV9lVjBmWdA7L6mJIGvKFFJr0ZmZKP4Dp1k+5g==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.1.0.tgz", + "integrity": "sha512-cR+eQJ/IrgcJZheb7xkKPiPNOa48zkc6fLZ4U9lDNNQp3qiiq3tW1xgrd+VzVJCram/Bnh+DdBsdsPdXKIYClA==", "requires": { "@popperjs/core": "^2.9.2", "@types/jquery": "*" @@ -24238,49 +24763,49 @@ "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==" }, "@types/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-NaIeSIBiFgSC6IGUBjZWcscUJEq7vpVu7KthHN8eieTV9d9MqkSOZLH4chq1PmcKy06PNe3axLeKmRIyxJ+PZQ==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-2.0.1.tgz", + "integrity": "sha512-6K8LaFlztlhZO7mwsZg7ClRsdLg3FJRzIIi6SZXDWmmSJc2x8dd2VkESbLXdk3p8cuvz71f36S0y8Zv2AxqvQw==" }, "@types/d3-scale": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-3.2.2.tgz", - "integrity": "sha512-qpQe8G02tzUwt9sdWX1h8A/W0Q1+N48wMnYXVOkrzeLUkCfvzJYV9Ee3aORCS4dN4ONRLFmMvaXdziQ29XGLjQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-3.3.2.tgz", + "integrity": "sha512-gGqr7x1ost9px3FvIfUMi5XA/F/yAf4UkUDtdQhpH92XCT0Oa7zkkRzY61gPVJq+DxpHn/btouw5ohWkbBsCzQ==", "requires": { - "@types/d3-time": "*" + "@types/d3-time": "^2" } }, "@types/d3-shape": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-2.0.0.tgz", - "integrity": "sha512-NLzD02m5PiD1KLEDjLN+MtqEcFYn4ZL9+Rqc9ZwARK1cpKZXd91zBETbe6wpBB6Ia0D0VZbpmbW3+BsGPGnCpA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-2.1.3.tgz", + "integrity": "sha512-HAhCel3wP93kh4/rq+7atLdybcESZ5bRHDEZUojClyZWsRuEMo3A52NGYJSh48SxfxEU6RZIVbZL2YFZ2OAlzQ==", "requires": { - "@types/d3-path": "^1" + "@types/d3-path": "^2" } }, "@types/d3-time": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-2.0.0.tgz", - "integrity": "sha512-Abz8bTzy8UWDeYs9pCa3D37i29EWDjNTjemdk0ei1ApYVNqulYlGUKip/jLOpogkPSsPz/GvZCYiC7MFlEk0iQ==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-2.1.1.tgz", + "integrity": "sha512-9MVYlmIgmRR31C5b4FVSWtuMmBHh2mOWQYfl7XAYOa8dsnb7iEmUmRSWSFgXFtkjxO65d7hTUHQC+RhR/9IWFg==" }, "@types/eslint": { - "version": "7.2.7", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.7.tgz", - "integrity": "sha512-EHXbc1z2GoQRqHaAT7+grxlTJ3WE2YNeD6jlpPoRc83cCoThRY+NUWjCUZaYmk51OICkPXn2hhphcWcWXgNW0Q==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", + "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", "requires": { "@types/estree": "*", "@types/json-schema": "*" } }, "@types/estree": { - "version": "0.0.46", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", - "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==" + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==" }, "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", "requires": { "@types/minimatch": "*", "@types/node": "*" @@ -24295,9 +24820,9 @@ } }, "@types/history": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.8.tgz", - "integrity": "sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA==" + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.9.tgz", + "integrity": "sha512-MUc6zSmU3tEVnkQ78q0peeEjKWPUADMlC/t++2bI8WnAG2tvYRPIgHG8lWkXwqc8MsUF6Z2MOf+Mh5sazOmhiQ==" }, "@types/hoist-non-react-statics": { "version": "3.3.1", @@ -24309,9 +24834,9 @@ } }, "@types/html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", + "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==" }, "@types/invariant": { "version": "2.2.34", @@ -24332,50 +24857,54 @@ } }, "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "requires": { "@types/istanbul-lib-report": "*" } }, + "@types/jest": { + "version": "26.0.24", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", + "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", + "requires": { + "jest-diff": "^26.0.0", + "pretty-format": "^26.0.0" + } + }, "@types/jquery": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.5.tgz", - "integrity": "sha512-6RXU9Xzpc6vxNrS6FPPapN1SxSHgQ336WC6Jj/N8q30OiaBZ00l1GBgeP7usjVZPivSkGUfL1z/WW6TX989M+w==", + "version": "3.5.6", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.6.tgz", + "integrity": "sha512-SmgCQRzGPId4MZQKDj9Hqc6kSXFNWZFHpELkyK8AQhf8Zr6HKfCzFv9ZC1Fv3FyQttJZOlap3qYb12h61iZAIg==", "requires": { "@types/sizzle": "*" } }, "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==" - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" }, "@types/lodash": { - "version": "4.14.168", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", - "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==" + "version": "4.14.172", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.172.tgz", + "integrity": "sha512-/BHF5HAx3em7/KkzVKm3LrsD6HZAXuXO1AJZQ3cRRBZj4oHZDviWPYu0aEplAqDFNHZPW6d3G7KN+ONcCCC7pw==" }, "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" }, "@types/node": { - "version": "15.12.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.5.tgz", - "integrity": "sha512-se3yX7UHv5Bscf8f1ERKvQOD6sTyycH3hdaoozvaLxgUiY5lIGEeH37AD0G0Qi9kPqihPn0HOfd2yaIEN9VwEg==" + "version": "15.14.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.14.7.tgz", + "integrity": "sha512-FA45p37/mLhpebgbPWWCKfOisTjxGK9lwcHlJ6XVLfu3NgfcazOJHdYUZCWPMK8QX4LhNZdmfo6iMz9FqpUbaw==" }, "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==" + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" }, "@types/parse-json": { "version": "4.0.0", @@ -24383,24 +24912,24 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "@types/prettier": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", - "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.2.tgz", + "integrity": "sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==" }, "@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" + "version": "15.7.4", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", + "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" }, "@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" }, "@types/react": { - "version": "16.14.5", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.5.tgz", - "integrity": "sha512-YRRv9DNZhaVTVRh9Wmmit7Y0UFhEVqXqCSw3uazRWMxa2x85hWQZ5BN24i7GXZbaclaLXEcodEeIHsjBA8eAMw==", + "version": "16.14.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.12.tgz", + "integrity": "sha512-7nOJgNsRbARhZhvwPm7cnzahtzEi5VJ9OvcQk8ExEEb1t+zaFklwLVkJz7G1kfxX4X/mDa/icTmzE0vTmqsqBg==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -24416,9 +24945,9 @@ } }, "@types/react-helmet": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.1.tgz", - "integrity": "sha512-VmSCMz6jp/06DABoY60vQa++h1YFt0PfAI23llxBJHbowqFgLUL0dhS1AQeVPNqYfRp9LAfokrfWACTNeobOrg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.2.tgz", + "integrity": "sha512-dcfAZNlWb5JYFbO9CGfrPWLJAyFcT6UeR3u35eBbv8liY2Rg4K7fM1G5+HnwVgot+C+kVwXAZ8pLEn2jsMfTDg==", "requires": { "@types/react": "*" } @@ -24435,18 +24964,18 @@ } }, "@types/react-router": { - "version": "5.1.12", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.12.tgz", - "integrity": "sha512-0bhXQwHYfMeJlCh7mGhc0VJTRm0Gk+Z8T00aiP4702mDUuLs9SMhnd2DitpjWFjdOecx2UXtICK14H9iMnziGA==", + "version": "5.1.16", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.16.tgz", + "integrity": "sha512-8d7nR/fNSqlTFGHti0R3F9WwIertOaaA1UEB8/jr5l5mDMOs4CidEgvvYMw4ivqrBK+vtVLxyTj2P+Pr/dtgzg==", "requires": { "@types/history": "*", "@types/react": "*" } }, "@types/react-router-dom": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.7.tgz", - "integrity": "sha512-D5mHD6TbdV/DNHYsnwBTv+y73ei+mMjrkGrla86HthE4/PVvL1J94Bu3qABU+COXzpL23T1EZapVVpwHuBXiUg==", + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.8.tgz", + "integrity": "sha512-03xHyncBzG0PmDmf8pf3rehtjY0NpUj7TIN46FrT5n1ZWHPZvXz32gUyNboJ+xsL8cpg8bQVLcllptcQHvocrw==", "requires": { "@types/history": "*", "@types/react": "*", @@ -24454,9 +24983,9 @@ } }, "@types/react-select": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@types/react-select/-/react-select-4.0.15.tgz", - "integrity": "sha512-GPyBFYGMVFCtF4eg9riodEco+s2mflR10Nd5csx69+bcdvX6Uo9H/jgrIqovBU9yxBppB9DS66OwD6xxgVqOYQ==", + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@types/react-select/-/react-select-4.0.17.tgz", + "integrity": "sha512-ZK5wcBhJaqC8ntQl0CJvK2KXNNsk1k5flM7jO+vNPPlceRzdJQazA6zTtQUyNr6exp5yrAiwiudtYxgGlgGHLg==", "requires": { "@emotion/serialize": "^1.0.0", "@types/react": "*", @@ -24465,59 +24994,25 @@ } }, "@types/react-table": { - "version": "7.0.29", - "resolved": "https://registry.npmjs.org/@types/react-table/-/react-table-7.0.29.tgz", - "integrity": "sha512-RCGVKGlTDv3jbj37WJ5HhN3sPb0W/2rqlvyGUtvawnnyrxgI2BGgASvU93rq2jwanVp5J9l1NYAeiGlNhdaBGw==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@types/react-table/-/react-table-7.7.2.tgz", + "integrity": "sha512-NwB78t3YV5pZ1NK3m2vylb/d0DKVyWH4y4GMCtlE4tg2n5ENM4ejzKnT46YKuqG2cPjWc+PIxuRVMd5OYX1z4A==", "requires": { "@types/react": "*" } }, "@types/react-transition-group": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.1.tgz", - "integrity": "sha512-vIo69qKKcYoJ8wKCJjwSgCTM+z3chw3g18dkrDfVX665tMH7tmbDxEAnPdey4gTlwZz5QuHGzd+hul0OVZDqqQ==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-KibDWL6nshuOJ0fu8ll7QnV/LVTo3PzQ9aCPnRUYPfX7eZohHwLIdNHj7pftanREzHNP4/nJa8oeM73uSiavMQ==", "requires": { "@types/react": "*" } }, - "@types/redux-actions": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@types/redux-actions/-/redux-actions-2.6.1.tgz", - "integrity": "sha512-zKgK+ATp3sswXs6sOYo1tk8xdXTy4CTaeeYrVQlClCjeOpag5vzPo0ASWiiBJ7vsiQRAdb3VkuFLnDoBimF67g==" - }, - "@types/redux-logger": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/redux-logger/-/redux-logger-3.0.8.tgz", - "integrity": "sha512-zM+cxiSw6nZtRbxpVp9SE3x/X77Z7e7YAfHD1NkxJyJbAGSXJGF0E9aqajZfPOa/sTYnuwutmlCldveExuCeLw==", - "requires": { - "redux": "^4.0.0" - } - }, - "@types/redux-promise": { - "version": "0.5.29", - "resolved": "https://registry.npmjs.org/@types/redux-promise/-/redux-promise-0.5.29.tgz", - "integrity": "sha512-lCBCTiJCweYtW5YgOIAG400dAi2Cr2IW6mfh1eZ8WqgxTRqPZjLAFQzxQ6oRZaB9g8mdzr28vOc3CAo8y/Na2w==", - "requires": { - "redux": "^3.6.0" - }, - "dependencies": { - "redux": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", - "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", - "requires": { - "lodash": "^4.2.1", - "lodash-es": "^4.2.1", - "loose-envify": "^1.1.0", - "symbol-observable": "^1.0.3" - } - } - } - }, "@types/resize-observer-browser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.5.tgz", - "integrity": "sha512-8k/67Z95Goa6Lznuykxkfhq9YU3l1Qe6LNZmwde1u7802a3x8v44oq0j91DICclxatTr0rNnhXx7+VTIetSrSQ==" + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.6.tgz", + "integrity": "sha512-61IfTac0s9jvNtBCpyo86QeaN8qqpMGHdK0uGKCCIy2dt5/Yk84VduHIdWAcmkC5QvdkPL0p5eWYgUZtHKKUVg==" }, "@types/resolve": { "version": "0.0.8", @@ -24528,14 +25023,14 @@ } }, "@types/scheduler": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", - "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, "@types/sizzle": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz", - "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==" + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==" }, "@types/source-list-map": { "version": "0.1.2", @@ -24543,19 +25038,19 @@ "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" }, "@types/stack-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" }, "@types/tapable": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz", - "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==" + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", + "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==" }, "@types/uglify-js": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.0.tgz", - "integrity": "sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", + "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", "requires": { "source-map": "^0.6.1" }, @@ -24573,15 +25068,15 @@ "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=" }, "@types/webpack": { - "version": "4.41.26", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.26.tgz", - "integrity": "sha512-7ZyTfxjCRwexh+EJFwRUM+CDB2XvgHl4vfuqf1ZKrgGvcS5BrNvPQqJh3tsZ0P6h6Aa1qClVHaJZszLPzpqHeA==", + "version": "4.41.30", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.30.tgz", + "integrity": "sha512-GUHyY+pfuQ6haAfzu4S14F+R5iGRwN6b2FRNJY7U0NilmFAqbsOfK6j1HwuLBAqwRIT+pVdNDJGJ6e8rpp0KHA==", "requires": { - "@types/anymatch": "*", "@types/node": "*", - "@types/tapable": "*", + "@types/tapable": "^1", "@types/uglify-js": "*", "@types/webpack-sources": "*", + "anymatch": "^3.0.0", "source-map": "^0.6.0" }, "dependencies": { @@ -24593,9 +25088,9 @@ } }, "@types/webpack-sources": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", - "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", "requires": { "@types/node": "*", "@types/source-list-map": "*", @@ -24610,91 +25105,151 @@ } }, "@types/yargs": { - "version": "15.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", + "version": "15.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", + "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==" + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==" }, "@typescript-eslint/eslint-plugin": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.18.0.tgz", - "integrity": "sha512-Lzkc/2+7EoH7+NjIWLS2lVuKKqbEmJhtXe3rmfA8cyiKnZm3IfLf51irnBcmow8Q/AptVV0XBZmBJKuUJTe6cQ==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.1.tgz", + "integrity": "sha512-AHqIU+SqZZgBEiWOrtN94ldR3ZUABV5dUG94j8Nms9rQnHFc8fvDOue/58K4CFz6r8OtDDc35Pw9NQPWo0Ayrw==", "requires": { - "@typescript-eslint/experimental-utils": "4.18.0", - "@typescript-eslint/scope-manager": "4.18.0", - "debug": "^4.1.1", + "@typescript-eslint/experimental-utils": "4.29.1", + "@typescript-eslint/scope-manager": "4.29.1", + "debug": "^4.3.1", "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } } }, "@typescript-eslint/experimental-utils": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.18.0.tgz", - "integrity": "sha512-92h723Kblt9JcT2RRY3QS2xefFKar4ZQFVs3GityOKWQYgtajxt/tuXIzL7sVCUlM1hgreiV5gkGYyBpdOwO6A==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.1.tgz", + "integrity": "sha512-kl6QG6qpzZthfd2bzPNSJB2YcZpNOrP6r9jueXupcZHnL74WiuSjaft7WSu17J9+ae9zTlk0KJMXPUj0daBxMw==", "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.18.0", - "@typescript-eslint/types": "4.18.0", - "@typescript-eslint/typescript-estree": "4.18.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.29.1", + "@typescript-eslint/types": "4.29.1", + "@typescript-eslint/typescript-estree": "4.29.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" } }, "@typescript-eslint/parser": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.18.0.tgz", - "integrity": "sha512-W3z5S0ZbecwX3PhJEAnq4mnjK5JJXvXUDBYIYGoweCyWyuvAKfGHvzmpUzgB5L4cRBb+cTu9U/ro66dx7dIimA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.29.1.tgz", + "integrity": "sha512-3fL5iN20hzX3Q4OkG7QEPFjZV2qsVGiDhEwwh+EkmE/w7oteiOvUNzmpu5eSwGJX/anCryONltJ3WDmAzAoCMg==", "requires": { - "@typescript-eslint/scope-manager": "4.18.0", - "@typescript-eslint/types": "4.18.0", - "@typescript-eslint/typescript-estree": "4.18.0", - "debug": "^4.1.1" + "@typescript-eslint/scope-manager": "4.29.1", + "@typescript-eslint/types": "4.29.1", + "@typescript-eslint/typescript-estree": "4.29.1", + "debug": "^4.3.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "@typescript-eslint/scope-manager": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.18.0.tgz", - "integrity": "sha512-olX4yN6rvHR2eyFOcb6E4vmhDPsfdMyfQ3qR+oQNkAv8emKKlfxTWUXU5Mqxs2Fwe3Pf1BoPvrwZtwngxDzYzQ==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.29.1.tgz", + "integrity": "sha512-Hzv/uZOa9zrD/W5mftZa54Jd5Fed3tL6b4HeaOpwVSabJK8CJ+2MkDasnX/XK4rqP5ZTWngK1ZDeCi6EnxPQ7A==", "requires": { - "@typescript-eslint/types": "4.18.0", - "@typescript-eslint/visitor-keys": "4.18.0" + "@typescript-eslint/types": "4.29.1", + "@typescript-eslint/visitor-keys": "4.29.1" } }, "@typescript-eslint/types": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.18.0.tgz", - "integrity": "sha512-/BRociARpj5E+9yQ7cwCF/SNOWwXJ3qhjurMuK2hIFUbr9vTuDeu476Zpu+ptxY2kSxUHDGLLKy+qGq2sOg37A==" + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.29.1.tgz", + "integrity": "sha512-Jj2yu78IRfw4nlaLtKjVaGaxh/6FhofmQ/j8v3NXmAiKafbIqtAPnKYrf0sbGjKdj0hS316J8WhnGnErbJ4RCA==" }, "@typescript-eslint/typescript-estree": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.18.0.tgz", - "integrity": "sha512-wt4xvF6vvJI7epz+rEqxmoNQ4ZADArGQO9gDU+cM0U5fdVv7N+IAuVoVAoZSOZxzGHBfvE3XQMLdy+scsqFfeg==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.1.tgz", + "integrity": "sha512-lIkkrR9E4lwZkzPiRDNq0xdC3f2iVCUjw/7WPJ4S2Sl6C3nRWkeE1YXCQ0+KsiaQRbpY16jNaokdWnm9aUIsfw==", "requires": { - "@typescript-eslint/types": "4.18.0", - "@typescript-eslint/visitor-keys": "4.18.0", - "debug": "^4.1.1", - "globby": "^11.0.1", + "@typescript-eslint/types": "4.29.1", + "@typescript-eslint/visitor-keys": "4.29.1", + "debug": "^4.3.1", + "globby": "^11.0.3", "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } } }, "@typescript-eslint/visitor-keys": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.18.0.tgz", - "integrity": "sha512-Q9t90JCvfYaN0OfFUgaLqByOfz8yPeTAdotn/XYNm5q9eHax90gzdb+RJ6E9T5s97Kv/UHWKERTmqA0jTKAEHw==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.1.tgz", + "integrity": "sha512-zLqtjMoXvgdZY/PG6gqA73V8BjqPs4af1v2kiiETBObp+uC6gRYnJLmJHxC0QyUrrHDLJPIWNYxoBV3wbcRlag==", "requires": { - "@typescript-eslint/types": "4.18.0", + "@typescript-eslint/types": "4.29.1", "eslint-visitor-keys": "^2.0.0" } }, @@ -24894,9 +25449,9 @@ } }, "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "requires": {} }, "acorn-walk": { @@ -24918,6 +25473,29 @@ "regex-parser": "^2.2.11" } }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -24961,11 +25539,11 @@ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" }, "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "requires": { - "type-fest": "^0.11.0" + "type-fest": "^0.21.3" } }, "ansi-html": { @@ -24987,9 +25565,9 @@ } }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -25106,14 +25684,6 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, "asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -25156,11 +25726,6 @@ } } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -25223,20 +25788,10 @@ "postcss-value-parser": "^4.1.0" } }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, "axe-core": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.1.3.tgz", - "integrity": "sha512-vwPpH4Aj4122EW38mxO/fxhGKtwWTMLDIJfZ1He0Edbtjcfna/R3YB67yVhezUMzqc3Jr3+Ii50KRntlENL4xQ==" + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.2.tgz", + "integrity": "sha512-5LMaDRWm8ZFPAEdzTYmgjjEdj1YnQcpfrVajO/sn/LhbpGp0Y0H64c2hLZI1gRMxfA+w1S71Uc/nHaOXgcCvGg==" }, "axios": { "version": "0.21.1", @@ -25388,12 +25943,12 @@ "requires": {} }, "babel-plugin-polyfill-corejs2": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz", - "integrity": "sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", "requires": { - "@babel/compat-data": "^7.13.0", - "@babel/helper-define-polyfill-provider": "^0.1.5", + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", "semver": "^6.1.1" }, "dependencies": { @@ -25405,20 +25960,20 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz", - "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz", + "integrity": "sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.1.5", - "core-js-compat": "^3.8.1" + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.14.0" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz", - "integrity": "sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.1.5" + "@babel/helper-define-polyfill-provider": "^0.2.2" } }, "babel-plugin-syntax-object-rest-spread": { @@ -25490,6 +26045,29 @@ "babel-plugin-transform-react-remove-prop-types": "0.4.24" }, "dependencies": { + "@babel/core": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, "@babel/plugin-proposal-class-properties": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", @@ -25623,19 +26201,19 @@ }, "dependencies": { "@babel/plugin-transform-react-jsx-self": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.13.tgz", - "integrity": "sha512-FXYw98TTJ125GVCCkFLZXlZ1qGcsYqNQhVBQcZjyrwf8FEUtVfKIoidnO8S0q+KBQpDYNTmiGo1gn67Vti04lQ==", + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.14.9.tgz", + "integrity": "sha512-Fqqu0f8zv9W+RyOnx29BX/RlEsBRANbOf5xs5oxb2aHP4FKbLXxIaVPUiCti56LAR1IixMH4EyaixhUsKqoBHw==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-react-jsx-source": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.13.tgz", - "integrity": "sha512-O5JJi6fyfih0WfDgIJXksSPhGP/G0fQpfxYy87sDc+1sFmsCS6wr3aAn+whbzkhbjtq4VMqLRaSzR6IsshIC0Q==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.14.5.tgz", + "integrity": "sha512-1TpSDnD9XR/rQ2tzunBVPThF5poaYT9GqP+of8fAtguYuI/dm2RkrMBDemsxtY0XBzvW7nXjYM0hRyKX9QYj7Q==", "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.14.5" } } } @@ -25648,6 +26226,19 @@ "regenerator-runtime": "^0.13.4" } }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -25687,9 +26278,9 @@ "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base": { "version": "0.11.2", @@ -25730,14 +26321,6 @@ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, "bfj": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", @@ -25799,24 +26382,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" } } }, @@ -25854,11 +26419,35 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "requires": { - "fill-range": "^7.0.1" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + } } }, "brorand": { @@ -25930,6 +26519,16 @@ "safe-buffer": "^5.2.0" }, "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -25946,15 +26545,15 @@ } }, "browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "version": "4.16.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.7.tgz", + "integrity": "sha512-7I4qVwqZltJ7j37wObBe3SoTz+nS8APaNcrBOlgoirb6/HbEU2XxW/LpUDTCngM6iauwFqmRTuOMfyKnFGY5JA==", "requires": { - "caniuse-lite": "^1.0.30001181", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.649", + "caniuse-lite": "^1.0.30001248", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.793", "escalade": "^3.1.1", - "node-releases": "^1.1.70" + "node-releases": "^1.1.73" } }, "bser": { @@ -25983,9 +26582,9 @@ } }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "buffer-indexof": { "version": "1.1.1", @@ -26013,9 +26612,9 @@ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, "cacache": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", - "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.2.0.tgz", + "integrity": "sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw==", "requires": { "@npmcli/move-file": "^1.0.1", "chownr": "^2.0.0", @@ -26031,7 +26630,7 @@ "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", - "ssri": "^8.0.0", + "ssri": "^8.0.1", "tar": "^6.0.2", "unique-filename": "^1.1.1" }, @@ -26122,9 +26721,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001203", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001203.tgz", - "integrity": "sha512-/I9tvnzU/PHMH7wBPrfDMSuecDeUKerjCPX7D0xBbaJZPxoT9m+yYxt0zCTkcijCkjTdim3H56Zm0i5Adxch4w==" + "version": "1.0.30001249", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001249.tgz", + "integrity": "sha512-vcX4U8lwVXPdqzPWi6cAJ3FnQaqXbBqy/GZseKNQzRj37J7qZdGcBtxq/QLFNLLlfsoXLUdHw8Iwenri86Tagw==" }, "capture-exit": { "version": "2.0.0", @@ -26139,15 +26738,10 @@ "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==" }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -26164,18 +26758,49 @@ "integrity": "sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ==" }, "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + } } }, "chownr": { @@ -26184,19 +26809,9 @@ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" }, "ci-info": { "version": "2.0.0", @@ -26405,12 +27020,12 @@ } }, "color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", - "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.4" + "color-convert": "^1.9.3", + "color-string": "^1.6.0" }, "dependencies": { "color-convert": { @@ -26442,9 +27057,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", + "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -26517,21 +27132,6 @@ "on-headers": "~1.0.2", "safe-buffer": "5.1.2", "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } } }, "concat-map": { @@ -26548,35 +27148,6 @@ "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "confusing-browser-globals": { @@ -26599,11 +27170,6 @@ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" - }, "content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", @@ -26618,9 +27184,9 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "requires": { "safe-buffer": "~5.1.1" } @@ -26664,16 +27230,16 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "core-js": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.9.1.tgz", - "integrity": "sha512-gSjRvzkxQc1zjM/5paAmL4idJBFzuJoo+jDjF1tStYFMV2ERfD02HhahhCGXUyHxQRG4yFKVSdO6g62eoRMcDg==" + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.16.1.tgz", + "integrity": "sha512-AAkP8i35EbefU+JddyWi12AWE9f2N/qr/pwnDtWz4nyUIBGMJPX99ANFFRSw6FefM374lDujdtLDyhN2A/btHw==" }, "core-js-compat": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.9.1.tgz", - "integrity": "sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA==", + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.16.1.tgz", + "integrity": "sha512-NHXQXvRbd4nxp9TEmooTJLUf94ySUG6+DSsscBpTftN1lQLQ4LjnWvc7AoIo4UjDsFF3hB8Uh5LLCRRdaiT5MQ==", "requires": { - "browserslist": "^4.16.3", + "browserslist": "^4.16.7", "semver": "7.0.0" }, "dependencies": { @@ -26685,9 +27251,9 @@ } }, "core-js-pure": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.9.1.tgz", - "integrity": "sha512-laz3Zx0avrw9a4QEIdmIblnVuJz8W51leY9iLThatCsFawWxC3sE4guASC78JbCin+DkwMpCdp1AVAuzL/GN7A==" + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.16.1.tgz", + "integrity": "sha512-TyofCdMzx0KMhi84mVRS8rL1XsRk2SPUNz2azmth53iRN0/08Uim9fdhQTaZTG1LqaXHYVci4RDHka6WrXfnvg==" }, "core-util-is": { "version": "1.0.2", @@ -26874,14 +27440,15 @@ } }, "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", "requires": { "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" } }, "css-select-base-adapter": { @@ -26911,9 +27478,9 @@ "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==" }, "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==" }, "cssdb": { "version": "4.4.0", @@ -26926,12 +27493,12 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", "requires": { "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", + "cssnano-preset-default": "^4.0.8", "is-resolvable": "^1.0.0", "postcss": "^7.0.0" }, @@ -26973,9 +27540,9 @@ } }, "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", "requires": { "css-declaration-sorter": "^4.0.1", "cssnano-util-raw-cache": "^4.0.1", @@ -27005,7 +27572,7 @@ "postcss-ordered-values": "^4.1.2", "postcss-reduce-initial": "^4.0.3", "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", + "postcss-svgo": "^4.0.3", "postcss-unique-selectors": "^4.0.1" } }, @@ -27041,9 +27608,9 @@ }, "dependencies": { "css-tree": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", - "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "requires": { "mdn-data": "2.0.14", "source-map": "^0.6.1" @@ -27082,9 +27649,9 @@ } }, "csstype": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.7.tgz", - "integrity": "sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g==" + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" }, "cyclist": { "version": "1.0.1", @@ -27101,9 +27668,9 @@ } }, "d3-array": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.0.tgz", - "integrity": "sha512-T6H/qNldyD/1OlRkJbonb3u3MPhNwju8OPxYv0YSjDb/B2RUeeBEHzIpNrYiinwpmz8+am+puMrpcrDWgY9wRg==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", "requires": { "internmap": "^1.0.0" } @@ -27132,14 +27699,14 @@ "integrity": "sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA==" }, "d3-scale": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.3.tgz", - "integrity": "sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.3.0.tgz", + "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", "requires": { "d3-array": "^2.3.0", "d3-format": "1 - 2", "d3-interpolate": "1.2.0 - 2", - "d3-time": "1 - 2", + "d3-time": "^2.1.1", "d3-time-format": "2 - 3" } }, @@ -27152,9 +27719,12 @@ } }, "d3-time": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.0.0.tgz", - "integrity": "sha512-2mvhstTFcMvwStWd9Tj3e6CEqtOivtD8AUiHT8ido/xmzrI9ijrUUihZ6nHuf/vsScRBonagOdj0Vv+SEL5G3Q==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz", + "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", + "requires": { + "d3-array": "2" + } }, "d3-time-format": { "version": "3.0.0", @@ -27165,17 +27735,9 @@ } }, "damerau-levenshtein": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", - "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==" - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", + "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==" }, "data-urls": { "version": "2.0.0", @@ -27188,11 +27750,11 @@ } }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "ms": "2.1.2" + "ms": "2.0.0" } }, "decamelize": { @@ -27201,9 +27763,9 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==" + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" }, "decimal.js-light": { "version": "2.5.1", @@ -27220,11 +27782,6 @@ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" }, - "deep-diff": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz", - "integrity": "sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ=" - }, "deep-equal": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", @@ -27420,6 +27977,11 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, + "dequal": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz", + "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==" + }, "des.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", @@ -27440,9 +28002,9 @@ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" }, "detect-node": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.5.tgz", - "integrity": "sha512-qi86tE6hRcFHy8jI1m2VG+LaPUR1LhqDa5G8tVjuUXmOrpuAgqsA1pN0+ldgr3aKUH+QLI9hCY/OcRYisERejw==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, "detect-port-alt": { "version": "1.1.6", @@ -27451,21 +28013,6 @@ "requires": { "address": "^1.0.1", "debug": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } } }, "diff-sequences": { @@ -27504,9 +28051,9 @@ "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" }, "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", "requires": { "ip": "^1.1.0", "safe-buffer": "^5.0.1" @@ -27529,9 +28076,9 @@ } }, "dom-align": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.0.tgz", - "integrity": "sha512-YkoezQuhp3SLFGdOlr5xkqZ640iXrnHAwVYcDg8ZKRUtO7mSzSC2BA5V0VuyAwPSJA4CLIc6EDDJh4bEsD2+zA==" + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.2.tgz", + "integrity": "sha512-pHuazgqrsTFrGU2WLDdXxCFabkdQDx72ddkraZNih1KsMcN5qsRSTR9O4VJRlwTPCPb5COYg3LOfiMHHcPInHg==" }, "dom-converter": { "version": "0.2.0", @@ -27551,19 +28098,13 @@ } }, "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", "requires": { "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", - "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==" - } } }, "domain-browser": { @@ -27572,9 +28113,9 @@ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" }, "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" }, "domexception": { "version": "2.0.1", @@ -27592,20 +28133,21 @@ } }, "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", "requires": { - "domelementtype": "1" + "domelementtype": "^2.2.0" } }, "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" } }, "dot-case": { @@ -27656,44 +28198,6 @@ "inherits": "^2.0.1", "readable-stream": "^2.0.0", "stream-shift": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" } }, "ee-first": { @@ -27707,9 +28211,9 @@ "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" }, "electron-to-chromium": { - "version": "1.3.693", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.693.tgz", - "integrity": "sha512-vUdsE8yyeu30RecppQtI+XTz2++LWLVEIYmzeCaCRLSdtKZ2eXqdJcrs85KwLiPOPVc6PELgWyXBsfqIvzGZag==" + "version": "1.3.799", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.799.tgz", + "integrity": "sha512-V2rbYWdGvSqrg+95KjkVuSi41bGfrhrOzjl1tSi2VLnm0mRe3FsSvhiqidSiSll9WiMhrQAhpDcW/wcqK3c+Yw==" }, "elliptic": { "version": "6.5.4", @@ -27774,6 +28278,21 @@ "parseuri": "0.0.6", "ws": "~7.4.2", "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "engine.io-parser": { @@ -27794,11 +28313,6 @@ "tapable": "^1.0.0" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "memory-fs": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", @@ -27807,28 +28321,6 @@ "errno": "^0.1.3", "readable-stream": "^2.0.1" } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } } } }, @@ -27870,9 +28362,9 @@ } }, "es-abstract": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", - "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "version": "1.18.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz", + "integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==", "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", @@ -27880,16 +28372,17 @@ "get-intrinsic": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", "is-callable": "^1.2.3", "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.2", - "is-string": "^1.0.5", - "object-inspect": "^1.9.0", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.11.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.0" + "unbox-primitive": "^1.0.1" } }, "es-to-primitive": { @@ -27942,9 +28435,9 @@ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "escodegen": { "version": "2.0.0", @@ -28007,27 +28500,30 @@ } }, "eslint": { - "version": "7.22.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.22.0.tgz", - "integrity": "sha512-3VawOtjSJUQiiqac8MQc+w457iGLfuNGLFn8JmF051tTKbh5/x/0vlcEj8OgDCaw7Ysa2Jn8paGshV7x2abKXg==", + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "requires": { "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.0", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", "eslint-scope": "^5.1.1", "eslint-utils": "^2.1.0", "eslint-visitor-keys": "^2.0.0", "espree": "^7.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", + "glob-parent": "^5.1.2", "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", @@ -28036,7 +28532,7 @@ "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.21", + "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", @@ -28045,7 +28541,7 @@ "semver": "^7.2.1", "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", - "table": "^6.0.4", + "table": "^6.0.9", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, @@ -28058,10 +28554,33 @@ "@babel/highlight": "^7.10.4" } }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } + } + }, "globals": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.7.0.tgz", - "integrity": "sha512-Aipsz6ZKRxa/xQkZhNg0qIWXT6x6rD46f6x/PCnBomlttdIyAPak4YD9jTmKpZ72uROSMU87qJtcgpgHaVchiA==", + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", "requires": { "type-fest": "^0.20.2" } @@ -28071,6 +28590,11 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -28087,44 +28611,53 @@ } }, "eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.5.tgz", + "integrity": "sha512-XMoPKjSpXbkeJ7ZZ9icLnJMTY5Mc1kZbCakHquaFsXPpyWOwK0TK6CODO+0ca54UoM9LKOxyUNnoVZRl8TeaAg==", "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" + "debug": "^3.2.7", + "resolve": "^1.20.0" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } } } }, "eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz", + "integrity": "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==", "requires": { - "debug": "^2.6.9", + "debug": "^3.2.7", "pkg-dir": "^2.0.0" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "find-up": { @@ -28145,9 +28678,9 @@ } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "p-limit": { "version": "1.3.0", @@ -28186,67 +28719,102 @@ } }, "eslint-plugin-flowtype": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.4.0.tgz", - "integrity": "sha512-O0s0iTT5UxYuoOpHMLSIO2qZMyvrb9shhk1EM5INNGtJ2CffrfUmsnh6TVsnoT41fkXIEndP630WNovhoO87xQ==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.9.0.tgz", + "integrity": "sha512-aBUVPA5Wt0XyuV3Wg8flfVqYJR6yR2nRLuyPwoTjCg5VTk4G1X1zQpInr39tUGgRxqrA+d+B9GYK4+/d1i0Rfw==", "requires": { "lodash": "^4.17.15", "string-natural-compare": "^3.0.1" } }, "eslint-plugin-import": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", - "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.0.tgz", + "integrity": "sha512-Kc6xqT9hiYi2cgybOc0I2vC9OgAYga5o/rAFinam/yF/t5uBqxQbauNPMC6fgb640T/89P0gFoO27FOilJ/Cqg==", "requires": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", - "contains-path": "^0.1.0", + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.0", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.5", + "eslint-module-utils": "^2.6.2", + "find-up": "^2.0.0", "has": "^1.0.3", + "is-core-module": "^2.4.0", "minimatch": "^3.0.4", - "object.values": "^1.1.1", - "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", + "object.values": "^1.1.3", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", "tsconfig-paths": "^3.9.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "esutils": "^2.0.2" } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } }, - "ms": { + "locate-path": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } } } }, "eslint-plugin-jest": { - "version": "24.3.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.3.2.tgz", - "integrity": "sha512-cicWDr+RvTAOKS3Q/k03+Z3odt3VCiWamNUHWd6QWbVQWcYJyYgUTu8x0mx9GfeDEimawU5kQC+nQ3MFxIM6bw==", + "version": "24.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.4.0.tgz", + "integrity": "sha512-8qnt/hgtZ94E9dA6viqfViKBfkJwFHXgJmTWlMGDgunw1XJEGqm3eiPjDsTanM3/u/3Az82nyQM9GX7PM/QGmg==", "requires": { "@typescript-eslint/experimental-utils": "^4.0.1" } @@ -28270,21 +28838,22 @@ } }, "eslint-plugin-react": { - "version": "7.22.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.22.0.tgz", - "integrity": "sha512-p30tuX3VS+NWv9nQot9xIGAHBXR0+xJVaZriEsHoJrASGCJZDJ8JLNM0YqKqI0AKm6Uxaa1VUHoNEibxRCMQHA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz", + "integrity": "sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q==", "requires": { - "array-includes": "^3.1.1", - "array.prototype.flatmap": "^1.2.3", + "array-includes": "^3.1.3", + "array.prototype.flatmap": "^1.2.4", "doctrine": "^2.1.0", "has": "^1.0.3", "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "object.entries": "^1.1.2", - "object.fromentries": "^2.0.2", - "object.values": "^1.1.1", + "minimatch": "^3.0.4", + "object.entries": "^1.1.4", + "object.fromentries": "^2.0.4", + "object.values": "^1.1.4", "prop-types": "^15.7.2", - "resolve": "^1.18.1", - "string.prototype.matchall": "^4.0.2" + "resolve": "^2.0.0-next.3", + "string.prototype.matchall": "^4.0.5" }, "dependencies": { "doctrine": { @@ -28294,6 +28863,15 @@ "requires": { "esutils": "^2.0.2" } + }, + "resolve": { + "version": "2.0.0-next.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", + "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } } } }, @@ -28351,10 +28929,31 @@ "eslint-visitor-keys": "^1.1.0" } }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, "eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -28368,46 +28967,78 @@ } }, "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" - } + "eslint-visitor-keys": "^2.0.0" } }, "eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" }, "eslint-webpack-plugin": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.2.tgz", - "integrity": "sha512-ndD9chZ/kaGnjjx7taRg7c6FK/YKb29SSYzaLtPBIYLYJQmZtuKqtQbAvTS2ymiMQT6X0VW9vZIHK0KLstv93Q==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.5.4.tgz", + "integrity": "sha512-7rYh0m76KyKSDE+B+2PUQrlNS4HJ51t3WKpkJg6vo2jFMbEPTG99cBV0Dm7LXSHucN4WGCG65wQcRiTFrj7iWw==", "requires": { "@types/eslint": "^7.2.6", "arrify": "^2.0.1", "jest-worker": "^26.6.2", "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", "schema-utils": "^3.0.0" }, "dependencies": { - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { - "@types/json-schema": "^7.0.6", + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } } } }, @@ -28511,9 +29142,9 @@ } }, "exec-sh": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==" + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", + "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==" }, "execa": { "version": "4.1.0", @@ -28550,14 +29181,6 @@ "to-regex": "^3.0.1" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -28629,11 +29252,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -28692,28 +29310,10 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" } } }, @@ -28732,11 +29332,6 @@ } } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", @@ -28784,32 +29379,66 @@ } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-equals": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-2.0.0.tgz", - "integrity": "sha512-u6RBd8cSiLLxAiC04wVsLV6GBFDOXcTCgWkd3wEoFXgidPSoAJENqC9m7Jb2vewSvjBIfXV6icKeh3GTKfIaXA==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-2.0.3.tgz", + "integrity": "sha512-0EMw4TTUxsMDpDkCg0rXor2gsg+npVrMIHbEhvD0HZyIhUX6AktC/yasm+qKwfyswd06Qy95ZKk8p2crTo0iPA==" }, "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + } } }, "fast-json-stable-stringify": { @@ -28823,17 +29452,17 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz", + "integrity": "sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==", "requires": { "reusify": "^1.0.4" } }, "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "requires": { "websocket-driver": ">=0.5.1" } @@ -28869,11 +29498,11 @@ }, "dependencies": { "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -28892,11 +29521,29 @@ "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==" }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "requires": { - "to-regex-range": "^5.0.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + } } }, "finalhandler": { @@ -28911,21 +29558,6 @@ "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } } }, "find-cache-dir": { @@ -29015,9 +29647,9 @@ } }, "flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==" + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==" }, "flatten": { "version": "1.0.3", @@ -29031,60 +29663,18 @@ "requires": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "flux-standard-action": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/flux-standard-action/-/flux-standard-action-2.1.1.tgz", - "integrity": "sha512-W86GzmXmIiTVq/dpYVd2HtTIUX9c35Iq3ao3xR6qcKtuXgbu+BDEj72op5VnEIe/kpuSbhl+I8kT1iS2hpcusw==", - "requires": { - "lodash": "^4.17.15" } }, "follow-redirects": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", - "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", + "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, "fork-ts-checker-webpack-plugin": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", @@ -29107,33 +29697,6 @@ "color-convert": "^1.9.0" } }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -29162,75 +29725,11 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -29243,32 +29742,23 @@ "requires": { "has-flag": "^3.0.0" } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } } } }, "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, "fragment-cache": { "version": "0.2.1", @@ -29290,35 +29780,6 @@ "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "fs-extra": { @@ -29349,35 +29810,6 @@ "iferr": "^0.1.5", "imurmurhash": "^0.1.4", "readable-stream": "1 || 2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "fs.realpath": { @@ -29444,18 +29876,10 @@ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -29507,9 +29931,9 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "globby": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", - "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -29520,9 +29944,9 @@ } }, "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, "growly": { "version": "1.3.0", @@ -29544,24 +29968,10 @@ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, "harmony-reflect": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", - "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==" + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" }, "has": { "version": "1.0.3", @@ -29591,6 +30001,14 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -29610,24 +30028,6 @@ "kind-of": "^4.0.0" }, "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", @@ -29648,6 +30048,16 @@ "safe-buffer": "^5.2.0" }, "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -29711,9 +30121,9 @@ "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" }, "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, "hpack.js": { "version": "2.1.6", @@ -29724,35 +30134,6 @@ "obuf": "^1.0.0", "readable-stream": "^2.0.1", "wbuf": "^1.1.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "hsl-regex": { @@ -29765,11 +30146,6 @@ "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" - }, "html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", @@ -29839,23 +30215,14 @@ } }, "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - } + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" } }, "http-deceiver": { @@ -29897,127 +30264,40 @@ "requires-port": "^1.0.0" } }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" }, "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } + "ms": "2.1.2" } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "http-proxy-middleware": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.2.tgz", + "integrity": "sha512-aYk1rTKqLTus23X3L96LGNCGNgWpG4cG0XoZIT1GUPhhulEHX/QalnO6Vbo+WmKWi4AL2IidjuC0wZtbpg0yhQ==", "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "http-proxy": "^1.18.1", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" } }, "https-browserify": { @@ -30025,6 +30305,30 @@ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", @@ -30088,9 +30392,9 @@ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" }, "immer": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", - "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==" + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.5.tgz", + "integrity": "sha512-2WuIehr2y4lmYz9gaQzetPR2ECniCifk4ORaQbU3g5EalLt+0IVTosEPJ5BoYl/75ky2mivzdRzV8wWgQGOSYQ==" }, "import-cwd": { "version": "2.1.0", @@ -30276,11 +30580,12 @@ } }, "is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "requires": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, "is-arrayish": { @@ -30289,9 +30594,9 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "is-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", - "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.3.tgz", + "integrity": "sha512-ZU538ajmYJmzysE5yU4Y7uIrPQ2j704u+hXFiIPQExpqzzUbpe5jCPdTfmz7jXRxZdvjY3KZ3ZNenoXQovX+Dg==" }, "is-binary-path": { "version": "2.1.0", @@ -30302,11 +30607,12 @@ } }, "is-boolean-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", - "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "requires": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, "is-buffer": { @@ -30315,9 +30621,9 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" }, "is-ci": { "version": "2.0.0", @@ -30341,9 +30647,9 @@ } }, "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", + "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", "requires": { "has": "^1.0.3" } @@ -30357,9 +30663,12 @@ } }, "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-descriptor": { "version": "1.0.2", @@ -30377,9 +30686,9 @@ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" }, "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" }, "is-extendable": { "version": "1.0.1", @@ -30423,14 +30732,30 @@ "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" }, "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } }, "is-number-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", - "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-obj": { "version": "1.0.1", @@ -30472,22 +30797,17 @@ } }, "is-potential-custom-element-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", - "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=" - }, - "is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, "is-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", - "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "requires": { "call-bind": "^1.0.2", - "has-symbols": "^1.0.1" + "has-tostringtag": "^1.0.0" } }, "is-regexp": { @@ -30506,29 +30826,24 @@ "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" }, "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "requires": { - "html-comment-regex": "^1.1.0" + "has-tostringtag": "^1.0.0" } }, "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "requires": { - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.2" } }, "is-typedarray": { @@ -30564,11 +30879,6 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, "istanbul-lib-coverage": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", @@ -30627,6 +30937,19 @@ "source-map": "^0.6.1" }, "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -30709,33 +31032,24 @@ "jest-validate": "^26.6.2", "prompts": "^2.0.1", "yargs": "^15.4.1" - } - }, - "jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.2", - "jest-environment-node": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2" }, "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -30745,6 +31059,36 @@ "path-exists": "^4.0.0" } }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + } + }, "jest-resolve": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", @@ -30768,6 +31112,15 @@ "p-locate": "^4.1.0" } }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -30812,6 +31165,14 @@ "type-fest": "^0.8.1" } }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -30901,6 +31262,46 @@ "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + } } }, "jest-jasmine2": { @@ -30962,6 +31363,46 @@ "pretty-format": "^26.6.2", "slash": "^3.0.0", "stack-utils": "^2.0.2" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + } } }, "jest-mock": { @@ -31104,6 +31545,22 @@ "throat": "^5.0.0" }, "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -31113,6 +31570,36 @@ "path-exists": "^4.0.0" } }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + } + }, "jest-resolve": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", @@ -31136,6 +31623,15 @@ "p-locate": "^4.1.0" } }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -31180,6 +31676,14 @@ "type-fest": "^0.8.1" } }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -31221,6 +31725,22 @@ "yargs": "^15.4.1" }, "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -31230,6 +31750,36 @@ "path-exists": "^4.0.0" } }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "jest-config": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", + "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.6.3", + "@jest/types": "^26.6.2", + "babel-jest": "^26.6.3", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.6.2", + "jest-environment-node": "^26.6.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.6.3", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.6.2", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.6.2" + } + }, "jest-resolve": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", @@ -31253,6 +31803,15 @@ "p-locate": "^4.1.0" } }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -31297,6 +31856,14 @@ "type-fest": "^0.8.1" } }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -31430,6 +31997,46 @@ "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", "micromatch": "^4.0.2" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + } } }, "jest-validate": { @@ -31503,18 +32110,13 @@ "esprima": "^4.0.0" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, "jsdom": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.1.tgz", - "integrity": "sha512-pF73EOsJgwZekbDHEY5VO/yKXUkab/DuvrQB/ANVizbr6UAHJsDdHXuotZYwkJSGQl1JM+ivXaqY+XBDDL4TiA==", + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", "requires": { "abab": "^2.0.5", - "acorn": "^8.0.5", + "acorn": "^8.2.4", "acorn-globals": "^6.0.0", "cssom": "^0.4.4", "cssstyle": "^2.3.0", @@ -31522,12 +32124,13 @@ "decimal.js": "^10.2.1", "domexception": "^2.0.1", "escodegen": "^2.0.0", + "form-data": "^3.0.0", "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.0", "parse5": "6.0.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.9", "saxes": "^5.0.1", "symbol-tree": "^3.2.4", "tough-cookie": "^4.0.0", @@ -31536,15 +32139,15 @@ "webidl-conversions": "^6.1.0", "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0", - "ws": "^7.4.4", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", "xml-name-validator": "^3.0.0" }, "dependencies": { "acorn": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.1.0.tgz", - "integrity": "sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA==" + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", + "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==" } } }, @@ -31563,11 +32166,6 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -31578,11 +32176,6 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, "json3": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", @@ -31605,17 +32198,6 @@ "universalify": "^2.0.0" } }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, "jsx-ast-utils": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", @@ -31625,11 +32207,6 @@ "object.assign": "^4.1.2" } }, - "just-curry-it": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/just-curry-it/-/just-curry-it-3.1.0.tgz", - "integrity": "sha512-mjzgSOFzlrurlURaHVjnQodyPNvrHrf1TbQP2XU9NSqBtHQPuHZ+Eb6TAJP7ASeJN9h9K0KXoRTs8u6ouHBKvg==" - }, "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -31692,28 +32269,29 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "requires": { "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", + "parse-json": "^4.0.0", + "pify": "^3.0.0", "strip-bom": "^3.0.0" }, "dependencies": { "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "requires": { - "error-ex": "^1.2.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, "strip-bom": { "version": "3.0.0", @@ -31751,16 +32329,16 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, "lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -31771,10 +32349,10 @@ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "lodash.template": { "version": "4.5.0", @@ -31798,6 +32376,11 @@ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -31898,9 +32481,9 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "memoize-one": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.1.1.tgz", - "integrity": "sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" }, "memory-fs": { "version": "0.4.1", @@ -31909,35 +32492,6 @@ "requires": { "errno": "^0.1.3", "readable-stream": "^2.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "merge-descriptors": { @@ -31966,12 +32520,23 @@ "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } }, "miller-rabin": { @@ -31996,16 +32561,16 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", - "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==" + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" }, "mime-types": { - "version": "2.1.29", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", - "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", "requires": { - "mime-db": "1.46.0" + "mime-db": "1.49.0" } }, "mimic-fn": { @@ -32191,9 +32756,9 @@ "dev": true }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multicast-dns": { "version": "6.2.3", @@ -32223,15 +32788,15 @@ } }, "nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", "optional": true }, "nanoid": { - "version": "3.1.22", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz", - "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==" + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==" }, "nanomatch": { "version": "1.2.13", @@ -32333,37 +32898,10 @@ "vm-browserify": "^1.0.1" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } } } }, @@ -32387,9 +32925,9 @@ } }, "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==" + "version": "1.1.73", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", + "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==" }, "normalize-package-data": { "version": "2.5.0", @@ -32439,11 +32977,11 @@ } }, "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", + "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", "requires": { - "boolbase": "~1.0.0" + "boolbase": "^1.0.0" } }, "num2fraction": { @@ -32456,11 +32994,6 @@ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -32528,9 +33061,9 @@ } }, "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==" + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" }, "object-is": { "version": "1.1.5", @@ -32566,14 +33099,13 @@ } }, "object.entries": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", - "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", + "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" + "es-abstract": "^1.18.2" } }, "object.fromentries": { @@ -32606,14 +33138,13 @@ } }, "object.values": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", - "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has": "^1.0.3" + "es-abstract": "^1.18.2" } }, "obuf": { @@ -32776,35 +33307,6 @@ "cyclist": "^1.0.1", "inherits": "^2.0.3", "readable-stream": "^2.1.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "param-case": { @@ -32912,9 +33414,9 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-to-regexp": { "version": "1.8.0", @@ -32930,9 +33432,9 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -32947,9 +33449,9 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" }, "pify": { "version": "4.0.1", @@ -32987,46 +33489,51 @@ } }, "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", "requires": { - "find-up": "^3.0.0" + "find-up": "^2.1.0" }, "dependencies": { "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "locate-path": "^3.0.0" + "locate-path": "^2.0.0" } }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "requires": { - "p-locate": "^3.0.0", + "p-locate": "^2.0.0", "path-exists": "^3.0.0" } }, "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "requires": { - "p-try": "^2.0.0" + "p-try": "^1.0.0" } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "p-limit": "^2.0.0" + "p-limit": "^1.1.0" } }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -33074,6 +33581,11 @@ "requires": { "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, @@ -33083,9 +33595,9 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "requires": { "chalk": "^2.4.2", "source-map": "^0.6.1", @@ -33436,11 +33948,10 @@ } }, "postcss-initial": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz", - "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", + "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", "requires": { - "lodash.template": "^4.5.0", "postcss": "^7.0.2" } }, @@ -34042,19 +34553,14 @@ }, "dependencies": { "postcss": { - "version": "8.2.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.8.tgz", - "integrity": "sha512-1F0Xb2T21xET7oQV9eKuctbM9S7BC0fetoHCc4H13z0PT6haiRLP4T0ZY4XWh7iLP0usgqykT6p9B2RtOf4FPw==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz", + "integrity": "sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==", "requires": { "colorette": "^1.2.2", - "nanoid": "^3.1.20", - "source-map": "^0.6.1" + "nanoid": "^3.1.23", + "source-map-js": "^0.6.2" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -34077,22 +34583,19 @@ } }, "postcss-selector-parser": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", - "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", "requires": { "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1", "util-deprecate": "^1.0.2" } }, "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", "requires": { - "is-svg": "^3.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", "svgo": "^1.0.0" @@ -34141,15 +34644,15 @@ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, "prettier": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", - "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz", + "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==", "dev": true }, "prettier-plugin-organize-imports": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-2.1.0.tgz", - "integrity": "sha512-P6TzXkuZRV4g9Fl363tN+r6/ecynu0fwmItKCb/04iksrUtwl/6Jf4DxBPuW8UbcgFRadltxB0VlV5Yh1Ec0Ow==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-2.3.3.tgz", + "integrity": "sha512-PBOwQ8vEIB2b7B3gCuBG7D+dqsr1fsTR4TSAjNacRVdHJrD0yzgz9grOLPSyfwJm+NUTZLyWeHoZ+1mHaUrk+g==", "dev": true, "requires": {} }, @@ -34179,16 +34682,16 @@ }, "dependencies": { "react-is": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", - "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==" + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" } } }, "pretty-quick": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-3.1.0.tgz", - "integrity": "sha512-DtxIxksaUWCgPFN7E1ZZk4+Aav3CCuRdhrDSFZENb404sYMtuo9Zka823F+Mgeyt8Zt3bUiCjFzzWYE9LYqkmQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-3.1.1.tgz", + "integrity": "sha512-ZYLGiMoV2jcaas3vTJrLvKAYsxDoXQBUn8OSTxkl67Fyov9lyXivJTl0+2WVh+y6EovGcw7Lm5ThYpH+Sh3XxQ==", "dev": true, "requires": { "chalk": "^3.0.0", @@ -34305,11 +34808,11 @@ } }, "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, @@ -34384,9 +34887,9 @@ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, "query-string": { "version": "4.3.4", @@ -34413,9 +34916,9 @@ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, "queue-microtask": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz", - "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==" + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, "raf": { "version": "3.4.1", @@ -34478,9 +34981,9 @@ } }, "rc-motion": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.4.1.tgz", - "integrity": "sha512-TWLvymfMu8SngPx5MDH8dQ0D2RYbluNTfam4hY/dNNx9RQ3WtGuZ/GXHi2ymLMzH+UNd6EEFYkOuR5JTTtm8Xg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.4.4.tgz", + "integrity": "sha512-ms7n1+/TZQBS0Ydd2Q5P4+wJTSOrhIrwNxLXCZpR7Fa3/oac7Yi803HDALc2hLAKaCTQtw9LmQeB58zcwOsqlQ==", "requires": { "@babel/runtime": "^7.11.1", "classnames": "^2.2.1", @@ -34500,18 +35003,18 @@ } }, "rc-tooltip": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.1.0.tgz", - "integrity": "sha512-pFqD1JZwNIpbdcefB7k5xREoHAWM/k3yQwYF0iminbmDXERgq4rvBfUwIvlCqqZSM7HDr9hYeYr6ZsVNaKtvCQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.1.1.tgz", + "integrity": "sha512-alt8eGMJulio6+4/uDm7nvV+rJq9bsfxFDCI0ljPdbuoygUscbsMYb6EQgwib/uqsXQUvzk+S7A59uYHmEgmDA==", "requires": { "@babel/runtime": "^7.11.2", "rc-trigger": "^5.0.0" } }, "rc-trigger": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.2.3.tgz", - "integrity": "sha512-6Fokao07HUbqKIDkDRFEM0AGZvsvK0Fbp8A/KFgl1ngaqfO1nY037cISCG1Jm5fxImVsXp9awdkP7Vu5cxjjog==", + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.2.9.tgz", + "integrity": "sha512-0Bxsh2Xe+etejMn73am+jZBcOpsueAZiEKLiGoDfA0fvm/JHLNOiiww3zJ0qgyPOTmbYxhsxFcGOZu+VcbaZhQ==", "requires": { "@babel/runtime": "^7.11.2", "classnames": "^2.2.6", @@ -34521,9 +35024,9 @@ } }, "rc-util": { - "version": "5.9.4", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.9.4.tgz", - "integrity": "sha512-pzFmYZsKLJ1p+Uv4NqA4aNBaFh8/hOQxOOxA5G4TiyPboa0o/PjminxUCKvoSwVJVW5YgleSM2XPCTpTV6DCsQ==", + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.13.2.tgz", + "integrity": "sha512-eYc71XXGlp96RMzg01Mhq/T3BL6OOVTDSS0urFEuvpi+e7slhJRhaHGCKy2hqJm18m9ff7VoRoptplKu60dYog==", "requires": { "@babel/runtime": "^7.12.5", "react-is": "^16.12.0", @@ -34574,18 +35077,6 @@ "react-transition-group": "^4.4.1", "uncontrollable": "^7.2.1", "warning": "^4.0.3" - }, - "dependencies": { - "@types/react": { - "version": "17.0.11", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.11.tgz", - "integrity": "sha512-yFRQbD+whVonItSk7ZzP/L+gPTJVBkL/7shLEF+i9GC/1cV3JmUxEQz6+9ylhUpWSDuqo1N9qEvqS6vTj4USUA==", - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - } } }, "react-dev-utils": { @@ -34676,6 +35167,11 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -34703,6 +35199,11 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "immer": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", + "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==" + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -34727,6 +35228,46 @@ "p-limit": "^2.2.0" } }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -34787,9 +35328,9 @@ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "react-overlays": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.0.1.tgz", - "integrity": "sha512-plwUJieTBbLSrgvQ4OkkbTD/deXgxiJdNuKzo6n1RWE3OVnQIU5hffCGS/nvIuu6LpXFs2majbzaXY8rcUVdWA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.1.1.tgz", + "integrity": "sha512-eCN2s2/+GVZzpnId4XVWtvDPYYBD2EtOGP74hE+8yDskPzFy9+pV1H3ZZihxuRdEbQzzacySaaDkR7xE0ydl4Q==", "requires": { "@babel/runtime": "^7.13.8", "@popperjs/core": "^2.8.6", @@ -34820,9 +35361,9 @@ "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==" }, "react-resize-detector": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-6.6.4.tgz", - "integrity": "sha512-sAAh8TmOp59MFs2HR7D1VGbAq+zL+2klQhFbkXOH5Gy/EBEyHGiWXWMStoB+axSYr/Xw54owg6QRGSFj3z0dew==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-6.7.4.tgz", + "integrity": "sha512-wzvGmUdEDMhiUHVZGnl4kuyj/TEQhvbB5LyAGkbYXetwJ2O+u/zftmPvU+kxiO1h+d9aUqQBKcNLS7TvB3ytqA==", "requires": { "@types/resize-observer-browser": "^0.1.5", "lodash.debounce": "^4.0.8", @@ -34925,6 +35466,51 @@ "webpack-dev-server": "3.11.1", "webpack-manifest-plugin": "2.2.0", "workbox-webpack-plugin": "5.1.4" + }, + "dependencies": { + "@babel/core": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "react-select": { @@ -34979,15 +35565,15 @@ } }, "react-table": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/react-table/-/react-table-7.6.3.tgz", - "integrity": "sha512-hfPF13zDLxPMpLKzIKCE8RZud9T/XrRTsaCIf8zXpWZIZ2juCl7qrGpo3AQw9eAetXV5DP7s2GDm+hht7qq5Dw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/react-table/-/react-table-7.7.0.tgz", + "integrity": "sha512-jBlj70iBwOTvvImsU9t01LjFjy4sXEtclBovl3mTiqjz23Reu0DKnRza4zlLtOPACx6j2/7MrQIthIK1Wi+LIA==", "requires": {} }, "react-transition-group": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz", - "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz", + "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==", "requires": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -34996,37 +35582,37 @@ } }, "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "requires": { - "load-json-file": "^2.0.0", + "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "path-type": "^3.0.0" }, "dependencies": { "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "requires": { - "pify": "^2.0.0" + "pify": "^3.0.0" } }, "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" } } }, "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "requires": { "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "read-pkg": "^3.0.0" }, "dependencies": { "find-up": { @@ -35075,27 +35661,46 @@ } }, "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "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" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "requires": { "picomatch": "^2.2.1" } }, "recharts": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.0.9.tgz", - "integrity": "sha512-JNsXE80PuF3hugUCE7JqDOMSvu5xQLxtjOaqFKKZI2pCJ1PVJzhwDv4TWk0nO4AvADbeWzYEHbg8C5Hcrh42UA==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.0.10.tgz", + "integrity": "sha512-yVIlHXPiSgxg8z+qApVnBcGVCLpluqNbXJenK3jKxsCb/FJzh77wyEztS6kXLXSC1RCZa7UABmBPBhqspMCF+g==", "requires": { "@types/d3-scale": "^3.0.0", "@types/d3-shape": "^2.0.0", @@ -35120,9 +35725,9 @@ } }, "recharts-scale": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.4.tgz", - "integrity": "sha512-e7MCnuD1+gtY9N7TYxzB+QXvi4s30kvNqVbI1p5m4rf47GusEQaEHxi8zvlZkdOOZ90UhpGHcnkYlyYkUJ2JoQ==", + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", "requires": { "decimal.js-light": "^2.4.1" } @@ -35151,47 +35756,12 @@ } } }, - "reduce-reducers": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/reduce-reducers/-/reduce-reducers-0.4.3.tgz", - "integrity": "sha512-+CNMnI8QhgVMtAt54uQs3kUxC3Sybpa7Y63HR14uGLgI9/QR5ggHvpxwhGGe3wmx5V91YwqQIblN9k5lspAmGw==" - }, "redux": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", - "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.1.tgz", + "integrity": "sha512-hZQZdDEM25UY2P493kPYuKqviVwZ58lEmGQNeQ+gXa+U0gYPUBf7NKYazbe3m+bs/DzM/ahN12DbF+NG8i0CWw==", "requires": { - "loose-envify": "^1.4.0", - "symbol-observable": "^1.2.0" - } - }, - "redux-actions": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/redux-actions/-/redux-actions-2.6.5.tgz", - "integrity": "sha512-pFhEcWFTYNk7DhQgxMGnbsB1H2glqhQJRQrtPb96kD3hWiZRzXHwwmFPswg6V2MjraXRXWNmuP9P84tvdLAJmw==", - "requires": { - "invariant": "^2.2.4", - "just-curry-it": "^3.1.0", - "loose-envify": "^1.4.0", - "reduce-reducers": "^0.4.3", - "to-camel-case": "^1.0.0" - } - }, - "redux-logger": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz", - "integrity": "sha1-91VZZvMJjzyIYExEnPC69XeCdL8=", - "requires": { - "deep-diff": "^0.3.5" - } - }, - "redux-promise": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/redux-promise/-/redux-promise-0.6.0.tgz", - "integrity": "sha512-R2mGxJbPFgXyCNbFDE6LjTZhCEuACF54g1bxld3nqBhnRMX0OsUyWk77moF7UMGkUdl5WOAwc4BC5jOd1dunqQ==", - "requires": { - "flux-standard-action": "^2.0.3", - "is-promise": "^2.1.0" + "@babel/runtime": "^7.9.2" } }, "redux-thunk": { @@ -35213,9 +35783,9 @@ } }, "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "regenerator-transform": { "version": "0.14.5", @@ -35249,9 +35819,9 @@ } }, "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" }, "regexpu-core": { "version": "4.7.1", @@ -35272,9 +35842,9 @@ "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" }, "regjsparser": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.7.tgz", - "integrity": "sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ==", + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", "requires": { "jsesc": "~0.5.0" }, @@ -35297,15 +35867,15 @@ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "renderkid": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", - "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", "requires": { - "css-select": "^2.0.2", - "dom-converter": "^0.2", - "htmlparser2": "^3.10.1", - "lodash": "^4.17.20", - "strip-ansi": "^3.0.0" + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" }, "dependencies": { "ansi-regex": { @@ -35324,87 +35894,15 @@ } }, "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "requires": { - "lodash": "^4.17.19" - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "dependencies": { - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -35425,6 +35923,11 @@ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, + "reselect": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.0.0.tgz", + "integrity": "sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA==" + }, "resize-observer-polyfill": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", @@ -35470,9 +35973,9 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, "resolve-url-loader": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz", - "integrity": "sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz", + "integrity": "sha512-D3sQ04o0eeQEySLrcz4DsX3saHfsr8/N6tfhblxgZKXxMT2Louargg12oGNfoTRLV09GXhVUe5/qgA5vdgNigg==", "requires": { "adjust-sourcemap-loader": "3.0.0", "camelcase": "5.3.1", @@ -35480,73 +35983,30 @@ "convert-source-map": "1.7.0", "es6-iterator": "2.0.3", "loader-utils": "1.2.3", - "postcss": "7.0.21", + "postcss": "7.0.36", "rework": "1.0.1", "rework-visit": "1.0.0", "source-map": "0.6.1" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } + "safe-buffer": "~5.1.1" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -35565,28 +36025,10 @@ "json5": "^1.0.1" } }, - "postcss": { - "version": "7.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", - "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -35732,9 +36174,9 @@ } }, "rooks": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/rooks/-/rooks-5.0.2.tgz", - "integrity": "sha512-GPydrZ6Sd0g1INCK6RrzM+xnu5I2Fiir/3WRGDw1XeaU026xibPiTl/lOct5Q9ErRerSi0ETHwzdpcHuCw7NlA==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/rooks/-/rooks-5.4.6.tgz", + "integrity": "sha512-BTVEPgCC2WFfLEYlvf1jtDPI7imbY6G2gbi75ksLSt5e2noJbAOfNx2hu1lp+A19d+KO+X/gwzvYnytruDA37Q==", "requires": { "lodash.debounce": "^4.0.8", "raf": "^3.4.1" @@ -35804,33 +36246,6 @@ "normalize-path": "^2.1.1" } }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -35857,27 +36272,6 @@ "strip-eof": "^1.0.0" } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -35886,54 +36280,11 @@ "pump": "^3.0.0" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", @@ -35973,15 +36324,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -35998,17 +36340,17 @@ "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" }, "sass": { - "version": "1.32.10", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.10.tgz", - "integrity": "sha512-Nx0pcWoonAkn7CRp0aE/hket1UP97GiR1IFw3kcjV3pnenhWgZEWUf0ZcfPOV2fK52fnOcK3JdC/YYZ9E47DTQ==", + "version": "1.37.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.37.5.tgz", + "integrity": "sha512-Cx3ewxz9QB/ErnVIiWg2cH0kiYZ0FPvheDTVC6BsiEGBTZKKZJ1Gq5Kq6jy3PKtL6+EJ8NIoaBW/RSd2R6cZOA==", "requires": { "chokidar": ">=3.0.0 <4.0.0" } }, "sass-loader": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.1.1.tgz", - "integrity": "sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.0.tgz", + "integrity": "sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw==", "requires": { "klona": "^2.0.4", "loader-utils": "^2.0.0", @@ -36018,11 +36360,11 @@ }, "dependencies": { "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -36067,9 +36409,9 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "selfsigned": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", - "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", "requires": { "node-forge": "^0.10.0" } @@ -36111,21 +36453,6 @@ "statuses": "~1.5.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", @@ -36155,14 +36482,6 @@ "parseurl": "~1.3.2" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -36179,11 +36498,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", @@ -36346,14 +36660,6 @@ "use": "^3.1.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -36425,11 +36731,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -36483,6 +36784,21 @@ "engine.io-client": "~5.1.2", "parseuri": "0.0.6", "socket.io-parser": "~4.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "socket.io-parser": { @@ -36493,6 +36809,21 @@ "@types/component-emitter": "^1.2.10", "component-emitter": "~1.3.0", "debug": "~4.3.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "sockjs": { @@ -36513,16 +36844,16 @@ } }, "sockjs-client": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.0.tgz", - "integrity": "sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", + "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", "requires": { "debug": "^3.2.6", "eventsource": "^1.0.7", "faye-websocket": "^0.11.3", "inherits": "^2.0.4", "json3": "^3.3.3", - "url-parse": "^1.4.7" + "url-parse": "^1.5.1" }, "dependencies": { "debug": { @@ -36532,6 +36863,11 @@ "requires": { "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, @@ -36553,6 +36889,11 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, + "source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==" + }, "source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", @@ -36615,9 +36956,9 @@ } }, "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==" + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", + "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==" }, "spdy": { "version": "4.0.2", @@ -36629,6 +36970,21 @@ "http-deceiver": "^1.2.7", "select-hose": "^2.0.0", "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "spdy-transport": { @@ -36642,6 +36998,31 @@ "obuf": "^1.1.2", "readable-stream": "^3.0.6", "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } } }, "split-string": { @@ -36657,22 +37038,6 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, "ssri": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", @@ -36692,6 +37057,13 @@ "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", "requires": { "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + } } }, "stackframe": { @@ -36774,11 +37146,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" - }, "stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", @@ -36786,35 +37153,6 @@ "requires": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "stream-each": { @@ -36836,35 +37174,6 @@ "readable-stream": "^2.3.6", "to-arraybuffer": "^1.0.0", "xtend": "^4.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "stream-shift": { @@ -36924,14 +37233,15 @@ } }, "string.prototype.matchall": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz", - "integrity": "sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz", + "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "has-symbols": "^1.0.1", + "es-abstract": "^1.18.2", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", "internal-slot": "^1.0.3", "regexp.prototype.flags": "^1.3.1", "side-channel": "^1.0.4" @@ -37034,9 +37344,9 @@ } }, "stylis": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.7.tgz", - "integrity": "sha512-OFFeUXFgwnGOKvEXaSv0D0KQ5ADP0n6g3SVONx6I/85JzNZ3u50FRwB3lVIk1QO2HNdI75tbVzc4Z66Gdp9voA==" + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.10.tgz", + "integrity": "sha512-m3k+dk7QeJw660eIKRRn3xPF6uuvHs/FFzjX3HQ5ove0qYsiygoAhwn5a3IYKaZPo5LrYD0rfVmtv1gNY1uYwg==" }, "supports-color": { "version": "7.2.0", @@ -37047,9 +37357,9 @@ } }, "supports-hyperlinks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", - "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", + "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", "requires": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -37111,6 +37421,47 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + }, + "dependencies": { + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + } + } + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -37121,6 +37472,14 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -37131,31 +37490,28 @@ } } }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" - }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "table": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", - "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", "requires": { - "ajv": "^7.0.2", - "lodash": "^4.17.20", + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", "slice-ansi": "^4.0.0", - "string-width": "^4.2.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" }, "dependencies": { "ajv": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.3.tgz", - "integrity": "sha512-idv5WZvKVXDqKralOImQgPM9v6WOdLNa0IY3B3doOjw/YxRGT8I+allIJ6kd7Uaj+SF1xZUSU+nPM5aDNBVtnw==", + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -37176,9 +37532,9 @@ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" }, "tar": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", - "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.6.tgz", + "integrity": "sha512-oaWyu5dQbHaYcyZCTfyPpC+VmI62/OM2RTUYavTk1MDr1cwW5Boi3baeYQKiZbY2uSQJGr+iMOzb/JFxLrft+g==", "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -37331,11 +37687,11 @@ } }, "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -37351,9 +37707,9 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "terser": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.1.tgz", - "integrity": "sha512-yv9YLFQQ+3ZqgWCUk+pvNJwgUTdlIxUk1WTN+RnaFJe2L7ipG2csPT0ra2XRm7Cs8cxN7QXmK1rFzEwYEQkzXw==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.1.tgz", + "integrity": "sha512-b3e+d5JbHAe/JSjwsC3Zn55wsBIM7AsHLjKxT31kGCldgbpFePaFo+PiddtO6uwRZWRw7sPXmAN8dTW61xmnSg==", "requires": { "commander": "^2.20.0", "source-map": "~0.7.2", @@ -37396,35 +37752,6 @@ "requires": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "thunky": { @@ -37465,24 +37792,11 @@ "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" }, - "to-camel-case": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-camel-case/-/to-camel-case-1.0.0.tgz", - "integrity": "sha1-GlYFSy+daWKYzmamCJcyK29CPkY=", - "requires": { - "to-space-case": "^1.0.0" - } - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, - "to-no-case": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-no-case/-/to-no-case-1.0.2.tgz", - "integrity": "sha1-xyKQcWTvaxeBMsjmmTAhLRtKoWo=" - }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -37513,19 +37827,12 @@ } }, "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "requires": { - "is-number": "^7.0.0" - } - }, - "to-space-case": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-space-case/-/to-space-case-1.0.0.tgz", - "integrity": "sha1-sFLar7Gysp3HcM6gFj5ewOvJ/Bc=", - "requires": { - "to-no-case": "^1.0.0" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } }, "toidentifier": { @@ -37551,9 +37858,9 @@ } }, "tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", "requires": { "punycode": "^2.1.1" } @@ -37569,24 +37876,15 @@ "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" }, "tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz", + "integrity": "sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q==", "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^2.2.0", "minimist": "^1.2.0", "strip-bom": "^3.0.0" }, "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -37595,9 +37893,9 @@ } }, "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" }, "tsutils": { "version": "3.21.0", @@ -37619,19 +37917,6 @@ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -37651,9 +37936,9 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" }, "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" }, "type-is": { "version": "1.6.18", @@ -37678,19 +37963,19 @@ } }, "typescript": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", - "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==" + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==" }, "unbox-primitive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.0.tgz", - "integrity": "sha512-P/51NX+JXyxK/aigg1/ZgyccdAxm5K1+n8+tvqSntjOivPt19gvm1VC49RWYetsiub8WViUchdxl/KWHHB0kzA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", "requires": { "function-bind": "^1.1.1", - "has-bigints": "^1.0.0", - "has-symbols": "^1.0.0", - "which-boxed-primitive": "^1.0.1" + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" } }, "uncontrollable": { @@ -37886,11 +38171,11 @@ }, "dependencies": { "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -37898,9 +38183,9 @@ } }, "url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", + "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", "requires": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -37962,9 +38247,9 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" }, "v8-to-istanbul": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz", - "integrity": "sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", + "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", "requires": { "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^1.6.0", @@ -38002,16 +38287,6 @@ "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==" }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -38096,35 +38371,6 @@ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "optional": true }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "optional": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -38145,29 +38391,6 @@ "upath": "^1.1.1" } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "optional": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "fsevents": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", @@ -38208,74 +38431,6 @@ "binary-extensions": "^1.0.0" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "optional": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "optional": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "optional": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "optional": true, - "requires": { - "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" - } - }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", @@ -38286,25 +38441,6 @@ "micromatch": "^3.1.10", "readable-stream": "^2.0.2" } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "optional": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } } } }, @@ -38356,33 +38492,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "cacache": { "version": "12.0.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", @@ -38419,50 +38528,6 @@ "estraverse": "^4.1.1" } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", @@ -38494,26 +38559,6 @@ "yallist": "^3.0.2" } }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -38546,9 +38591,9 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "requires": { "figgy-pudding": "^3.5.1" } @@ -38569,15 +38614,6 @@ "worker-farm": "^1.7.0" } }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -38681,33 +38717,6 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -38770,32 +38779,19 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -38838,6 +38834,17 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -38860,39 +38867,11 @@ "binary-extensions": "^1.0.0" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -38902,25 +38881,10 @@ "path-exists": "^3.0.0" } }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "p-limit": { "version": "2.3.0", @@ -38951,20 +38915,6 @@ "find-up": "^3.0.0" } }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "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" - } - }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", @@ -39003,14 +38953,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -39052,15 +38994,6 @@ "has-flag": "^3.0.0" } }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", @@ -39087,9 +39020,9 @@ } }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", "requires": { "async-limiter": "~1.0.0" } @@ -39229,12 +39162,12 @@ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" }, "whatwg-url": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", - "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^2.0.2", + "lodash": "^4.7.0", + "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" } }, @@ -39514,9 +39447,9 @@ } }, "ws": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", - "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==", + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "requires": {} }, "xml-name-validator": { @@ -39535,9 +39468,9 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, "yallist": { "version": "4.0.0", diff --git a/frontend/package.json b/frontend/package.json index 11cda9df8..0ba3e2f8c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -19,7 +19,9 @@ "@fortawesome/free-regular-svg-icons": "^5.15", "@fortawesome/free-solid-svg-icons": "^5.15", "@fortawesome/react-fontawesome": "^0.1.11", + "@reduxjs/toolkit": "^1.6", "@types/bootstrap": "^5", + "@types/jest": "~26.0.24", "@types/lodash": "^4", "@types/node": "^15", "@types/react": "^16", @@ -28,9 +30,6 @@ "@types/react-router-dom": "^5", "@types/react-select": "^4.0.3", "@types/react-table": "^7", - "@types/redux-actions": "^2", - "@types/redux-logger": "^3", - "@types/redux-promise": "^0.5", "axios": "^0.21", "bootstrap": "^4", "http-proxy-middleware": "^0.19", @@ -46,10 +45,6 @@ "react-select": "^4", "react-table": "^7", "recharts": "^2.0.8", - "redux-actions": "^2", - "redux-logger": "^3", - "redux-promise": "^0.6", - "redux-thunk": "^2.3", "rooks": "^5", "sass": "^1", "socket.io-client": "^4", diff --git a/frontend/src/@redux/__tests__/entity-reducer.test.ts b/frontend/src/@redux/__tests__/entity-reducer.test.ts new file mode 100644 index 000000000..ec3080ee4 --- /dev/null +++ b/frontend/src/@redux/__tests__/entity-reducer.test.ts @@ -0,0 +1,379 @@ +import { + configureStore, + createAction, + createAsyncThunk, + createReducer, +} from "@reduxjs/toolkit"; +import {} from "jest"; +import { differenceWith, intersectionWith, isString } from "lodash"; +import { defaultList, defaultState, TestType } from "../tests/helper"; +import { createAsyncEntityReducer } from "../utils/factory"; + +const newItem: TestType = { + id: 123, + name: "extended", +}; + +const longerList: TestType[] = [...defaultList, newItem]; +const shorterList: TestType[] = defaultList.slice(0, defaultList.length - 1); + +const allResolved = createAsyncThunk("all/resolved", () => { + return new Promise>((resolve) => { + resolve({ total: defaultList.length, data: defaultList }); + }); +}); + +const allResolvedLonger = createAsyncThunk("all/longer/resolved", () => { + return new Promise>((resolve) => { + resolve({ total: longerList.length, data: longerList }); + }); +}); + +const allResolvedShorter = createAsyncThunk("all/shorter/resolved", () => { + return new Promise>((resolve) => { + resolve({ total: shorterList.length, data: shorterList }); + }); +}); + +const idsResolved = createAsyncThunk("ids/resolved", (param: number[]) => { + return new Promise>((resolve) => { + resolve({ + total: defaultList.length, + data: intersectionWith(defaultList, param, (l, r) => l.id === r), + }); + }); +}); + +const idsResolvedLonger = createAsyncThunk( + "ids/longer/resolved", + (param: number[]) => { + return new Promise>((resolve) => { + resolve({ + total: longerList.length, + data: intersectionWith(longerList, param, (l, r) => l.id === r), + }); + }); + } +); + +const idsResolvedShorter = createAsyncThunk( + "ids/shorter/resolved", + (param: number[]) => { + return new Promise>((resolve) => { + resolve({ + total: shorterList.length, + data: intersectionWith(shorterList, param, (l, r) => l.id === r), + }); + }); + } +); + +const rangeResolved = createAsyncThunk( + "range/resolved", + (param: Parameter.Range) => { + return new Promise>((resolve) => { + resolve({ + total: defaultList.length, + data: defaultList.slice(param.start, param.start + param.length), + }); + }); + } +); + +const rangeResolvedLonger = createAsyncThunk( + "range/longer/resolved", + (param: Parameter.Range) => { + return new Promise>((resolve) => { + resolve({ + total: longerList.length, + data: longerList.slice(param.start, param.start + param.length), + }); + }); + } +); + +const rangeResolvedShorter = createAsyncThunk( + "range/shorter/resolved", + (param: Parameter.Range) => { + return new Promise>((resolve) => { + resolve({ + total: shorterList.length, + data: shorterList.slice(param.start, param.start + param.length), + }); + }); + } +); + +const allRejected = createAsyncThunk("all/rejected", () => { + return new Promise>((resolve, rejected) => { + rejected("Error"); + }); +}); +const idsRejected = createAsyncThunk("ids/rejected", (param: number[]) => { + return new Promise>((resolve, rejected) => { + rejected("Error"); + }); +}); +const rangeRejected = createAsyncThunk( + "range/rejected", + (param: Parameter.Range) => { + return new Promise>((resolve, rejected) => { + rejected("Error"); + }); + } +); +const removeIds = createAction("remove/id"); +const dirty = createAction("dirty/id"); + +const reducer = createReducer(defaultState, (builder) => { + createAsyncEntityReducer(builder, (s) => s.entities, { + all: allResolved, + range: rangeResolved, + ids: idsResolved, + dirty, + removeIds, + }); + createAsyncEntityReducer(builder, (s) => s.entities, { + all: allRejected, + range: rangeRejected, + ids: idsRejected, + }); + + createAsyncEntityReducer(builder, (s) => s.entities, { + all: allResolvedLonger, + range: rangeResolvedLonger, + ids: idsResolvedLonger, + }); + + createAsyncEntityReducer(builder, (s) => s.entities, { + all: allResolvedShorter, + range: rangeResolvedShorter, + ids: idsResolvedShorter, + }); +}); + +function createStore() { + const store = configureStore({ + reducer, + }); + expect(store.getState()).toEqual(defaultState); + return store; +} + +let store = createStore(); + +function use(callback: (entities: Async.Entity) => void) { + const entities = store.getState().entities; + callback(entities); +} + +beforeEach(() => { + store = createStore(); +}); + +it("entity update all resolved", async () => { + await store.dispatch(allResolved()); + use((entities) => { + expect(entities.dirtyEntities).toHaveLength(0); + expect(entities.error).toBeNull(); + expect(entities.state).toBe("succeeded"); + defaultList.forEach((v, index) => { + const id = v.id.toString(); + expect(entities.content.ids[index]).toEqual(id); + expect(entities.content.entities[id]).toEqual(v); + }); + }); +}); + +it("entity update all rejected", async () => { + await store.dispatch(allRejected()); + use((entities) => { + expect(entities.dirtyEntities).toHaveLength(0); + expect(entities.error).not.toBeNull(); + expect(entities.state).toBe("failed"); + expect(entities.content.ids).toHaveLength(0); + expect(entities.content.entities).toEqual({}); + }); +}); + +it("entity mark dirty", async () => { + await store.dispatch(allResolved()); + + store.dispatch(dirty([1, 2, 3])); + use((entities) => { + expect(entities.error).toBeNull(); + expect(entities.state).toBe("dirty"); + defaultList.forEach((v, index) => { + const id = v.id.toString(); + expect(entities.content.ids[index]).toEqual(id); + expect(entities.content.entities[id]).toEqual(v); + }); + }); +}); + +it("delete entity item", async () => { + await store.dispatch(allResolved()); + + const idsToRemove = [0, 1, 3, 5]; + const expectResults = differenceWith( + defaultList, + idsToRemove, + (l, r) => l.id === r + ); + + store.dispatch(removeIds(idsToRemove)); + use((entities) => { + expect(entities.state).toBe("succeeded"); + expectResults.forEach((v, index) => { + const id = v.id.toString(); + expect(entities.content.ids[index]).toEqual(id); + expect(entities.content.entities[id]).toEqual(v); + }); + }); +}); + +it("entity update by range", async () => { + await store.dispatch(rangeResolved({ start: 0, length: 2 })); + await store.dispatch(rangeResolved({ start: 4, length: 2 })); + use((entities) => { + expect(entities.content.ids).toHaveLength(defaultList.length); + expect(entities.content.ids.filter(isString)).toHaveLength(4); + [0, 1, 4, 5].forEach((v) => { + const id = v.toString(); + expect(entities.content.ids).toContain(id); + expect(entities.content.entities[id].id).toEqual(v); + }); + expect(entities.error).toBeNull(); + expect(entities.state).toBe("succeeded"); + }); +}); + +it("entity update by duplicative range", async () => { + await store.dispatch(rangeResolved({ start: 0, length: 2 })); + await store.dispatch(rangeResolved({ start: 1, length: 2 })); + use((entities) => { + expect(entities.content.ids).toHaveLength(defaultList.length); + expect(entities.content.ids.filter(isString)).toHaveLength(3); + defaultList.slice(0, 3).forEach((v) => { + const id = v.id.toString(); + expect(entities.content.ids).toContain(id); + expect(entities.content.entities[id]).toEqual(v); + }); + expect(entities.error).toBeNull(); + expect(entities.state).toBe("succeeded"); + }); +}); + +it("entity resolved by dirty", async () => { + await store.dispatch(rangeResolved({ start: 0, length: 2 })); + store.dispatch(dirty([1, 2, 3])); + await store.dispatch(rangeResolved({ start: 1, length: 2 })); + use((entities) => { + expect(entities.dirtyEntities).not.toContain("1"); + expect(entities.dirtyEntities).not.toContain("2"); + expect(entities.dirtyEntities).toContain("3"); + expect(entities.state).toBe("dirty"); + }); + await store.dispatch(rangeResolved({ start: 1, length: 3 })); + use((entities) => { + expect(entities.dirtyEntities).not.toContain("1"); + expect(entities.dirtyEntities).not.toContain("2"); + expect(entities.dirtyEntities).not.toContain("3"); + expect(entities.state).toBe("succeeded"); + }); +}); + +it("entity update by ids", async () => { + await store.dispatch(idsResolved([999])); + use((entities) => { + expect(entities.content.ids).toHaveLength(defaultList.length); + expect(entities.content.ids.filter(isString)).toHaveLength(0); + expect(entities.content.entities).not.toHaveProperty("999"); + expect(entities.error).toBeNull(); + expect(entities.state).toBe("succeeded"); + }); +}); + +it("entity resolved dirty by ids", async () => { + await store.dispatch(idsResolved([0, 1, 2, 3, 4])); + store.dispatch(dirty([0, 1, 2, 3])); + await store.dispatch(idsResolved([0, 1])); + use((entities) => { + expect(entities.dirtyEntities).toHaveLength(2); + expect(entities.content.ids.filter(isString)).toHaveLength(5); + expect(entities.error).toBeNull(); + expect(entities.state).toBe("dirty"); + }); +}); + +it("entity resolved non-exist by ids", async () => { + await store.dispatch(idsResolved([0, 1])); + store.dispatch(dirty([999])); + await store.dispatch(idsResolved([999])); + use((entities) => { + expect(entities.dirtyEntities).toHaveLength(0); + expect(entities.state).toBe("succeeded"); + }); +}); + +it("entity update by variant range", async () => { + await store.dispatch(allResolved()); + + await store.dispatch(rangeResolvedLonger({ start: 0, length: 2 })); + use((entities) => { + expect(entities.dirtyEntities).toHaveLength(0); + expect(entities.state).toBe("succeeded"); + expect(entities.content.ids).toHaveLength(longerList.length); + expect(entities.content.ids.filter(isString)).toHaveLength(2); + longerList.slice(0, 2).forEach((v) => { + const id = v.id.toString(); + expect(entities.content.ids).toContain(id); + expect(entities.content.entities[id]).toEqual(v); + }); + }); + + await store.dispatch(allResolved()); + await store.dispatch(rangeResolvedShorter({ start: 0, length: 2 })); + use((entities) => { + expect(entities.dirtyEntities).toHaveLength(0); + expect(entities.state).toBe("succeeded"); + expect(entities.content.ids).toHaveLength(shorterList.length); + expect(entities.content.ids.filter(isString)).toHaveLength(2); + shorterList.slice(0, 2).forEach((v) => { + const id = v.id.toString(); + expect(entities.content.ids).toContain(id); + expect(entities.content.entities[id]).toEqual(v); + }); + }); +}); + +it("entity update by variant ids", async () => { + await store.dispatch(allResolved()); + + await store.dispatch(idsResolvedLonger([2, 3, 4])); + use((entities) => { + expect(entities.dirtyEntities).toHaveLength(0); + expect(entities.state).toBe("succeeded"); + expect(entities.content.ids).toHaveLength(longerList.length); + expect(entities.content.ids.filter(isString)).toHaveLength(3); + Array(3) + .fill(undefined) + .forEach((v) => { + expect(entities.content.ids[v]).not.toBeNull(); + }); + }); + + await store.dispatch(allResolved()); + await store.dispatch(idsResolvedShorter([2, 3, 4])); + use((entities) => { + expect(entities.dirtyEntities).toHaveLength(0); + expect(entities.state).toBe("succeeded"); + expect(entities.content.ids).toHaveLength(shorterList.length); + expect(entities.content.ids.filter(isString)).toHaveLength(3); + Array(3) + .fill(undefined) + .forEach((v) => { + expect(entities.content.ids[v]).not.toBeNull(); + }); + }); +}); diff --git a/frontend/src/@redux/__tests__/item-reducer.test.ts b/frontend/src/@redux/__tests__/item-reducer.test.ts new file mode 100644 index 000000000..60b8f3462 --- /dev/null +++ b/frontend/src/@redux/__tests__/item-reducer.test.ts @@ -0,0 +1,155 @@ +import { + configureStore, + createAction, + createAsyncThunk, + createReducer, +} from "@reduxjs/toolkit"; +import {} from "jest"; +import { defaultState, TestType } from "../tests/helper"; +import { createAsyncItemReducer } from "../utils/factory"; + +// Item +const defaultItem: TestType = { id: 0, name: "test" }; +const allResolved = createAsyncThunk("all/resolved", () => { + return new Promise((resolve) => { + resolve(defaultItem); + }); +}); +const allRejected = createAsyncThunk("all/rejected", () => { + return new Promise((resolve, rejected) => { + rejected("Error"); + }); +}); +const dirty = createAction("dirty/ids"); + +const reducer = createReducer(defaultState, (builder) => { + createAsyncItemReducer(builder, (s) => s.item, { all: allResolved, dirty }); + createAsyncItemReducer(builder, (s) => s.item, { all: allRejected }); +}); + +function createStore() { + const store = configureStore({ + reducer, + }); + expect(store.getState()).toEqual(defaultState); + return store; +} + +let store = createStore(); + +function use(callback: (entities: Async.Item) => void) { + const item = store.getState().item; + callback(item); +} + +// Begin Test Section + +beforeEach(() => { + store = createStore(); +}); + +it("item loading", async () => { + return new Promise((done) => { + store.dispatch(allResolved()).finally(() => { + use((item) => { + expect(item.error).toBeNull(); + expect(item.content).toEqual(defaultItem); + }); + done(); + }); + use((item) => { + expect(item.state).toBe("loading"); + expect(item.error).toBeNull(); + expect(item.content).toBeNull(); + }); + }); +}); + +it("item uninitialized -> succeeded", async () => { + await store.dispatch(allResolved()); + use((item) => { + expect(item.state).toBe("succeeded"); + expect(item.error).toBeNull(); + expect(item.content).toEqual(defaultItem); + }); +}); + +it("item uninitialized -> failed", async () => { + await store.dispatch(allRejected()); + use((item) => { + expect(item.state).toBe("failed"); + expect(item.error).not.toBeNull(); + expect(item.content).toBeNull(); + }); +}); + +it("item uninitialized -> dirty", () => { + store.dispatch(dirty()); + use((item) => { + expect(item.state).toBe("uninitialized"); + expect(item.error).toBeNull(); + expect(item.content).toBeNull(); + }); +}); + +it("item succeeded -> failed", async () => { + await store.dispatch(allResolved()); + await store.dispatch(allRejected()); + use((item) => { + expect(item.state).toBe("failed"); + expect(item.error).not.toBeNull(); + expect(item.content).toEqual(defaultItem); + }); +}); + +it("item failed -> succeeded", async () => { + await store.dispatch(allRejected()); + await store.dispatch(allResolved()); + use((item) => { + expect(item.state).toBe("succeeded"); + expect(item.error).toBeNull(); + expect(item.content).toEqual(defaultItem); + }); +}); + +it("item succeeded -> dirty", async () => { + await store.dispatch(allResolved()); + store.dispatch(dirty()); + use((item) => { + expect(item.state).toBe("dirty"); + expect(item.error).toBeNull(); + expect(item.content).toEqual(defaultItem); + }); +}); + +it("item failed -> dirty", async () => { + await store.dispatch(allRejected()); + store.dispatch(dirty()); + use((item) => { + expect(item.state).toBe("dirty"); + expect(item.error).not.toBeNull(); + expect(item.content).toBeNull(); + }); +}); + +it("item dirty -> failed", async () => { + await store.dispatch(allResolved()); + store.dispatch(dirty()); + await store.dispatch(allRejected()); + use((item) => { + expect(item.state).toBe("failed"); + expect(item.error).not.toBeNull(); + expect(item.content).toEqual(defaultItem); + }); +}); + +it("item dirty -> succeeded", async () => { + await store.dispatch(allResolved()); + store.dispatch(dirty()); + await store.dispatch(allResolved()); + use((item) => { + expect(item.state).toBe("succeeded"); + expect(item.error).toBeNull(); + expect(item.content).toEqual(defaultItem); + }); +}); diff --git a/frontend/src/@redux/__tests__/list-reducer.test.ts b/frontend/src/@redux/__tests__/list-reducer.test.ts new file mode 100644 index 000000000..5bda3c51d --- /dev/null +++ b/frontend/src/@redux/__tests__/list-reducer.test.ts @@ -0,0 +1,248 @@ +import { + configureStore, + createAction, + createAsyncThunk, + createReducer, +} from "@reduxjs/toolkit"; +import {} from "jest"; +import { intersectionWith } from "lodash"; +import { defaultList, defaultState, TestType } from "../tests/helper"; +import { createAsyncListReducer } from "../utils/factory"; + +const allResolved = createAsyncThunk("all/resolved", () => { + return new Promise((resolve) => { + resolve(defaultList); + }); +}); +const allRejected = createAsyncThunk("all/rejected", () => { + return new Promise((resolve, rejected) => { + rejected("Error"); + }); +}); +const idsResolved = createAsyncThunk("ids/resolved", (param: number[]) => { + return new Promise((resolve) => { + resolve(intersectionWith(defaultList, param, (l, r) => l.id === r)); + }); +}); +const idsRejected = createAsyncThunk("ids/rejected", (param: number[]) => { + return new Promise((resolve, rejected) => { + rejected("Error"); + }); +}); +const removeIds = createAction("remove/id"); +const dirty = createAction("dirty/id"); + +const reducer = createReducer(defaultState, (builder) => { + createAsyncListReducer(builder, (s) => s.list, { + all: allResolved, + ids: idsResolved, + removeIds, + dirty, + }); + createAsyncListReducer(builder, (s) => s.list, { + all: allRejected, + ids: idsRejected, + }); +}); + +function createStore() { + const store = configureStore({ + reducer, + }); + expect(store.getState()).toEqual(defaultState); + return store; +} + +let store = createStore(); + +function use(callback: (list: Async.List) => void) { + const list = store.getState().list; + callback(list); +} + +beforeEach(() => { + store = createStore(); +}); + +it("list all uninitialized -> succeeded", async () => { + await store.dispatch(allResolved()); + use((list) => { + expect(list.content).toEqual(defaultList); + expect(list.dirtyEntities).toHaveLength(0); + expect(list.error).toBeNull(); + expect(list.state).toEqual("succeeded"); + }); +}); + +it("list all uninitialized -> failed", async () => { + await store.dispatch(allRejected()); + use((list) => { + expect(list.content).toHaveLength(0); + expect(list.dirtyEntities).toHaveLength(0); + expect(list.error).not.toBeNull(); + expect(list.state).toEqual("failed"); + }); +}); + +it("list uninitialized -> dirty", () => { + store.dispatch(dirty([0, 1])); + use((list) => { + expect(list.content).toHaveLength(0); + expect(list.dirtyEntities).toHaveLength(0); + expect(list.error).toBeNull(); + expect(list.state).toEqual("uninitialized"); + }); +}); + +it("list succeeded -> dirty", async () => { + await store.dispatch(allResolved()); + store.dispatch(dirty([1, 2, 3])); + use((list) => { + expect(list.content).toEqual(defaultList); + expect(list.dirtyEntities).toHaveLength(3); + expect(list.error).toBeNull(); + expect(list.state).toEqual("dirty"); + }); +}); + +it("list ids uninitialized -> succeeded", async () => { + await store.dispatch(idsResolved([0, 1, 2])); + use((list) => { + expect(list.content).toHaveLength(3); + expect(list.dirtyEntities).toHaveLength(0); + expect(list.error).toBeNull(); + expect(list.state).toEqual("succeeded"); + }); +}); + +it("list ids succeeded -> dirty", async () => { + await store.dispatch(idsResolved([0, 1])); + store.dispatch(dirty([2, 3])); + use((list) => { + expect(list.dirtyEntities).toHaveLength(2); + expect(list.state).toEqual("dirty"); + }); +}); + +it("list ids succeeded -> dirty", async () => { + await store.dispatch(idsResolved([0, 1, 2])); + store.dispatch(dirty([2, 3])); + use((list) => { + expect(list.dirtyEntities).toHaveLength(2); + expect(list.state).toEqual("dirty"); + }); +}); + +it("list ids update data", async () => { + await store.dispatch(idsResolved([0, 1])); + await store.dispatch(idsResolved([3, 4])); + use((list) => { + expect(list.content).toHaveLength(4); + expect(list.state).toEqual("succeeded"); + }); +}); + +it("list ids update duplicative data", async () => { + await store.dispatch(idsResolved([0, 1, 2])); + await store.dispatch(idsResolved([2, 3])); + use((list) => { + expect(list.content).toHaveLength(4); + expect(list.state).toEqual("succeeded"); + }); +}); + +it("list ids update new data", async () => { + await store.dispatch(idsResolved([0, 1])); + await store.dispatch(idsResolved([2, 3])); + use((list) => { + expect(list.content).toHaveLength(4); + expect(list.content[1].id).toBe(2); + expect(list.content[0].id).toBe(3); + expect(list.state).toEqual("succeeded"); + }); +}); + +it("list ids empty data", async () => { + await store.dispatch(idsResolved([0, 1, 2])); + await store.dispatch(idsResolved([999])); + use((list) => { + expect(list.content).toHaveLength(3); + expect(list.state).toEqual("succeeded"); + }); +}); + +it("list ids duplicative dirty", async () => { + await store.dispatch(idsResolved([0])); + store.dispatch(dirty([2, 2])); + use((list) => { + expect(list.dirtyEntities).toHaveLength(1); + expect(list.dirtyEntities).toContain("2"); + expect(list.state).toEqual("dirty"); + }); +}); + +it("list ids resolved dirty", async () => { + await store.dispatch(idsResolved([0, 1, 2])); + store.dispatch(dirty([2, 3])); + use((list) => { + expect(list.content).toHaveLength(3); + expect(list.dirtyEntities).toContain("2"); + expect(list.dirtyEntities).toContain("3"); + expect(list.state).toBe("dirty"); + }); +}); + +it("list ids resolved dirty", async () => { + await store.dispatch(idsResolved([0, 1, 2])); + store.dispatch(dirty([1, 2, 3, 999])); + await store.dispatch(idsResolved([1, 2])); + use((list) => { + expect(list.content).toHaveLength(3); + expect(list.dirtyEntities).not.toContain("1"); + expect(list.dirtyEntities).not.toContain("2"); + expect(list.state).toBe("dirty"); + }); + + await store.dispatch(idsResolved([3])); + use((list) => { + expect(list.content).toHaveLength(4); + expect(list.dirtyEntities).not.toContain("3"); + expect(list.state).toBe("dirty"); + }); + + await store.dispatch(idsResolved([999])); + use((list) => { + expect(list.content).toHaveLength(4); + expect(list.dirtyEntities).not.toContain("999"); + expect(list.state).toBe("succeeded"); + }); +}); + +it("list remove ids", async () => { + await store.dispatch(allResolved()); + const totalSize = store.getState().list.content.length; + + store.dispatch(removeIds([1, 2])); + use((list) => { + expect(list.content).toHaveLength(totalSize - 2); + expect(list.content.map((v) => v.id)).not.toContain(1); + expect(list.content.map((v) => v.id)).not.toContain(2); + expect(list.state).toEqual("succeeded"); + }); +}); + +it("list remove dirty ids", async () => { + await store.dispatch(allResolved()); + store.dispatch(dirty([1, 2, 3])); + store.dispatch(removeIds([1, 2])); + use((list) => { + expect(list.dirtyEntities).not.toContain("1"); + expect(list.dirtyEntities).not.toContain("2"); + expect(list.state).toEqual("dirty"); + }); + store.dispatch(removeIds([3])); + use((list) => { + expect(list.dirtyEntities).toHaveLength(0); + expect(list.state).toEqual("succeeded"); + }); +}); diff --git a/frontend/src/@redux/actions/factory.ts b/frontend/src/@redux/actions/factory.ts deleted file mode 100644 index 9f502a604..000000000 --- a/frontend/src/@redux/actions/factory.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { - ActionCallback, - ActionDispatcher, - AsyncActionCreator, - AsyncActionDispatcher, - AvailableCreator, - AvailableType, - PromiseCreator, -} from "../types"; - -function asyncActionFactory( - type: string, - promise: T, - args: Parameters -): AsyncActionDispatcher>> { - return (dispatch) => { - dispatch({ - type, - payload: { - loading: true, - parameters: args, - }, - }); - - return new Promise((resolve, reject) => { - promise(...args) - .then((val) => { - dispatch({ - type, - payload: { - loading: false, - item: val, - parameters: args, - }, - }); - resolve(); - }) - .catch((err) => { - dispatch({ - type, - error: true, - payload: { - loading: false, - item: err, - parameters: args, - }, - }); - reject(err); - }); - }); - }; -} - -export function createAsyncAction( - type: string, - promise: T -) { - return (...args: Parameters) => asyncActionFactory(type, promise, args); -} - -// Create a action which combine multiple ActionDispatcher and execute them at once -function combineActionFactory( - dispatchers: AvailableType[] -): ActionDispatcher { - return (dispatch) => { - dispatchers.forEach((fn) => { - if (typeof fn === "function") { - fn(dispatch); - } else { - dispatch(fn); - } - }); - }; -} - -export function createCombineAction(fn: T) { - return (...args: Parameters) => combineActionFactory(fn(...args)); -} - -function combineAsyncActionFactory( - dispatchers: AsyncActionDispatcher[] -): AsyncActionDispatcher { - return (dispatch) => { - const promises = dispatchers.map((v) => v(dispatch)); - return Promise.all(promises) as Promise; - }; -} - -export function createAsyncCombineAction(fn: T) { - return (...args: Parameters) => combineAsyncActionFactory(fn(...args)); -} - -export function callbackActionFactory( - dispatchers: AsyncActionDispatcher[], - success: ActionCallback, - error?: ActionCallback -): ActionDispatcher { - return (dispatch) => { - const promises = dispatchers.map((v) => v(dispatch)); - Promise.all(promises) - .then(() => { - const action = success(); - if (action !== undefined) { - dispatch(action); - } - }) - .catch(() => { - const action = error && error(); - if (action !== undefined) { - dispatch(action); - } - }); - }; -} - -export function createCallbackAction( - fn: T, - success: ActionCallback, - error?: ActionCallback -) { - return (...args: Parameters) => - callbackActionFactory(fn(args), success, error); -} diff --git a/frontend/src/@redux/actions/movie.ts b/frontend/src/@redux/actions/movie.ts index b76752cdc..6deafc770 100644 --- a/frontend/src/@redux/actions/movie.ts +++ b/frontend/src/@redux/actions/movie.ts @@ -1,47 +1,78 @@ -import { createDeleteAction } from "../../@socketio/reducer"; +import { createAction, createAsyncThunk } from "@reduxjs/toolkit"; import { MoviesApi } from "../../apis"; -import { - MOVIES_DELETE_ITEMS, - MOVIES_DELETE_WANTED_ITEMS, - MOVIES_UPDATE_BLACKLIST, - MOVIES_UPDATE_HISTORY_LIST, - MOVIES_UPDATE_LIST, - MOVIES_UPDATE_WANTED_LIST, -} from "../constants"; -import { createAsyncAction } from "./factory"; -export const movieUpdateList = createAsyncAction( - MOVIES_UPDATE_LIST, - (id?: number[]) => MoviesApi.movies(id) +export const movieUpdateByRange = createAsyncThunk( + "movies/update/range", + async (params: Parameter.Range) => { + const response = await MoviesApi.moviesBy(params); + return response; + } ); -export const movieDeleteItems = createDeleteAction(MOVIES_DELETE_ITEMS); - -export const movieUpdateWantedList = createAsyncAction( - MOVIES_UPDATE_WANTED_LIST, - (radarrid: number[]) => MoviesApi.wantedBy(radarrid) +export const movieUpdateById = createAsyncThunk( + "movies/update/id", + async (ids: number[]) => { + const response = await MoviesApi.movies(ids); + return response; + } ); -export const movieDeleteWantedItems = createDeleteAction( - MOVIES_DELETE_WANTED_ITEMS +export const movieUpdateAll = createAsyncThunk( + "movies/update/all", + async () => { + const response = await MoviesApi.movies(); + return response; + } ); -export const movieUpdateWantedByRange = createAsyncAction( - MOVIES_UPDATE_WANTED_LIST, - (start: number, length: number) => MoviesApi.wanted(start, length) +export const movieRemoveById = createAction("movies/remove"); + +export const movieMarkDirtyById = createAction( + "movies/mark_dirty/id" ); -export const movieUpdateHistoryList = createAsyncAction( - MOVIES_UPDATE_HISTORY_LIST, - () => MoviesApi.history() +export const movieUpdateWantedById = createAsyncThunk( + "movies/wanted/update/id", + async (ids: number[]) => { + const response = await MoviesApi.wantedBy(ids); + return response; + } ); -export const movieUpdateByRange = createAsyncAction( - MOVIES_UPDATE_LIST, - (start: number, length: number) => MoviesApi.moviesBy(start, length) +export const movieRemoveWantedById = createAction( + "movies/wanted/remove/id" ); -export const movieUpdateBlacklist = createAsyncAction( - MOVIES_UPDATE_BLACKLIST, - () => MoviesApi.blacklist() +export const movieMarkWantedDirtyById = createAction( + "movies/wanted/mark_dirty/id" +); + +export const movieUpdateWantedByRange = createAsyncThunk( + "movies/wanted/update/range", + async (params: Parameter.Range) => { + const response = await MoviesApi.wanted(params); + return response; + } +); + +export const movieUpdateHistory = createAsyncThunk( + "movies/history/update", + async () => { + const response = await MoviesApi.history(); + return response; + } +); + +export const movieMarkHistoryDirty = createAction("movies/history/mark_dirty"); + +export const movieUpdateBlacklist = createAsyncThunk( + "movies/blacklist/update", + async () => { + const response = await MoviesApi.blacklist(); + return response; + } +); + +export const movieMarkBlacklistDirty = createAction( + "movies/blacklist/mark_dirty" ); diff --git a/frontend/src/@redux/actions/series.ts b/frontend/src/@redux/actions/series.ts index c53277469..41e79408a 100644 --- a/frontend/src/@redux/actions/series.ts +++ b/frontend/src/@redux/actions/series.ts @@ -1,61 +1,100 @@ -import { createDeleteAction } from "../../@socketio/reducer"; +import { createAction, createAsyncThunk } from "@reduxjs/toolkit"; import { EpisodesApi, SeriesApi } from "../../apis"; -import { - SERIES_DELETE_EPISODES, - SERIES_DELETE_ITEMS, - SERIES_DELETE_WANTED_ITEMS, - SERIES_UPDATE_BLACKLIST, - SERIES_UPDATE_EPISODE_LIST, - SERIES_UPDATE_HISTORY_LIST, - SERIES_UPDATE_LIST, - SERIES_UPDATE_WANTED_LIST, -} from "../constants"; -import { createAsyncAction } from "./factory"; -export const seriesUpdateWantedList = createAsyncAction( - SERIES_UPDATE_WANTED_LIST, - (episodeid: number[]) => EpisodesApi.wantedBy(episodeid) +export const seriesUpdateWantedById = createAsyncThunk( + "series/wanted/update/id", + async (episodeid: number[]) => { + const response = await EpisodesApi.wantedBy(episodeid); + return response; + } ); -export const seriesDeleteWantedItems = createDeleteAction( - SERIES_DELETE_WANTED_ITEMS +export const seriesUpdateWantedByRange = createAsyncThunk( + "series/wanted/update/range", + async (params: Parameter.Range) => { + const response = await EpisodesApi.wanted(params); + return response; + } ); -export const seriesUpdateWantedByRange = createAsyncAction( - SERIES_UPDATE_WANTED_LIST, - (start: number, length: number) => EpisodesApi.wanted(start, length) +export const seriesRemoveWantedById = createAction( + "series/wanted/remove/id" ); -export const seriesUpdateList = createAsyncAction( - SERIES_UPDATE_LIST, - (id?: number[]) => SeriesApi.series(id) +export const seriesMarkWantedDirtyById = createAction( + "series/wanted/mark_dirty/episode_id" ); -export const seriesDeleteItems = createDeleteAction(SERIES_DELETE_ITEMS); +export const seriesRemoveById = createAction("series/remove"); -export const episodeUpdateBy = createAsyncAction( - SERIES_UPDATE_EPISODE_LIST, - (seriesid: number[]) => EpisodesApi.bySeriesId(seriesid) +export const seriesMarkDirtyById = createAction( + "series/mark_dirty/id" ); -export const episodeDeleteItems = createDeleteAction(SERIES_DELETE_EPISODES); - -export const episodeUpdateById = createAsyncAction( - SERIES_UPDATE_EPISODE_LIST, - (episodeid: number[]) => EpisodesApi.byEpisodeId(episodeid) +export const seriesUpdateById = createAsyncThunk( + "series/update/id", + async (ids: number[]) => { + const response = await SeriesApi.series(ids); + return response; + } ); -export const seriesUpdateByRange = createAsyncAction( - SERIES_UPDATE_LIST, - (start: number, length: number) => SeriesApi.seriesBy(start, length) +export const seriesUpdateAll = createAsyncThunk( + "series/update/all", + async () => { + const response = await SeriesApi.series(); + return response; + } ); -export const seriesUpdateHistoryList = createAsyncAction( - SERIES_UPDATE_HISTORY_LIST, - () => EpisodesApi.history() +export const seriesUpdateByRange = createAsyncThunk( + "series/update/range", + async (params: Parameter.Range) => { + const response = await SeriesApi.seriesBy(params); + return response; + } ); -export const seriesUpdateBlacklist = createAsyncAction( - SERIES_UPDATE_BLACKLIST, - () => EpisodesApi.blacklist() +export const episodesRemoveById = createAction("episodes/remove"); + +export const episodesMarkDirtyById = createAction( + "episodes/mark_dirty/id" +); + +export const episodeUpdateBySeriesId = createAsyncThunk( + "episodes/update/series_id", + async (seriesid: number[]) => { + const response = await EpisodesApi.bySeriesId(seriesid); + return response; + } +); + +export const episodeUpdateById = createAsyncThunk( + "episodes/update/episodes_id", + async (episodeid: number[]) => { + const response = await EpisodesApi.byEpisodeId(episodeid); + return response; + } +); + +export const episodesUpdateHistory = createAsyncThunk( + "episodes/history/update", + async () => { + const response = await EpisodesApi.history(); + return response; + } +); + +export const episodesMarkHistoryDirty = createAction("episodes/history/update"); + +export const episodesUpdateBlacklist = createAsyncThunk( + "episodes/blacklist/update", + async () => { + const response = await EpisodesApi.blacklist(); + return response; + } +); + +export const episodesMarkBlacklistDirty = createAction( + "episodes/blacklist/update" ); diff --git a/frontend/src/@redux/actions/site.ts b/frontend/src/@redux/actions/site.ts index d8433aef6..1830db391 100644 --- a/frontend/src/@redux/actions/site.ts +++ b/frontend/src/@redux/actions/site.ts @@ -1,63 +1,45 @@ -import { createAction } from "redux-actions"; +import { createAction, createAsyncThunk } from "@reduxjs/toolkit"; import { BadgesApi } from "../../apis"; -import { - SITE_BADGE_UPDATE, - SITE_INITIALIZED, - SITE_INITIALIZE_FAILED, - SITE_NEED_AUTH, - SITE_NOTIFICATIONS_ADD, - SITE_NOTIFICATIONS_REMOVE, - SITE_OFFLINE_UPDATE, - SITE_PROGRESS_ADD, - SITE_PROGRESS_REMOVE, - SITE_SIDEBAR_UPDATE, -} from "../constants"; -import { createAsyncAction, createCallbackAction } from "./factory"; -import { systemUpdateLanguagesAll, systemUpdateSettings } from "./system"; +import { systemUpdateAllSettings } from "./system"; -export const bootstrap = createCallbackAction( - () => [systemUpdateLanguagesAll(), systemUpdateSettings(), badgeUpdateAll()], - () => siteInitialized(), - () => siteInitializationFailed() +export const siteBootstrap = createAsyncThunk( + "site/bootstrap", + (_: undefined, { dispatch }) => { + return Promise.all([ + dispatch(systemUpdateAllSettings()), + dispatch(siteUpdateBadges()), + ]); + } ); -// TODO: Override error messages -export const siteInitializationFailed = createAction(SITE_INITIALIZE_FAILED); - -const siteInitialized = createAction(SITE_INITIALIZED); - -export const siteRedirectToAuth = createAction(SITE_NEED_AUTH); - -export const badgeUpdateAll = createAsyncAction(SITE_BADGE_UPDATE, () => - BadgesApi.all() +export const siteUpdateInitialization = createAction( + "site/initialization/update" ); -export const siteAddNotifications = createAction( - SITE_NOTIFICATIONS_ADD, - (notification: ReduxStore.Notification[]) => notification +export const siteRedirectToAuth = createAction("site/redirect_auth"); + +export const siteAddNotifications = createAction( + "site/notifications/add" ); -export const siteRemoveNotifications = createAction( - SITE_NOTIFICATIONS_REMOVE, - (id: string) => id +export const siteRemoveNotifications = createAction( + "site/notifications/remove" ); -export const siteAddProgress = createAction( - SITE_PROGRESS_ADD, - (progress: ReduxStore.Progress[]) => progress +export const siteAddProgress = createAction( + "site/progress/add" ); -export const siteRemoveProgress = createAction( - SITE_PROGRESS_REMOVE, - (id: string) => id -); +export const siteRemoveProgress = createAction("site/progress/remove"); -export const siteChangeSidebar = createAction( - SITE_SIDEBAR_UPDATE, - (id: string) => id -); +export const siteChangeSidebar = createAction("site/sidebar/update"); -export const siteUpdateOffline = createAction( - SITE_OFFLINE_UPDATE, - (state: boolean) => state +export const siteUpdateOffline = createAction("site/offline/update"); + +export const siteUpdateBadges = createAsyncThunk( + "site/badges/update", + async () => { + const response = await BadgesApi.all(); + return response; + } ); diff --git a/frontend/src/@redux/actions/system.ts b/frontend/src/@redux/actions/system.ts index adf73b3eb..ad98dd7f8 100644 --- a/frontend/src/@redux/actions/system.ts +++ b/frontend/src/@redux/actions/system.ts @@ -1,64 +1,87 @@ +import { createAction, createAsyncThunk } from "@reduxjs/toolkit"; import { ProvidersApi, SystemApi } from "../../apis"; -import { - SYSTEM_UPDATE_HEALTH, - SYSTEM_UPDATE_LANGUAGES_LIST, - SYSTEM_UPDATE_LANGUAGES_PROFILE_LIST, - SYSTEM_UPDATE_LOGS, - SYSTEM_UPDATE_PROVIDERS, - SYSTEM_UPDATE_RELEASES, - SYSTEM_UPDATE_SETTINGS, - SYSTEM_UPDATE_STATUS, - SYSTEM_UPDATE_TASKS, -} from "../constants"; -import { createAsyncAction, createAsyncCombineAction } from "./factory"; -export const systemUpdateLanguagesAll = createAsyncCombineAction(() => [ - systemUpdateLanguages(), - systemUpdateLanguagesProfiles(), -]); - -export const systemUpdateLanguages = createAsyncAction( - SYSTEM_UPDATE_LANGUAGES_LIST, - () => SystemApi.languages() +export const systemUpdateAllSettings = createAsyncThunk( + "system/update", + async (_: undefined, { dispatch }) => { + await Promise.all([ + dispatch(systemUpdateSettings()), + dispatch(systemUpdateLanguages()), + dispatch(systemUpdateLanguagesProfiles()), + ]); + } ); -export const systemUpdateLanguagesProfiles = createAsyncAction( - SYSTEM_UPDATE_LANGUAGES_PROFILE_LIST, - () => SystemApi.languagesProfileList() +export const systemUpdateLanguages = createAsyncThunk( + "system/languages/update", + async () => { + const response = await SystemApi.languages(); + return response; + } ); -export const systemUpdateStatus = createAsyncAction(SYSTEM_UPDATE_STATUS, () => - SystemApi.status() +export const systemUpdateLanguagesProfiles = createAsyncThunk( + "system/languages/profile/update", + async () => { + const response = await SystemApi.languagesProfileList(); + return response; + } ); -export const systemUpdateHealth = createAsyncAction(SYSTEM_UPDATE_HEALTH, () => - SystemApi.health() +export const systemUpdateStatus = createAsyncThunk( + "system/status/update", + async () => { + const response = await SystemApi.status(); + return response; + } ); -export const systemUpdateTasks = createAsyncAction(SYSTEM_UPDATE_TASKS, () => - SystemApi.getTasks() +export const systemUpdateHealth = createAsyncThunk( + "system/health/update", + async () => { + const response = await SystemApi.health(); + return response; + } ); -export const systemUpdateLogs = createAsyncAction(SYSTEM_UPDATE_LOGS, () => - SystemApi.logs() +export const systemMarkTasksDirty = createAction("system/tasks/mark_dirty"); + +export const systemUpdateTasks = createAsyncThunk( + "system/tasks/update", + async () => { + const response = await SystemApi.tasks(); + return response; + } ); -export const systemUpdateReleases = createAsyncAction( - SYSTEM_UPDATE_RELEASES, - () => SystemApi.releases() +export const systemUpdateLogs = createAsyncThunk( + "system/logs/update", + async () => { + const response = await SystemApi.logs(); + return response; + } ); -export const systemUpdateSettings = createAsyncAction( - SYSTEM_UPDATE_SETTINGS, - () => SystemApi.settings() +export const systemUpdateReleases = createAsyncThunk( + "system/releases/update", + async () => { + const response = await SystemApi.releases(); + return response; + } ); -export const providerUpdateList = createAsyncAction( - SYSTEM_UPDATE_PROVIDERS, - () => ProvidersApi.providers() +export const systemUpdateSettings = createAsyncThunk( + "system/settings/update", + async () => { + const response = await SystemApi.settings(); + return response; + } ); -export const systemUpdateSettingsAll = createAsyncCombineAction(() => [ - systemUpdateSettings(), - systemUpdateLanguagesAll(), -]); +export const providerUpdateList = createAsyncThunk( + "providers/update", + async () => { + const response = await ProvidersApi.providers(); + return response; + } +); diff --git a/frontend/src/@redux/constants/index.ts b/frontend/src/@redux/constants/index.ts deleted file mode 100644 index a76476b1b..000000000 --- a/frontend/src/@redux/constants/index.ts +++ /dev/null @@ -1,43 +0,0 @@ -// Provider action - -// System action -export const SYSTEM_UPDATE_LANGUAGES_LIST = "UPDATE_ALL_LANGUAGES_LIST"; -export const SYSTEM_UPDATE_LANGUAGES_PROFILE_LIST = - "UPDATE_LANGUAGES_PROFILE_LIST"; -export const SYSTEM_UPDATE_STATUS = "UPDATE_SYSTEM_STATUS"; -export const SYSTEM_UPDATE_HEALTH = "UPDATE_SYSTEM_HEALTH"; -export const SYSTEM_UPDATE_TASKS = "UPDATE_SYSTEM_TASKS"; -export const SYSTEM_UPDATE_LOGS = "UPDATE_SYSTEM_LOGS"; -export const SYSTEM_UPDATE_RELEASES = "SYSTEM_UPDATE_RELEASES"; -export const SYSTEM_UPDATE_SETTINGS = "UPDATE_SYSTEM_SETTINGS"; -export const SYSTEM_UPDATE_PROVIDERS = "SYSTEM_UPDATE_PROVIDERS"; - -// Series action -export const SERIES_UPDATE_WANTED_LIST = "UPDATE_SERIES_WANTED_LIST"; -export const SERIES_DELETE_WANTED_ITEMS = "SERIES_DELETE_WANTED_ITEMS"; -export const SERIES_UPDATE_EPISODE_LIST = "UPDATE_SERIES_EPISODE_LIST"; -export const SERIES_DELETE_EPISODES = "SERIES_DELETE_EPISODES"; -export const SERIES_UPDATE_HISTORY_LIST = "UPDATE_SERIES_HISTORY_LIST"; -export const SERIES_UPDATE_LIST = "UPDATE_SEIRES_LIST"; -export const SERIES_DELETE_ITEMS = "SERIES_DELETE_ITEMS"; -export const SERIES_UPDATE_BLACKLIST = "UPDATE_SERIES_BLACKLIST"; - -// Movie action -export const MOVIES_UPDATE_LIST = "UPDATE_MOVIE_LIST"; -export const MOVIES_DELETE_ITEMS = "MOVIES_DELETE_ITEMS"; -export const MOVIES_UPDATE_WANTED_LIST = "UPDATE_MOVIE_WANTED_LIST"; -export const MOVIES_DELETE_WANTED_ITEMS = "MOVIES_DELETE_WANTED_ITEMS"; -export const MOVIES_UPDATE_HISTORY_LIST = "UPDATE_MOVIE_HISTORY_LIST"; -export const MOVIES_UPDATE_BLACKLIST = "UPDATE_MOVIES_BLACKLIST"; - -// Site Action -export const SITE_NEED_AUTH = "SITE_NEED_AUTH"; -export const SITE_INITIALIZED = "SITE_SYSTEM_INITIALIZED"; -export const SITE_INITIALIZE_FAILED = "SITE_INITIALIZE_FAILED"; -export const SITE_NOTIFICATIONS_ADD = "SITE_NOTIFICATIONS_ADD"; -export const SITE_NOTIFICATIONS_REMOVE = "SITE_NOTIFICATIONS_REMOVE"; -export const SITE_PROGRESS_ADD = "SITE_PROGRESS_ADD"; -export const SITE_PROGRESS_REMOVE = "SITE_PROGRESS_REMOVE"; -export const SITE_SIDEBAR_UPDATE = "SITE_SIDEBAR_UPDATE"; -export const SITE_BADGE_UPDATE = "SITE_BADGE_UPDATE"; -export const SITE_OFFLINE_UPDATE = "SITE_OFFLINE_UPDATE"; diff --git a/frontend/src/@redux/hooks/async.ts b/frontend/src/@redux/hooks/async.ts new file mode 100644 index 000000000..8553f427b --- /dev/null +++ b/frontend/src/@redux/hooks/async.ts @@ -0,0 +1,29 @@ +import { AsyncThunk } from "@reduxjs/toolkit"; +import { useEffect } from "react"; +import { log } from "../../utilites/logger"; +import { useReduxAction } from "./base"; + +export function useAutoUpdate(item: Async.Item, update: () => void) { + useEffect(() => { + if (item.state === "uninitialized" || item.state === "dirty") { + update(); + } + }, [item.state, update]); +} + +export function useAutoDirtyUpdate( + item: Async.List | Async.Entity, + updateAction: AsyncThunk +) { + const { state, dirtyEntities } = item; + const hasDirty = dirtyEntities.length > 0 && state === "dirty"; + + const update = useReduxAction(updateAction); + + useEffect(() => { + if (hasDirty) { + log("info", "updating dirty entities..."); + update(dirtyEntities.map(Number)); + } + }, [hasDirty, dirtyEntities, update]); +} diff --git a/frontend/src/@redux/hooks/base.ts b/frontend/src/@redux/hooks/base.ts index e11681b3c..1c3007811 100644 --- a/frontend/src/@redux/hooks/base.ts +++ b/frontend/src/@redux/hooks/base.ts @@ -1,36 +1,24 @@ +import { ActionCreator } from "@reduxjs/toolkit"; import { useCallback } from "react"; import { useDispatch, useSelector } from "react-redux"; -import { createCallbackAction } from "../actions/factory"; -import { ActionCallback, AsyncActionDispatcher } from "../types"; +import { AppDispatch, RootState } from "../store"; // function use -export function useReduxStore any>( +export function useReduxStore any>( selector: T ) { - return useSelector>(selector); + return useSelector>(selector); } -export function useReduxAction void>(action: T) { - const dispatch = useDispatch(); - return useCallback((...args: Parameters) => dispatch(action(...args)), [ - action, - dispatch, - ]); +export function useAppDispatch() { + return useDispatch(); } -export function useReduxActionWith< - T extends (...args: any[]) => AsyncActionDispatcher ->(action: T, success: ActionCallback) { - const dispatch = useDispatch(); +// TODO: Fix type +export function useReduxAction>(action: T) { + const dispatch = useAppDispatch(); return useCallback( - (...args: Parameters) => { - const callbackAction = createCallbackAction( - () => [action(...args)], - success - ); - - dispatch(callbackAction()); - }, - [dispatch, action, success] + (...args: Parameters) => dispatch(action(...args)), + [action, dispatch] ); } diff --git a/frontend/src/@redux/hooks/index.ts b/frontend/src/@redux/hooks/index.ts index ac15d5b21..a13627245 100644 --- a/frontend/src/@redux/hooks/index.ts +++ b/frontend/src/@redux/hooks/index.ts @@ -1,393 +1,4 @@ -import { useCallback, useEffect, useMemo } from "react"; -import { useSocketIOReducer, useWrapToOptionalId } from "../../@socketio/hooks"; -import { buildOrderList } from "../../utilites"; -import { - episodeDeleteItems, - episodeUpdateBy, - episodeUpdateById, - movieUpdateBlacklist, - movieUpdateHistoryList, - movieUpdateList, - movieUpdateWantedList, - providerUpdateList, - seriesUpdateBlacklist, - seriesUpdateHistoryList, - seriesUpdateList, - seriesUpdateWantedList, - systemUpdateHealth, - systemUpdateLanguages, - systemUpdateLanguagesProfiles, - systemUpdateLogs, - systemUpdateReleases, - systemUpdateSettingsAll, - systemUpdateStatus, - systemUpdateTasks, -} from "../actions"; -import { useReduxAction, useReduxStore } from "./base"; - -function stateBuilder any>( - t: T, - d: D -): [Readonly, D] { - return [t, d]; -} - -export function useSystemSettings() { - const update = useReduxAction(systemUpdateSettingsAll); - const items = useReduxStore((s) => s.system.settings); - - return stateBuilder(items, update); -} - -export function useSystemLogs() { - const items = useReduxStore(({ system }) => system.logs); - const update = useReduxAction(systemUpdateLogs); - - useEffect(() => { - update(); - }, [update]); - return stateBuilder(items, update); -} - -export function useSystemTasks() { - const items = useReduxStore((s) => s.system.tasks); - const update = useReduxAction(systemUpdateTasks); - const reducer = useMemo(() => ({ key: "task", update }), [ - update, - ]); - useSocketIOReducer(reducer); - - useEffect(() => { - update(); - }, [update]); - return stateBuilder(items, update); -} - -export function useSystemStatus() { - const items = useReduxStore((s) => s.system.status.data); - const update = useReduxAction(systemUpdateStatus); - - useEffect(() => { - update(); - }, [update]); - return stateBuilder(items, update); -} - -export function useSystemHealth() { - const update = useReduxAction(systemUpdateHealth); - const items = useReduxStore((s) => s.system.health); - - useEffect(() => { - update(); - }, [update]); - return stateBuilder(items, update); -} - -export function useSystemProviders() { - const update = useReduxAction(providerUpdateList); - const items = useReduxStore((d) => d.system.providers); - - useEffect(() => { - update(); - }, [update]); - return stateBuilder(items, update); -} - -export function useSystemReleases() { - const items = useReduxStore(({ system }) => system.releases); - const update = useReduxAction(systemUpdateReleases); - - useEffect(() => { - update(); - }, [update]); - return stateBuilder(items, update); -} - -export function useLanguageProfiles() { - const action = useReduxAction(systemUpdateLanguagesProfiles); - const items = useReduxStore((s) => s.system.languagesProfiles.data); - - return stateBuilder(items, action); -} - -export function useProfileBy(id: number | null | undefined) { - const [profiles] = useLanguageProfiles(); - return useMemo(() => profiles.find((v) => v.profileId === id), [ - id, - profiles, - ]); -} - -export function useLanguages(enabled: boolean = false) { - const action = useReduxAction(systemUpdateLanguages); - const items = useReduxStore((s) => - enabled ? s.system.enabledLanguage.data : s.system.languages.data - ); - return stateBuilder(items, action); -} - -function useLanguageGetter(enabled: boolean = false) { - const [languages] = useLanguages(enabled); - return useCallback( - (code?: string) => { - if (code === undefined) { - return undefined; - } else { - return languages.find((v) => v.code2 === code); - } - }, - [languages] - ); -} - -export function useLanguageBy(code?: string) { - const getter = useLanguageGetter(); - return useMemo(() => getter(code), [code, getter]); -} - -// Convert languageprofile items to language -export function useProfileItems(profile?: Profile.Languages) { - const getter = useLanguageGetter(true); - - return useMemo( - () => - profile?.items.map(({ language, hi, forced }) => { - const name = getter(language)?.name ?? ""; - return { - hi: hi === "True", - forced: forced === "True", - code2: language, - name, - }; - }) ?? [], - [getter, profile?.items] - ); -} - -export function useRawSeries() { - const update = useReduxAction(seriesUpdateList); - const items = useReduxStore((d) => d.series.seriesList); - return stateBuilder(items, update); -} - -export function useSeries(order = true) { - const [rawSeries, action] = useRawSeries(); - const series = useMemo>(() => { - const state = rawSeries.data; - if (order) { - return { - ...rawSeries, - data: buildOrderList(state), - }; - } else { - return { - ...rawSeries, - data: Object.values(state.items), - }; - } - }, [rawSeries, order]); - return stateBuilder(series, action); -} - -export function useSerieBy(id?: number) { - const [series, updateSerie] = useRawSeries(); - const serie = useMemo>(() => { - const items = series.data.items; - let item: Item.Series | null = null; - if (id && !isNaN(id) && id in items) { - item = items[id]; - } - return { - ...series, - data: item, - }; - }, [id, series]); - - const update = useCallback(() => { - if (id && !isNaN(id)) { - updateSerie([id]); - } - }, [id, updateSerie]); - - useEffect(() => { - if (serie.data === null) { - update(); - } - }, [serie.data, update]); - return stateBuilder(serie, update); -} - -export function useEpisodesBy(seriesId?: number) { - const action = useReduxAction(episodeUpdateBy); - const update = useCallback(() => { - if (seriesId !== undefined && !isNaN(seriesId)) { - action([seriesId]); - } - }, [action, seriesId]); - - const list = useReduxStore((d) => d.series.episodeList); - - const items = useMemo(() => { - if (seriesId !== undefined && !isNaN(seriesId)) { - return list.data.filter((v) => v.sonarrSeriesId === seriesId); - } else { - return []; - } - }, [seriesId, list.data]); - - const state: AsyncState = useMemo( - () => ({ - ...list, - data: items, - }), - [list, items] - ); - - const actionById = useReduxAction(episodeUpdateById); - const wrapActionById = useWrapToOptionalId(actionById); - const deleteAction = useReduxAction(episodeDeleteItems); - const episodeReducer = useMemo( - () => ({ key: "episode", update: wrapActionById, delete: deleteAction }), - [wrapActionById, deleteAction] - ); - useSocketIOReducer(episodeReducer); - - const wrapAction = useWrapToOptionalId(action); - const seriesReducer = useMemo( - () => ({ key: "series", update: wrapAction }), - [wrapAction] - ); - useSocketIOReducer(seriesReducer); - - useEffect(() => { - update(); - }, [update]); - return stateBuilder(state, update); -} - -export function useRawMovies() { - const update = useReduxAction(movieUpdateList); - const items = useReduxStore((d) => d.movie.movieList); - return stateBuilder(items, update); -} - -export function useMovies(order = true) { - const [rawMovies, action] = useRawMovies(); - const movies = useMemo>(() => { - const state = rawMovies.data; - if (order) { - return { - ...rawMovies, - data: buildOrderList(state), - }; - } else { - return { - ...rawMovies, - data: Object.values(state.items), - }; - } - }, [rawMovies, order]); - return stateBuilder(movies, action); -} - -export function useMovieBy(id?: number) { - const [movies, updateMovies] = useRawMovies(); - const movie = useMemo>(() => { - const items = movies.data.items; - let item: Item.Movie | null = null; - if (id && !isNaN(id) && id in items) { - item = items[id]; - } - return { - ...movies, - data: item, - }; - }, [id, movies]); - - const update = useCallback(() => { - if (id && !isNaN(id)) { - updateMovies([id]); - } - }, [id, updateMovies]); - - useEffect(() => { - if (movie.data === null) { - update(); - } - }, [movie.data, update]); - return stateBuilder(movie, update); -} - -export function useWantedSeries() { - const update = useReduxAction(seriesUpdateWantedList); - const items = useReduxStore((d) => d.series.wantedEpisodesList); - - return stateBuilder(items, update); -} - -export function useWantedMovies() { - const update = useReduxAction(movieUpdateWantedList); - const items = useReduxStore((d) => d.movie.wantedMovieList); - - return stateBuilder(items, update); -} - -export function useBlacklistMovies() { - const update = useReduxAction(movieUpdateBlacklist); - const items = useReduxStore((d) => d.movie.blacklist); - const reducer = useMemo( - () => ({ key: "movie-blacklist", any: update }), - [update] - ); - useSocketIOReducer(reducer); - - useEffect(() => { - update(); - }, [update]); - return stateBuilder(items, update); -} - -export function useBlacklistSeries() { - const update = useReduxAction(seriesUpdateBlacklist); - const items = useReduxStore((d) => d.series.blacklist); - const reducer = useMemo( - () => ({ key: "episode-blacklist", any: update }), - [update] - ); - useSocketIOReducer(reducer); - - useEffect(() => { - update(); - }, [update]); - return stateBuilder(items, update); -} - -export function useMoviesHistory() { - const update = useReduxAction(movieUpdateHistoryList); - const items = useReduxStore((s) => s.movie.historyList); - const reducer = useMemo( - () => ({ key: "movie-history", update }), - [update] - ); - useSocketIOReducer(reducer); - - useEffect(() => { - update(); - }, [update]); - return stateBuilder(items, update); -} - -export function useSeriesHistory() { - const update = useReduxAction(seriesUpdateHistoryList); - const items = useReduxStore((s) => s.series.historyList); - const reducer = useMemo( - () => ({ key: "episode-history", update }), - [update] - ); - useSocketIOReducer(reducer); - - useEffect(() => { - update(); - }, [update]); - return stateBuilder(items, update); -} +export * from "./movies"; +export * from "./series"; +export * from "./site"; +export * from "./system"; diff --git a/frontend/src/@redux/hooks/movies.ts b/frontend/src/@redux/hooks/movies.ts new file mode 100644 index 000000000..0a027818e --- /dev/null +++ b/frontend/src/@redux/hooks/movies.ts @@ -0,0 +1,70 @@ +import { useCallback, useMemo } from "react"; +import { useEntityItemById, useEntityToList } from "../../utilites"; +import { + movieUpdateBlacklist, + movieUpdateById, + movieUpdateHistory, + movieUpdateWantedById, +} from "../actions"; +import { useAutoDirtyUpdate, useAutoUpdate } from "./async"; +import { useReduxAction, useReduxStore } from "./base"; + +export function useMovieEntities() { + const entities = useReduxStore((d) => d.movies.movieList); + + useAutoDirtyUpdate(entities, movieUpdateById); + + return entities; +} + +export function useMovies() { + const rawMovies = useMovieEntities(); + const content = useEntityToList(rawMovies.content); + const movies = useMemo>(() => { + return { + ...rawMovies, + keyName: rawMovies.content.keyName, + content, + }; + }, [rawMovies, content]); + return movies; +} + +export function useMovieBy(id: number) { + const movies = useMovieEntities(); + const action = useReduxAction(movieUpdateById); + + const update = useCallback(() => { + if (!isNaN(id)) { + action([id]); + } + }, [id, action]); + + const movie = useEntityItemById(movies, id.toString()); + + useAutoUpdate(movie, update); + return movie; +} + +export function useWantedMovies() { + const items = useReduxStore((d) => d.movies.wantedMovieList); + + useAutoDirtyUpdate(items, movieUpdateWantedById); + return items; +} + +export function useBlacklistMovies() { + const update = useReduxAction(movieUpdateBlacklist); + const items = useReduxStore((d) => d.movies.blacklist); + + useAutoUpdate(items, update); + return items; +} + +export function useMoviesHistory() { + const update = useReduxAction(movieUpdateHistory); + const items = useReduxStore((s) => s.movies.historyList); + + useAutoUpdate(items, update); + return items; +} diff --git a/frontend/src/@redux/hooks/series.ts b/frontend/src/@redux/hooks/series.ts new file mode 100644 index 000000000..893c5eef6 --- /dev/null +++ b/frontend/src/@redux/hooks/series.ts @@ -0,0 +1,102 @@ +import { useCallback, useEffect, useMemo } from "react"; +import { useEntityItemById, useEntityToList } from "../../utilites"; +import { + episodesUpdateBlacklist, + episodesUpdateHistory, + episodeUpdateById, + episodeUpdateBySeriesId, + seriesUpdateById, + seriesUpdateWantedById, +} from "../actions"; +import { useAutoDirtyUpdate, useAutoUpdate } from "./async"; +import { useReduxAction, useReduxStore } from "./base"; + +export function useSerieEntities() { + const items = useReduxStore((d) => d.series.seriesList); + + useAutoDirtyUpdate(items, seriesUpdateById); + return items; +} + +export function useSeries() { + const rawSeries = useSerieEntities(); + const content = useEntityToList(rawSeries.content); + const series = useMemo>(() => { + return { + ...rawSeries, + keyName: rawSeries.content.keyName, + content, + }; + }, [rawSeries, content]); + return series; +} + +export function useSerieBy(id: number) { + const series = useSerieEntities(); + const action = useReduxAction(seriesUpdateById); + const serie = useEntityItemById(series, id.toString()); + + const update = useCallback(() => { + if (!isNaN(id)) { + action([id]); + } + }, [id, action]); + + useAutoUpdate(serie, update); + return serie; +} + +export function useEpisodesBy(seriesId: number) { + const action = useReduxAction(episodeUpdateBySeriesId); + const update = useCallback(() => { + if (!isNaN(seriesId)) { + action([seriesId]); + } + }, [action, seriesId]); + + const episodes = useReduxStore((d) => d.series.episodeList); + + const newContent = useMemo(() => { + return episodes.content.filter((v) => v.sonarrSeriesId === seriesId); + }, [seriesId, episodes.content]); + + const newList: Async.List = useMemo( + () => ({ + ...episodes, + content: newContent, + }), + [episodes, newContent] + ); + + // FIXME + useEffect(() => { + update(); + }, [update]); + + useAutoDirtyUpdate(episodes, episodeUpdateById); + + return newList; +} + +export function useWantedSeries() { + const items = useReduxStore((d) => d.series.wantedEpisodesList); + + useAutoDirtyUpdate(items, seriesUpdateWantedById); + return items; +} + +export function useBlacklistSeries() { + const update = useReduxAction(episodesUpdateBlacklist); + const items = useReduxStore((d) => d.series.blacklist); + + useAutoUpdate(items, update); + return items; +} + +export function useSeriesHistory() { + const update = useReduxAction(episodesUpdateHistory); + const items = useReduxStore((s) => s.series.historyList); + + useAutoUpdate(items, update); + return items; +} diff --git a/frontend/src/@redux/hooks/site.ts b/frontend/src/@redux/hooks/site.ts index 21f6034f9..05354572b 100644 --- a/frontend/src/@redux/hooks/site.ts +++ b/frontend/src/@redux/hooks/site.ts @@ -7,8 +7,8 @@ export function useNotification(id: string, timeout: number = 5000) { const add = useReduxAction(siteAddNotifications); return useCallback( - (msg: Omit) => { - const notification: ReduxStore.Notification = { + (msg: Omit) => { + const notification: Server.Notification = { ...msg, id, timeout, @@ -24,18 +24,18 @@ export function useIsOffline() { } export function useIsSonarrEnabled() { - const [settings] = useSystemSettings(); - return settings.data?.general.use_sonarr ?? true; + const settings = useSystemSettings(); + return settings.content?.general.use_sonarr ?? true; } export function useIsRadarrEnabled() { - const [settings] = useSystemSettings(); - return settings.data?.general.use_radarr ?? true; + const settings = useSystemSettings(); + return settings.content?.general.use_radarr ?? true; } export function useShowOnlyDesired() { - const [settings] = useSystemSettings(); - return settings.data?.general.embedded_subs_show_desired ?? false; + const settings = useSystemSettings(); + return settings.content?.general.embedded_subs_show_desired ?? false; } export function useSetSidebar(key: string) { diff --git a/frontend/src/@redux/hooks/system.ts b/frontend/src/@redux/hooks/system.ts new file mode 100644 index 000000000..1e41a7355 --- /dev/null +++ b/frontend/src/@redux/hooks/system.ts @@ -0,0 +1,131 @@ +import { useMemo } from "react"; +import { + providerUpdateList, + systemUpdateHealth, + systemUpdateLogs, + systemUpdateReleases, + systemUpdateStatus, + systemUpdateTasks, +} from "../actions"; +import { useAutoUpdate } from "./async"; +import { useReduxAction, useReduxStore } from "./base"; + +export function useSystemSettings() { + const items = useReduxStore((s) => s.system.settings); + + return items; +} + +export function useSystemLogs() { + const items = useReduxStore(({ system }) => system.logs); + const update = useReduxAction(systemUpdateLogs); + + useAutoUpdate(items, update); + return items; +} + +export function useSystemTasks() { + const items = useReduxStore((s) => s.system.tasks); + const update = useReduxAction(systemUpdateTasks); + + useAutoUpdate(items, update); + return items; +} + +export function useSystemStatus() { + const items = useReduxStore((s) => s.system.status); + const update = useReduxAction(systemUpdateStatus); + + useAutoUpdate(items, update); + return items.content; +} + +export function useSystemHealth() { + const items = useReduxStore((s) => s.system.health); + const update = useReduxAction(systemUpdateHealth); + + useAutoUpdate(items, update); + return items; +} + +export function useSystemProviders() { + const update = useReduxAction(providerUpdateList); + const items = useReduxStore((d) => d.system.providers); + + useAutoUpdate(items, update); + return items; +} + +export function useSystemReleases() { + const items = useReduxStore(({ system }) => system.releases); + const update = useReduxAction(systemUpdateReleases); + + useAutoUpdate(items, update); + return items; +} + +export function useLanguageProfiles() { + const items = useReduxStore((s) => s.system.languagesProfiles); + + return items.content; +} + +export function useProfileBy(id: number | null | undefined) { + const profiles = useLanguageProfiles(); + return useMemo( + () => profiles?.find((v) => v.profileId === id), + [id, profiles] + ); +} + +export function useLanguages() { + const data = useReduxStore((s) => s.system.languages); + + const languages = useMemo( + () => data.content?.map((v) => ({ code2: v.code2, name: v.name })) ?? [], + [data.content] + ); + + return languages; +} + +export function useEnabledLanguages() { + const data = useReduxStore((s) => s.system.languages); + + const enabled = useMemo( + () => + data.content + ?.filter((v) => v.enabled) + .map((v) => ({ code2: v.code2, name: v.name })) ?? [], + [data.content] + ); + + return enabled; +} + +export function useLanguageBy(code?: string) { + const languages = useLanguages(); + return useMemo( + () => languages.find((v) => v.code2 === code), + [languages, code] + ); +} + +// Convert languageprofile items to language +export function useProfileItemsToLanguages(profile?: Language.Profile) { + const languages = useLanguages(); + + return useMemo( + () => + profile?.items.map(({ language: code, hi, forced }) => { + const name = languages.find((v) => v.code2 === code)?.name ?? ""; + return { + hi: hi === "True", + forced: forced === "True", + code2: code, + name, + }; + }) ?? [], + [languages, profile?.items] + ); +} diff --git a/frontend/src/@redux/reducers/index.ts b/frontend/src/@redux/reducers/index.ts index 1ddd540c0..e308c130b 100644 --- a/frontend/src/@redux/reducers/index.ts +++ b/frontend/src/@redux/reducers/index.ts @@ -1,12 +1,13 @@ -import { combineReducers } from "redux"; -import movie from "./movie"; +import movies from "./movie"; import series from "./series"; import site from "./site"; import system from "./system"; -export default combineReducers({ - system, +const AllReducers = { + movies, series, - movie, site, -}); + system, +}; + +export default AllReducers; diff --git a/frontend/src/@redux/reducers/movie.ts b/frontend/src/@redux/reducers/movie.ts index 2b7fe8df1..ae139452a 100644 --- a/frontend/src/@redux/reducers/movie.ts +++ b/frontend/src/@redux/reducers/movie.ts @@ -1,81 +1,64 @@ -import { Action, handleActions } from "redux-actions"; +import { createReducer } from "@reduxjs/toolkit"; import { - MOVIES_DELETE_ITEMS, - MOVIES_DELETE_WANTED_ITEMS, - MOVIES_UPDATE_BLACKLIST, - MOVIES_UPDATE_HISTORY_LIST, - MOVIES_UPDATE_LIST, - MOVIES_UPDATE_WANTED_LIST, -} from "../constants"; -import { AsyncAction } from "../types"; -import { defaultAOS } from "../utils"; + movieMarkBlacklistDirty, + movieMarkDirtyById, + movieMarkHistoryDirty, + movieMarkWantedDirtyById, + movieRemoveById, + movieRemoveWantedById, + movieUpdateAll, + movieUpdateBlacklist, + movieUpdateById, + movieUpdateByRange, + movieUpdateHistory, + movieUpdateWantedById, + movieUpdateWantedByRange, +} from "../actions"; +import { AsyncUtility } from "../utils/async"; import { - deleteOrderListItemBy, - updateAsyncState, - updateOrderIdState, -} from "../utils/mapper"; + createAsyncEntityReducer, + createAsyncItemReducer, +} from "../utils/factory"; -const reducer = handleActions( - { - [MOVIES_UPDATE_WANTED_LIST]: ( - state, - action: AsyncAction> - ) => { - return { - ...state, - wantedMovieList: updateOrderIdState( - action, - state.wantedMovieList, - "radarrId" - ), - }; - }, - [MOVIES_DELETE_WANTED_ITEMS]: (state, action: Action) => { - return { - ...state, - wantedMovieList: deleteOrderListItemBy(action, state.wantedMovieList), - }; - }, - [MOVIES_UPDATE_HISTORY_LIST]: ( - state, - action: AsyncAction - ) => { - return { - ...state, - historyList: updateAsyncState(action, state.historyList.data), - }; - }, - [MOVIES_UPDATE_LIST]: ( - state, - action: AsyncAction> - ) => { - return { - ...state, - movieList: updateOrderIdState(action, state.movieList, "radarrId"), - }; - }, - [MOVIES_DELETE_ITEMS]: (state, action: Action) => { - return { - ...state, - movieList: deleteOrderListItemBy(action, state.movieList), - }; - }, - [MOVIES_UPDATE_BLACKLIST]: ( - state, - action: AsyncAction - ) => { - return { - ...state, - blacklist: updateAsyncState(action, state.blacklist.data), - }; - }, - }, - { - movieList: defaultAOS(), - wantedMovieList: defaultAOS(), - historyList: { updating: true, data: [] }, - blacklist: { updating: true, data: [] }, - } -); +interface Movie { + movieList: Async.Entity; + wantedMovieList: Async.Entity; + historyList: Async.Item; + blacklist: Async.Item; +} + +const defaultMovie: Movie = { + movieList: AsyncUtility.getDefaultEntity("radarrId"), + wantedMovieList: AsyncUtility.getDefaultEntity("radarrId"), + historyList: AsyncUtility.getDefaultItem(), + blacklist: AsyncUtility.getDefaultItem(), +}; + +const reducer = createReducer(defaultMovie, (builder) => { + createAsyncEntityReducer(builder, (s) => s.movieList, { + range: movieUpdateByRange, + ids: movieUpdateById, + removeIds: movieRemoveById, + all: movieUpdateAll, + dirty: movieMarkDirtyById, + }); + + createAsyncEntityReducer(builder, (s) => s.wantedMovieList, { + range: movieUpdateWantedByRange, + ids: movieUpdateWantedById, + removeIds: movieRemoveWantedById, + dirty: movieMarkWantedDirtyById, + }); + + createAsyncItemReducer(builder, (s) => s.historyList, { + all: movieUpdateHistory, + dirty: movieMarkHistoryDirty, + }); + + createAsyncItemReducer(builder, (s) => s.blacklist, { + all: movieUpdateBlacklist, + dirty: movieMarkBlacklistDirty, + }); +}); export default reducer; diff --git a/frontend/src/@redux/reducers/series.ts b/frontend/src/@redux/reducers/series.ts index 23ae4ecd6..86394c071 100644 --- a/frontend/src/@redux/reducers/series.ts +++ b/frontend/src/@redux/reducers/series.ts @@ -1,116 +1,96 @@ -import { Action, handleActions } from "redux-actions"; +import { createReducer } from "@reduxjs/toolkit"; import { - SERIES_DELETE_EPISODES, - SERIES_DELETE_ITEMS, - SERIES_DELETE_WANTED_ITEMS, - SERIES_UPDATE_BLACKLIST, - SERIES_UPDATE_EPISODE_LIST, - SERIES_UPDATE_HISTORY_LIST, - SERIES_UPDATE_LIST, - SERIES_UPDATE_WANTED_LIST, -} from "../constants"; -import { AsyncAction } from "../types"; -import { defaultAOS } from "../utils"; + episodesMarkBlacklistDirty, + episodesMarkDirtyById, + episodesMarkHistoryDirty, + episodesRemoveById, + episodesUpdateBlacklist, + episodesUpdateHistory, + episodeUpdateById, + episodeUpdateBySeriesId, + seriesMarkDirtyById, + seriesMarkWantedDirtyById, + seriesRemoveById, + seriesRemoveWantedById, + seriesUpdateAll, + seriesUpdateById, + seriesUpdateByRange, + seriesUpdateWantedById, + seriesUpdateWantedByRange, +} from "../actions"; +import { AsyncReducer, AsyncUtility } from "../utils/async"; import { - deleteAsyncListItemBy, - deleteOrderListItemBy, - updateAsyncList, - updateAsyncState, - updateOrderIdState, -} from "../utils/mapper"; + createAsyncEntityReducer, + createAsyncItemReducer, + createAsyncListReducer, +} from "../utils/factory"; -const reducer = handleActions( - { - [SERIES_UPDATE_WANTED_LIST]: ( - state, - action: AsyncAction> - ) => { - return { - ...state, - wantedEpisodesList: updateOrderIdState( - action, - state.wantedEpisodesList, - "sonarrEpisodeId" - ), - }; - }, - [SERIES_DELETE_WANTED_ITEMS]: (state, action: Action) => { - return { - ...state, - wantedEpisodesList: deleteOrderListItemBy( - action, - state.wantedEpisodesList - ), - }; - }, - [SERIES_UPDATE_EPISODE_LIST]: ( - state, - action: AsyncAction - ) => { - return { - ...state, - episodeList: updateAsyncList( - action, - state.episodeList, - "sonarrEpisodeId" - ), - }; - }, - [SERIES_DELETE_EPISODES]: (state, action: Action) => { - return { - ...state, - episodeList: deleteAsyncListItemBy( - action, - state.episodeList, - "sonarrEpisodeId" - ), - }; - }, - [SERIES_UPDATE_HISTORY_LIST]: ( - state, - action: AsyncAction - ) => { - return { - ...state, - historyList: updateAsyncState(action, state.historyList.data), - }; - }, - [SERIES_UPDATE_LIST]: ( - state, - action: AsyncAction> - ) => { - return { - ...state, - seriesList: updateOrderIdState( - action, - state.seriesList, - "sonarrSeriesId" - ), - }; - }, - [SERIES_DELETE_ITEMS]: (state, action: Action) => { - return { - ...state, - seriesList: deleteOrderListItemBy(action, state.seriesList), - }; - }, - [SERIES_UPDATE_BLACKLIST]: ( - state, - action: AsyncAction - ) => { - return { - ...state, - blacklist: updateAsyncState(action, state.blacklist.data), - }; - }, - }, - { - seriesList: defaultAOS(), - wantedEpisodesList: defaultAOS(), - episodeList: { updating: true, data: [] }, - historyList: { updating: true, data: [] }, - blacklist: { updating: true, data: [] }, - } -); +interface Series { + seriesList: Async.Entity; + wantedEpisodesList: Async.Entity; + episodeList: Async.List; + historyList: Async.Item; + blacklist: Async.Item; +} + +const defaultSeries: Series = { + seriesList: AsyncUtility.getDefaultEntity("sonarrSeriesId"), + wantedEpisodesList: AsyncUtility.getDefaultEntity("sonarrEpisodeId"), + episodeList: AsyncUtility.getDefaultList("sonarrEpisodeId"), + historyList: AsyncUtility.getDefaultItem(), + blacklist: AsyncUtility.getDefaultItem(), +}; + +const reducer = createReducer(defaultSeries, (builder) => { + createAsyncEntityReducer(builder, (s) => s.seriesList, { + range: seriesUpdateByRange, + ids: seriesUpdateById, + removeIds: seriesRemoveById, + all: seriesUpdateAll, + }); + + builder.addCase(seriesMarkDirtyById, (state, action) => { + const series = state.seriesList; + const dirtyIds = action.payload.map(String); + + AsyncReducer.markDirty(series, dirtyIds); + + // Update episode list + const episodes = state.episodeList; + const dirtyIdsSet = new Set(dirtyIds); + const dirtyEpisodeIds = episodes.content + .filter((v) => dirtyIdsSet.has(v.sonarrSeriesId.toString())) + .map((v) => String(v.sonarrEpisodeId)); + + AsyncReducer.markDirty(episodes, dirtyEpisodeIds); + }); + + createAsyncEntityReducer(builder, (s) => s.wantedEpisodesList, { + range: seriesUpdateWantedByRange, + ids: seriesUpdateWantedById, + removeIds: seriesRemoveWantedById, + dirty: seriesMarkWantedDirtyById, + }); + + createAsyncItemReducer(builder, (s) => s.historyList, { + all: episodesUpdateHistory, + dirty: episodesMarkHistoryDirty, + }); + + createAsyncItemReducer(builder, (s) => s.blacklist, { + all: episodesUpdateBlacklist, + dirty: episodesMarkBlacklistDirty, + }); + + createAsyncListReducer(builder, (s) => s.episodeList, { + ids: episodeUpdateBySeriesId, + }); + + createAsyncListReducer(builder, (s) => s.episodeList, { + ids: episodeUpdateById, + removeIds: episodesRemoveById, + dirty: episodesMarkDirtyById, + }); +}); export default reducer; diff --git a/frontend/src/@redux/reducers/site.ts b/frontend/src/@redux/reducers/site.ts index c7eac7737..a5dd99f53 100644 --- a/frontend/src/@redux/reducers/site.ts +++ b/frontend/src/@redux/reducers/site.ts @@ -1,100 +1,89 @@ +import { createReducer } from "@reduxjs/toolkit"; import { remove, uniqBy } from "lodash"; -import { Action, handleActions } from "redux-actions"; import apis from "../../apis"; import { - SITE_BADGE_UPDATE, - SITE_INITIALIZED, - SITE_INITIALIZE_FAILED, - SITE_NEED_AUTH, - SITE_NOTIFICATIONS_ADD, - SITE_NOTIFICATIONS_REMOVE, - SITE_OFFLINE_UPDATE, - SITE_PROGRESS_ADD, - SITE_PROGRESS_REMOVE, - SITE_SIDEBAR_UPDATE, -} from "../constants"; -import { AsyncAction } from "../types"; + siteAddNotifications, + siteAddProgress, + siteBootstrap, + siteChangeSidebar, + siteRedirectToAuth, + siteRemoveNotifications, + siteRemoveProgress, + siteUpdateBadges, + siteUpdateInitialization, + siteUpdateOffline, +} from "../actions/site"; -const reducer = handleActions( - { - [SITE_NEED_AUTH]: (state) => { - if (process.env.NODE_ENV !== "development") { +interface Site { + // Initialization state or error message + initialized: boolean | string; + auth: boolean; + progress: Server.Progress[]; + notifications: Server.Notification[]; + sidebar: string; + badges: Badge; + offline: boolean; +} + +const defaultSite: Site = { + initialized: false, + auth: true, + progress: [], + notifications: [], + sidebar: "", + badges: { + movies: 0, + episodes: 0, + providers: 0, + status: 0, + }, + offline: false, +}; + +const reducer = createReducer(defaultSite, (builder) => { + builder + .addCase(siteBootstrap.fulfilled, (state) => { + state.initialized = true; + }) + .addCase(siteBootstrap.rejected, (state) => { + state.initialized = "An Error Occurred When Initializing Bazarr UI"; + }) + .addCase(siteRedirectToAuth, (state) => { + if (process.env.NODE_ENV !== "production") { apis.danger_resetApi("NEED_AUTH"); } - return { - ...state, - auth: false, - }; - }, - [SITE_INITIALIZED]: (state) => ({ - ...state, - initialized: true, - }), - [SITE_INITIALIZE_FAILED]: (state) => ({ - ...state, - initialized: "An Error Occurred When Initializing Bazarr UI", - }), - [SITE_NOTIFICATIONS_ADD]: ( - state, - action: Action - ) => { - const notifications = uniqBy( + state.auth = false; + }) + .addCase(siteUpdateInitialization, (state, action) => { + state.initialized = action.payload; + }) + .addCase(siteAddNotifications, (state, action) => { + state.notifications = uniqBy( [...action.payload.reverse(), ...state.notifications], (n) => n.id ); - return { ...state, notifications }; - }, - [SITE_NOTIFICATIONS_REMOVE]: (state, action: Action) => { - const notifications = [...state.notifications]; - remove(notifications, (n) => n.id === action.payload); - return { ...state, notifications }; - }, - [SITE_PROGRESS_ADD]: (state, action: Action) => { - const progress = uniqBy( + }) + .addCase(siteRemoveNotifications, (state, action) => { + remove(state.notifications, (n) => n.id === action.payload); + }) + .addCase(siteAddProgress, (state, action) => { + state.progress = uniqBy( [...action.payload.reverse(), ...state.progress], (n) => n.id ); - return { ...state, progress }; - }, - [SITE_PROGRESS_REMOVE]: (state, action: Action) => { - const progress = [...state.progress]; - remove(progress, (n) => n.id === action.payload); - return { ...state, progress }; - }, - [SITE_SIDEBAR_UPDATE]: (state, action: Action) => { - return { - ...state, - sidebar: action.payload, - }; - }, - [SITE_BADGE_UPDATE]: { - next: (state, action: AsyncAction) => { - const badges = action.payload.item; - if (badges && action.error !== true) { - return { ...state, badges: badges as Badge }; - } - return state; - }, - throw: (state) => state, - }, - [SITE_OFFLINE_UPDATE]: (state, action: Action) => { - return { ...state, offline: action.payload }; - }, - }, - { - initialized: false, - auth: true, - progress: [], - notifications: [], - sidebar: "", - badges: { - movies: 0, - episodes: 0, - providers: 0, - status: 0, - }, - offline: false, - } -); + }) + .addCase(siteRemoveProgress, (state, action) => { + remove(state.progress, (n) => n.id === action.payload); + }) + .addCase(siteChangeSidebar, (state, action) => { + state.sidebar = action.payload; + }) + .addCase(siteUpdateOffline, (state, action) => { + state.offline = action.payload; + }) + .addCase(siteUpdateBadges.fulfilled, (state, action) => { + state.badges = action.payload; + }); +}); export default reducer; diff --git a/frontend/src/@redux/reducers/system.ts b/frontend/src/@redux/reducers/system.ts index f3498be69..1c3efdf93 100644 --- a/frontend/src/@redux/reducers/system.ts +++ b/frontend/src/@redux/reducers/system.ts @@ -1,121 +1,74 @@ -import { handleActions } from "redux-actions"; +import { createReducer } from "@reduxjs/toolkit"; import { - SYSTEM_UPDATE_HEALTH, - SYSTEM_UPDATE_LANGUAGES_LIST, - SYSTEM_UPDATE_LANGUAGES_PROFILE_LIST, - SYSTEM_UPDATE_LOGS, - SYSTEM_UPDATE_PROVIDERS, - SYSTEM_UPDATE_RELEASES, - SYSTEM_UPDATE_SETTINGS, - SYSTEM_UPDATE_STATUS, - SYSTEM_UPDATE_TASKS, -} from "../constants"; -import { updateAsyncState } from "../utils/mapper"; + providerUpdateList, + systemMarkTasksDirty, + systemUpdateHealth, + systemUpdateLanguages, + systemUpdateLanguagesProfiles, + systemUpdateLogs, + systemUpdateReleases, + systemUpdateSettings, + systemUpdateStatus, + systemUpdateTasks, +} from "../actions"; +import { AsyncUtility } from "../utils/async"; +import { createAsyncItemReducer } from "../utils/factory"; -const reducer = handleActions( - { - [SYSTEM_UPDATE_LANGUAGES_LIST]: (state, action) => { - const languages = updateAsyncState>(action, []); - const enabledLanguage: AsyncState = { - ...languages, - data: languages.data.filter((v) => v.enabled), - }; - const newState = { - ...state, - languages, - enabledLanguage, - }; - return newState; - }, - [SYSTEM_UPDATE_LANGUAGES_PROFILE_LIST]: (state, action) => { - const newState = { - ...state, - languagesProfiles: updateAsyncState>( - action, - [] - ), - }; - return newState; - }, - [SYSTEM_UPDATE_STATUS]: (state, action) => { - return { - ...state, - status: updateAsyncState( - action, - state.status.data - ), - }; - }, - [SYSTEM_UPDATE_HEALTH]: (state, action) => { - return { - ...state, - health: updateAsyncState(action, state.health.data), - }; - }, - [SYSTEM_UPDATE_TASKS]: (state, action) => { - return { - ...state, - tasks: updateAsyncState>(action, state.tasks.data), - }; - }, - [SYSTEM_UPDATE_PROVIDERS]: (state, action) => { - return { - ...state, - providers: updateAsyncState(action, state.providers.data), - }; - }, - [SYSTEM_UPDATE_LOGS]: (state, action) => { - return { - ...state, - logs: updateAsyncState(action, state.logs.data), - }; - }, - [SYSTEM_UPDATE_RELEASES]: (state, action) => { - return { - ...state, - releases: updateAsyncState(action, state.releases.data), - }; - }, - [SYSTEM_UPDATE_SETTINGS]: (state, action) => { - return { - ...state, - settings: updateAsyncState(action, state.settings.data), - }; - }, - }, - { - languages: { updating: true, data: [] }, - enabledLanguage: { updating: true, data: [] }, - languagesProfiles: { updating: true, data: [] }, - status: { - updating: true, - data: undefined, - }, - health: { - updating: true, - data: [], - }, - tasks: { - updating: true, - data: [], - }, - providers: { - updating: true, - data: [], - }, - logs: { - updating: true, - data: [], - }, - releases: { - updating: true, - data: [], - }, - settings: { - updating: true, - data: undefined, - }, - } -); +interface System { + languages: Async.Item; + languagesProfiles: Async.Item; + status: Async.Item; + health: Async.Item; + tasks: Async.Item; + providers: Async.Item; + logs: Async.Item; + releases: Async.Item; + settings: Async.Item; +} + +const defaultSystem: System = { + languages: AsyncUtility.getDefaultItem(), + languagesProfiles: AsyncUtility.getDefaultItem(), + status: AsyncUtility.getDefaultItem(), + health: AsyncUtility.getDefaultItem(), + tasks: AsyncUtility.getDefaultItem(), + providers: AsyncUtility.getDefaultItem(), + logs: AsyncUtility.getDefaultItem(), + releases: AsyncUtility.getDefaultItem(), + settings: AsyncUtility.getDefaultItem(), +}; + +const reducer = createReducer(defaultSystem, (builder) => { + createAsyncItemReducer(builder, (s) => s.languages, { + all: systemUpdateLanguages, + }); + + createAsyncItemReducer(builder, (s) => s.languagesProfiles, { + all: systemUpdateLanguagesProfiles, + }); + createAsyncItemReducer(builder, (s) => s.status, { all: systemUpdateStatus }); + createAsyncItemReducer(builder, (s) => s.settings, { + all: systemUpdateSettings, + }); + createAsyncItemReducer(builder, (s) => s.releases, { + all: systemUpdateReleases, + }); + createAsyncItemReducer(builder, (s) => s.logs, { + all: systemUpdateLogs, + }); + + createAsyncItemReducer(builder, (s) => s.health, { + all: systemUpdateHealth, + }); + + createAsyncItemReducer(builder, (s) => s.tasks, { + all: systemUpdateTasks, + dirty: systemMarkTasksDirty, + }); + + createAsyncItemReducer(builder, (s) => s.providers, { + all: providerUpdateList, + }); +}); export default reducer; diff --git a/frontend/src/@redux/redux.d.ts b/frontend/src/@redux/redux.d.ts deleted file mode 100644 index c0bd6058a..000000000 --- a/frontend/src/@redux/redux.d.ts +++ /dev/null @@ -1,62 +0,0 @@ -interface ReduxStore { - system: ReduxStore.System; - series: ReduxStore.Series; - movie: ReduxStore.Movie; - site: ReduxStore.Site; -} - -namespace ReduxStore { - interface Notification { - type: "error" | "warning" | "info"; - id: string; - message: string; - timeout: number; - } - - interface Progress { - id: string; - header: string; - name: string; - value: number; - count: number; - } - - interface Site { - // Initialization state or error message - initialized: boolean | string; - auth: boolean; - progress: Progress[]; - notifications: Notification[]; - sidebar: string; - badges: Badge; - offline: boolean; - } - - interface System { - languages: AsyncState>; - enabledLanguage: AsyncState>; - languagesProfiles: AsyncState>; - status: AsyncState; - health: AsyncState>; - tasks: AsyncState>; - providers: AsyncState>; - logs: AsyncState>; - releases: AsyncState>; - settings: AsyncState; - } - - interface Series { - seriesList: AsyncOrderState; - wantedEpisodesList: AsyncOrderState; - episodeList: AsyncState; - historyList: AsyncState>; - blacklist: AsyncState>; - } - - interface Movie { - movieList: AsyncOrderState; - wantedMovieList: AsyncOrderState; - historyList: AsyncState>; - blacklist: AsyncState>; - } -} diff --git a/frontend/src/@redux/store/index.ts b/frontend/src/@redux/store/index.ts index 6c30057c4..dcda82d74 100644 --- a/frontend/src/@redux/store/index.ts +++ b/frontend/src/@redux/store/index.ts @@ -1,17 +1,15 @@ -import { applyMiddleware, createStore } from "redux"; -import logger from "redux-logger"; -import promise from "redux-promise"; -import trunk from "redux-thunk"; -import rootReducer from "../reducers"; +import { configureStore } from "@reduxjs/toolkit"; +import apis from "../../apis"; +import reducer from "../reducers"; -const plugins = [promise, trunk]; +const store = configureStore({ + reducer, +}); -if ( - process.env.NODE_ENV === "development" && - process.env["REACT_APP_LOG_REDUX_EVENT"] !== "false" -) { - plugins.push(logger); -} +// FIXME +apis.dispatch = store.dispatch; + +export type AppDispatch = typeof store.dispatch; +export type RootState = ReturnType; -const store = createStore(rootReducer, applyMiddleware(...plugins)); export default store; diff --git a/frontend/src/@redux/tests/helper.ts b/frontend/src/@redux/tests/helper.ts new file mode 100644 index 000000000..8adfed91d --- /dev/null +++ b/frontend/src/@redux/tests/helper.ts @@ -0,0 +1,31 @@ +import { AsyncUtility } from "../utils/async"; + +export interface TestType { + id: number; + name: string; +} + +export interface Reducer { + item: Async.Item; + list: Async.List; + entities: Async.Entity; +} + +export const defaultState: Reducer = { + item: AsyncUtility.getDefaultItem(), + list: AsyncUtility.getDefaultList("id"), + entities: AsyncUtility.getDefaultEntity("id"), +}; + +export const defaultItem: TestType = { id: 0, name: "test" }; + +export const defaultList: TestType[] = [ + { id: 0, name: "test" }, + { id: 1, name: "test_1" }, + { id: 2, name: "test_2" }, + { id: 3, name: "test_3" }, + { id: 4, name: "test_4" }, + { id: 5, name: "test_5" }, + { id: 6, name: "test_6" }, + { id: 7, name: "test_6" }, +]; diff --git a/frontend/src/@redux/types.d.ts b/frontend/src/@redux/types.d.ts deleted file mode 100644 index 4bb9d951f..000000000 --- a/frontend/src/@redux/types.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Dispatch } from "redux"; -import { Action } from "redux-actions"; - -interface AsyncPayload { - loading: boolean; - item?: Payload | Error; - parameters: any[]; -} - -type AvailableType = Action | ActionDispatcher; - -type AsyncAction = Action>; -type ActionDispatcher = (dispatch: Dispatch>) => void; -type AsyncActionDispatcher = ( - dispatch: Dispatch> -) => Promise; - -type PromiseCreator = (...args: any[]) => Promise; -type AvailableCreator = (...args: any[]) => AvailableType[]; -type AsyncActionCreator = (...args: any[]) => AsyncActionDispatcher[]; - -type ActionCallback = () => Action | void; diff --git a/frontend/src/@redux/utils/__tests__/async-test.ts b/frontend/src/@redux/utils/__tests__/async-test.ts new file mode 100644 index 000000000..052d0a1eb --- /dev/null +++ b/frontend/src/@redux/utils/__tests__/async-test.ts @@ -0,0 +1,32 @@ +import {} from "jest"; +import { AsyncUtility } from "../async"; + +interface AsyncTest { + id: string; + name: string; +} + +it("Item Init", () => { + const item = AsyncUtility.getDefaultItem(); + expect(item.state).toEqual("uninitialized"); + expect(item.error).toBeNull(); + expect(item.content).toBeNull(); +}); + +it("List Init", () => { + const list = AsyncUtility.getDefaultList("id"); + expect(list.state).toEqual("uninitialized"); + expect(list.dirtyEntities).toHaveLength(0); + expect(list.error).toBeNull(); + expect(list.content).toHaveLength(0); +}); + +it("Entity Init", () => { + const entity = AsyncUtility.getDefaultEntity("id"); + expect(entity.state).toEqual("uninitialized"); + expect(entity.dirtyEntities).toHaveLength(0); + expect(entity.error).toBeNull(); + expect(entity.content.ids).toHaveLength(0); + expect(entity.content.keyName).toBe("id"); + expect(entity.content.entities).toMatchObject({}); +}); diff --git a/frontend/src/@redux/utils/async.ts b/frontend/src/@redux/utils/async.ts new file mode 100644 index 000000000..9b173f064 --- /dev/null +++ b/frontend/src/@redux/utils/async.ts @@ -0,0 +1,71 @@ +import { Draft } from "@reduxjs/toolkit"; +import { difference, uniq } from "lodash"; + +export namespace AsyncUtility { + export function getDefaultItem(): Async.Item { + return { + state: "uninitialized", + content: null, + error: null, + }; + } + + export function getDefaultList(key: keyof T): Async.List { + return { + state: "uninitialized", + keyName: key, + dirtyEntities: [], + content: [], + error: null, + }; + } + + export function getDefaultEntity(key: keyof T): Async.Entity { + return { + state: "uninitialized", + dirtyEntities: [], + content: { + keyName: key, + ids: [], + entities: {}, + }, + error: null, + }; + } +} + +export namespace AsyncReducer { + type DirtyType = Draft> | Draft>; + export function markDirty( + entity: T, + dirtyIds: string[] + ) { + if (entity.state !== "uninitialized" && entity.state !== "loading") { + entity.state = "dirty"; + entity.dirtyEntities.push(...dirtyIds); + entity.dirtyEntities = uniq(entity.dirtyEntities); + } + } + + export function updateDirty( + entity: T, + updatedIds: string[] + ) { + entity.dirtyEntities = difference(entity.dirtyEntities, updatedIds); + if (entity.dirtyEntities.length > 0) { + entity.state = "dirty"; + } else { + entity.state = "succeeded"; + } + } + + export function removeDirty( + entity: T, + removedIds: string[] + ) { + entity.dirtyEntities = difference(entity.dirtyEntities, removedIds); + if (entity.dirtyEntities.length === 0 && entity.state === "dirty") { + entity.state = "succeeded"; + } + } +} diff --git a/frontend/src/@redux/utils/factory.ts b/frontend/src/@redux/utils/factory.ts new file mode 100644 index 000000000..37cee5c5b --- /dev/null +++ b/frontend/src/@redux/utils/factory.ts @@ -0,0 +1,303 @@ +import { + ActionCreatorWithoutPayload, + ActionCreatorWithPayload, + ActionReducerMapBuilder, + AsyncThunk, + Draft, +} from "@reduxjs/toolkit"; +import { + difference, + findIndex, + isNull, + isString, + omit, + pullAll, + pullAllWith, +} from "lodash"; +import { conditionalLog } from "../../utilites/logger"; +import { AsyncReducer } from "./async"; + +interface ActionParam { + range?: AsyncThunk; + all?: AsyncThunk; + ids?: AsyncThunk; + removeIds?: ActionCreatorWithPayload; + dirty?: ID extends null + ? ActionCreatorWithoutPayload + : ActionCreatorWithPayload; +} + +export function createAsyncItemReducer( + builder: ActionReducerMapBuilder, + getItem: (state: Draft) => Draft>, + actions: Pick, "all" | "dirty"> +) { + const { all, dirty } = actions; + + all && + builder + .addCase(all.pending, (state) => { + const item = getItem(state); + item.state = "loading"; + item.error = null; + }) + .addCase(all.fulfilled, (state, action) => { + const item = getItem(state); + item.state = "succeeded"; + item.content = action.payload as Draft; + }) + .addCase(all.rejected, (state, action) => { + const item = getItem(state); + item.state = "failed"; + item.error = action.error.message ?? null; + }); + + dirty && + builder.addCase(dirty, (state) => { + const item = getItem(state); + if (item.state !== "uninitialized") { + item.state = "dirty"; + } + }); +} + +export function createAsyncListReducer( + builder: ActionReducerMapBuilder, + getList: (state: Draft) => Draft>, + actions: ActionParam +) { + const { ids, removeIds, all, dirty } = actions; + ids && + builder + .addCase(ids.pending, (state) => { + const list = getList(state); + list.state = "loading"; + list.error = null; + }) + .addCase(ids.fulfilled, (state, action) => { + const list = getList(state); + + const { + meta: { arg }, + } = action; + + const keyName = list.keyName as keyof T; + + action.payload.forEach((v) => { + const idx = findIndex(list.content, [keyName, v[keyName]]); + if (idx !== -1) { + list.content.splice(idx, 1, v as Draft); + } else { + list.content.unshift(v as Draft); + } + }); + + AsyncReducer.updateDirty(list, arg.map(String)); + }) + .addCase(ids.rejected, (state, action) => { + const list = getList(state); + list.state = "failed"; + list.error = action.error.message ?? null; + }); + + removeIds && + builder.addCase(removeIds, (state, action) => { + const list = getList(state); + const keyName = list.keyName as keyof T; + + const removeIds = action.payload.map(String); + + pullAllWith(list.content, removeIds, (lhs, rhs) => { + return String((lhs as T)[keyName]) === rhs; + }); + + AsyncReducer.removeDirty(list, removeIds); + }); + + all && + builder + .addCase(all.pending, (state) => { + const list = getList(state); + list.state = "loading"; + list.error = null; + }) + .addCase(all.fulfilled, (state, action) => { + const list = getList(state); + list.state = "succeeded"; + list.content = action.payload as Draft; + list.dirtyEntities = []; + }) + .addCase(all.rejected, (state, action) => { + const list = getList(state); + list.state = "failed"; + list.error = action.error.message ?? null; + }); + + dirty && + builder.addCase(dirty, (state, action) => { + const list = getList(state); + AsyncReducer.markDirty(list, action.payload.map(String)); + }); +} + +export function createAsyncEntityReducer( + builder: ActionReducerMapBuilder, + getEntity: (state: Draft) => Draft>, + actions: ActionParam, ID> +) { + const { all, removeIds, ids, range, dirty } = actions; + + const checkSizeUpdate = (entity: Draft>, newSize: number) => { + if (entity.content.ids.length !== newSize) { + // Reset Entity State + entity.dirtyEntities = []; + entity.content.ids = Array(newSize).fill(null); + entity.content.entities = {}; + } + }; + + range && + builder + .addCase(range.pending, (state) => { + const entity = getEntity(state); + entity.state = "loading"; + entity.error = null; + }) + .addCase(range.fulfilled, (state, action) => { + const entity = getEntity(state); + + const { + meta: { + arg: { start, length }, + }, + payload: { data, total }, + } = action; + + const keyName = entity.content.keyName as keyof T; + + checkSizeUpdate(entity, total); + + const idsToUpdate = data.map((v) => String(v[keyName])); + + entity.content.ids.splice(start, length, ...idsToUpdate); + data.forEach((v) => { + const key = String(v[keyName]); + entity.content.entities[key] = v as Draft; + }); + + AsyncReducer.updateDirty(entity, idsToUpdate); + }) + .addCase(range.rejected, (state, action) => { + const entity = getEntity(state); + entity.state = "failed"; + entity.error = action.error.message ?? null; + }); + + ids && + builder + .addCase(ids.pending, (state) => { + const entity = getEntity(state); + entity.state = "loading"; + entity.error = null; + }) + .addCase(ids.fulfilled, (state, action) => { + const entity = getEntity(state); + + const { + meta: { arg }, + payload: { data, total }, + } = action; + + const keyName = entity.content.keyName as keyof T; + + checkSizeUpdate(entity, total); + + const idsToAdd = data.map((v) => String(v[keyName])); + + // For new ids, remove null from list and add them + const newIds = difference( + idsToAdd, + entity.content.ids.filter(isString) + ); + const newSize = entity.content.ids.unshift(...newIds); + Array(newSize - total) + .fill(undefined) + .forEach(() => { + const idx = entity.content.ids.findIndex(isNull); + conditionalLog(idx === -1, "Error when deleting ids from entity"); + entity.content.ids.splice(idx, 1); + }); + + data.forEach((v) => { + const key = String(v[keyName]); + entity.content.entities[key] = v as Draft; + }); + + AsyncReducer.updateDirty(entity, arg.map(String)); + }) + .addCase(ids.rejected, (state, action) => { + const entity = getEntity(state); + entity.state = "failed"; + entity.error = action.error.message ?? null; + }); + + removeIds && + builder.addCase(removeIds, (state, action) => { + const entity = getEntity(state); + conditionalLog( + entity.state === "loading", + "Try to delete async entity when it's now loading" + ); + + const idsToDelete = action.payload.map(String); + pullAll(entity.content.ids, idsToDelete); + AsyncReducer.removeDirty(entity, idsToDelete); + omit(entity.content.entities, idsToDelete); + }); + + all && + builder + .addCase(all.pending, (state) => { + const entity = getEntity(state); + entity.state = "loading"; + entity.error = null; + }) + .addCase(all.fulfilled, (state, action) => { + const entity = getEntity(state); + + const { + payload: { data, total }, + } = action; + + conditionalLog( + data.length !== total, + "Length of data is mismatch with total length" + ); + + const keyName = entity.content.keyName as keyof T; + + entity.state = "succeeded"; + entity.dirtyEntities = []; + entity.content.ids = data.map((v) => String(v[keyName])); + entity.content.entities = data.reduce< + Draft<{ + [id: string]: T; + }> + >((prev, curr) => { + const id = String(curr[keyName]); + prev[id] = curr as Draft; + return prev; + }, {}); + }) + .addCase(all.rejected, (state, action) => { + const entity = getEntity(state); + entity.state = "failed"; + entity.error = action.error.message ?? null; + }); + + dirty && + builder.addCase(dirty, (state, action) => { + const entity = getEntity(state); + AsyncReducer.markDirty(entity, action.payload.map(String)); + }); +} diff --git a/frontend/src/@redux/utils/index.ts b/frontend/src/@redux/utils/index.ts deleted file mode 100644 index e0e063f0d..000000000 --- a/frontend/src/@redux/utils/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export function defaultAOS(): AsyncOrderState { - return { - updating: true, - data: { - items: [], - order: [], - dirty: false, - }, - }; -} diff --git a/frontend/src/@redux/utils/mapper.ts b/frontend/src/@redux/utils/mapper.ts deleted file mode 100644 index 772caa39a..000000000 --- a/frontend/src/@redux/utils/mapper.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { difference, has, isArray, isNull, isNumber, uniqBy } from "lodash"; -import { Action } from "redux-actions"; -import { conditionalLog } from "../../utilites/logger"; -import { AsyncAction } from "../types"; - -export function updateAsyncState( - action: AsyncAction, - defVal: Readonly -): AsyncState { - if (action.payload.loading) { - return { - updating: true, - data: defVal, - }; - } else if (action.error !== undefined) { - return { - updating: false, - error: action.payload.item as Error, - data: defVal, - }; - } else { - return { - updating: false, - error: undefined, - data: action.payload.item as Payload, - }; - } -} - -export function updateOrderIdState( - action: AsyncAction>, - state: AsyncOrderState, - id: ItemIdType -): AsyncOrderState { - if (action.payload.loading) { - return { - data: { - ...state.data, - dirty: true, - }, - updating: true, - }; - } else if (action.error !== undefined) { - return { - data: { - ...state.data, - dirty: true, - }, - updating: false, - error: action.payload.item as Error, - }; - } else { - const { data, total } = action.payload.item as AsyncDataWrapper; - const { parameters } = action.payload; - const [start, length] = parameters; - - // Convert item list to object - const newItems = data.reduce>( - (prev, curr) => { - const tid = curr[id]; - prev[tid] = curr; - return prev; - }, - { ...state.data.items } - ); - - let newOrder = [...state.data.order]; - - const countDist = total - newOrder.length; - if (countDist > 0) { - newOrder = Array(countDist).fill(null).concat(newOrder); - } else if (countDist < 0) { - // Completely drop old data if list has shrinked - newOrder = Array(total).fill(null); - } - - const idList = newOrder.filter(isNumber); - - const dataOrder: number[] = data.map((v) => v[id]); - - if (typeof start === "number" && typeof length === "number") { - newOrder.splice(start, length, ...dataOrder); - } else if (isArray(start)) { - // Find the null values and delete them, insert new values to the front of array - const addition = difference(dataOrder, idList); - let addCount = addition.length; - newOrder.unshift(...addition); - - newOrder = newOrder.flatMap((v) => { - if (isNull(v) && addCount > 0) { - --addCount; - return []; - } else { - return [v]; - } - }, []); - - conditionalLog( - addCount !== 0, - "Error when replacing item in OrderIdState" - ); - } else if (parameters.length === 0) { - // TODO: Delete me -> Full Update - newOrder = dataOrder; - } - - return { - updating: false, - data: { - dirty: true, - items: newItems, - order: newOrder, - }, - }; - } -} - -export function deleteOrderListItemBy( - action: Action, - state: AsyncOrderState -): AsyncOrderState { - const ids = action.payload; - const { items, order } = state.data; - const newItems = { ...items }; - ids.forEach((v) => { - if (has(newItems, v)) { - delete newItems[v]; - } - }); - const newOrder = difference(order, ids); - return { - ...state, - data: { - dirty: true, - items: newItems, - order: newOrder, - }, - }; -} - -export function deleteAsyncListItemBy( - action: Action, - state: AsyncState, - match: ItemIdType -): AsyncState { - const ids = new Set(action.payload); - const data = [...state.data].filter((v) => !ids.has(v[match])); - return { - ...state, - data, - }; -} - -export function updateAsyncList( - action: AsyncAction, - state: AsyncState, - match: ID -): AsyncState { - if (action.payload.loading) { - return { - ...state, - updating: true, - }; - } else if (action.error !== undefined) { - return { - ...state, - updating: false, - error: action.payload.item as Error, - }; - } else { - const olds = state.data as T[]; - const news = action.payload.item as T[]; - - const result = uniqBy([...news, ...olds], match); - - return { - updating: false, - data: result, - }; - } -} diff --git a/frontend/src/@socketio/hooks.ts b/frontend/src/@socketio/hooks.ts index efdc11cd9..62f6ef1b3 100644 --- a/frontend/src/@socketio/hooks.ts +++ b/frontend/src/@socketio/hooks.ts @@ -1,4 +1,4 @@ -import { useCallback, useEffect } from "react"; +import { useEffect } from "react"; import Socketio from "."; import { log } from "../utilites/logger"; @@ -11,16 +11,3 @@ export function useSocketIOReducer(reducer: SocketIO.Reducer) { }; }, [reducer]); } - -export function useWrapToOptionalId( - fn: (id: number[]) => void -): SocketIO.ActionFn { - return useCallback( - (id?: number[]) => { - if (id) { - fn(id); - } - }, - [fn] - ); -} diff --git a/frontend/src/@socketio/index.ts b/frontend/src/@socketio/index.ts index 48c73781c..e0a6bec3b 100644 --- a/frontend/src/@socketio/index.ts +++ b/frontend/src/@socketio/index.ts @@ -65,12 +65,13 @@ class SocketIOClient { if (!(e.type in records)) { records[e.type] = {}; } + const record = records[e.type]!; if (!(e.action in record)) { record[e.action] = []; } if (e.payload) { - record[e.action]?.push(e.payload); + record[e.action]!.push(e.payload); } }); @@ -91,11 +92,11 @@ class SocketIOClient { forIn(element, (ids, key) => { ids = uniq(ids); - const action = handler[key]; - if (typeof action == "function") { + const action = handler[key as SocketIO.ActionType]; + if (action) { action(ids); } else if (anyAction === undefined) { - log("warning", "Unhandle action of SocketIO event", key, type); + log("warning", "Unhandled SocketIO event", key, type); } }); }); diff --git a/frontend/src/@socketio/reducer.ts b/frontend/src/@socketio/reducer.ts index 5ea5fba94..a2519166d 100644 --- a/frontend/src/@socketio/reducer.ts +++ b/frontend/src/@socketio/reducer.ts @@ -1,44 +1,56 @@ -import { createAction } from "redux-actions"; +import { ActionCreator } from "@reduxjs/toolkit"; import { - badgeUpdateAll, - bootstrap, - movieDeleteItems, - movieDeleteWantedItems, - movieUpdateList, - movieUpdateWantedList, - seriesDeleteItems, - seriesDeleteWantedItems, - seriesUpdateList, - seriesUpdateWantedList, + episodesMarkBlacklistDirty, + episodesMarkDirtyById, + episodesMarkHistoryDirty, + episodesRemoveById, + movieMarkBlacklistDirty, + movieMarkDirtyById, + movieMarkHistoryDirty, + movieMarkWantedDirtyById, + movieRemoveById, + movieRemoveWantedById, + seriesMarkDirtyById, + seriesMarkWantedDirtyById, + seriesRemoveById, + seriesRemoveWantedById, siteAddNotifications, siteAddProgress, - siteInitializationFailed, + siteBootstrap, siteRemoveProgress, + siteUpdateBadges, + siteUpdateInitialization, siteUpdateOffline, - systemUpdateLanguagesAll, - systemUpdateSettings, + systemMarkTasksDirty, + systemUpdateAllSettings, + systemUpdateLanguages, } from "../@redux/actions"; import reduxStore from "../@redux/store"; -function bindToReduxStore( - fn: (ids?: number[]) => any -): SocketIO.ActionFn { - return (ids?: number[]) => reduxStore.dispatch(fn(ids)); +function bindReduxAction>(action: T) { + return (...args: Parameters) => { + reduxStore.dispatch(action(...args)); + }; } -export function createDeleteAction(type: string): SocketIO.ActionFn { - return createAction(type, (id?: number[]) => id ?? []); +function bindReduxActionWithParam>( + action: T, + ...param: Parameters +) { + return () => { + reduxStore.dispatch(action(...param)); + }; } export function createDefaultReducer(): SocketIO.Reducer[] { return [ { key: "connect", - any: () => reduxStore.dispatch(siteUpdateOffline(false)), + any: bindReduxActionWithParam(siteUpdateOffline, false), }, { key: "connect", - any: () => reduxStore.dispatch(bootstrap()), + any: bindReduxAction(siteBootstrap), }, { key: "connect_error", @@ -47,19 +59,19 @@ export function createDefaultReducer(): SocketIO.Reducer[] { if (initialized === true) { reduxStore.dispatch(siteUpdateOffline(true)); } else { - reduxStore.dispatch(siteInitializationFailed()); + reduxStore.dispatch(siteUpdateInitialization("Socket.IO Error")); } }, }, { key: "disconnect", - any: () => reduxStore.dispatch(siteUpdateOffline(true)), + any: bindReduxActionWithParam(siteUpdateOffline, true), }, { key: "message", update: (msg) => { if (msg) { - const notifications = msg.map((message) => ({ + const notifications = msg.map((message) => ({ message, type: "info", id: "backend-message", @@ -72,14 +84,10 @@ export function createDefaultReducer(): SocketIO.Reducer[] { }, { key: "progress", - update: (progress) => { - if (progress) { - reduxStore.dispatch(siteAddProgress(progress)); - } - }, + update: bindReduxAction(siteAddProgress), delete: (ids) => { setTimeout(() => { - ids?.forEach((id) => { + ids.forEach((id) => { reduxStore.dispatch(siteRemoveProgress(id)); }); }, 3 * 1000); @@ -87,43 +95,60 @@ export function createDefaultReducer(): SocketIO.Reducer[] { }, { key: "series", - update: bindToReduxStore(seriesUpdateList), - delete: bindToReduxStore(seriesDeleteItems), + update: bindReduxAction(seriesMarkDirtyById), + delete: bindReduxAction(seriesRemoveById), }, { key: "movie", - update: bindToReduxStore(movieUpdateList), - delete: bindToReduxStore(movieDeleteItems), + update: bindReduxAction(movieMarkDirtyById), + delete: bindReduxAction(movieRemoveById), + }, + { + key: "episode", + update: bindReduxAction(episodesMarkDirtyById), + delete: bindReduxAction(episodesRemoveById), }, { key: "episode-wanted", - update: (ids: number[] | undefined) => { - if (ids) { - reduxStore.dispatch(seriesUpdateWantedList(ids) as any); - } - }, - delete: bindToReduxStore(seriesDeleteWantedItems), + update: bindReduxAction(seriesMarkWantedDirtyById), + delete: bindReduxAction(seriesRemoveWantedById), }, { key: "movie-wanted", - update: (ids: number[] | undefined) => { - if (ids) { - reduxStore.dispatch(movieUpdateWantedList(ids) as any); - } - }, - delete: bindToReduxStore(movieDeleteWantedItems), + update: bindReduxAction(movieMarkWantedDirtyById), + delete: bindReduxAction(movieRemoveWantedById), }, { key: "settings", - any: bindToReduxStore(systemUpdateSettings), + any: bindReduxAction(systemUpdateAllSettings), }, { key: "languages", - any: bindToReduxStore(systemUpdateLanguagesAll), + any: bindReduxAction(systemUpdateLanguages), }, { key: "badges", - any: bindToReduxStore(badgeUpdateAll), + any: bindReduxAction(siteUpdateBadges), + }, + { + key: "movie-history", + any: bindReduxAction(movieMarkHistoryDirty), + }, + { + key: "movie-blacklist", + any: bindReduxAction(movieMarkBlacklistDirty), + }, + { + key: "episode-history", + any: bindReduxAction(episodesMarkHistoryDirty), + }, + { + key: "episode-blacklist", + any: bindReduxAction(episodesMarkBlacklistDirty), + }, + { + key: "task", + any: bindReduxAction(systemMarkTasksDirty), }, ]; } diff --git a/frontend/src/@types/api.d.ts b/frontend/src/@types/api.d.ts index 60cabec75..bcc5abed9 100644 --- a/frontend/src/@types/api.d.ts +++ b/frontend/src/@types/api.d.ts @@ -1,5 +1,3 @@ -type LanguageCodeType = string; - interface Badge { episodes: number; movies: number; @@ -7,35 +5,40 @@ interface Badge { status: number; } -interface ApiLanguage { - code2: LanguageCodeType; - name: string; - enabled: boolean; -} +declare namespace Language { + type CodeType = string; + interface Server { + code2: CodeType; + name: string; + enabled: boolean; + } -type Language = Omit & { - // TODO: Make things unify - hi?: boolean; - forced?: boolean; -}; + interface Info { + code2: CodeType; + name: string; + hi?: boolean; + forced?: boolean; + } -namespace Profile { - interface Item { + interface ProfileItem { id: number; audio_exclude: PythonBoolean; forced: PythonBoolean; hi: PythonBoolean; - language: LanguageCodeType; + language: CodeType; } - interface Languages { + + interface Profile { name: string; profileId: number; cutoff: number | null; - items: Item[]; + items: ProfileItem[]; } } -interface Subtitle extends Language { +interface Subtitle { + code2: Language.CodeType; + name: string; forced: boolean; hi: boolean; path: string | null; @@ -91,15 +94,15 @@ interface TitleType { } interface AudioLanguageType { - audio_language: Language[]; + audio_language: Language.Info[]; } interface ItemHistoryType { - language: Language; + language: Language.Info; provider: string; } -namespace Item { +declare namespace Item { type Base = PathType & TitleType & TagType & @@ -152,7 +155,7 @@ namespace Item { }; } -namespace Wanted { +declare namespace Wanted { type Base = MonitoredType & TagType & SceneNameType & { @@ -171,7 +174,7 @@ namespace Wanted { type Movie = Base & MovieIdType & TitleType; } -namespace Blacklist { +declare namespace Blacklist { type Base = ItemHistoryType & { parsed_timestamp: string; timestamp: string; @@ -187,7 +190,7 @@ namespace Blacklist { }; } -namespace History { +declare namespace History { type Base = SubtitlePathType & TagType & MonitoredType & @@ -196,7 +199,7 @@ namespace History { blacklisted: boolean; score?: string; subs_id?: string; - raw_timestamp: int; + raw_timestamp: number; parsed_timestamp: string; timestamp: string; description: string; @@ -225,6 +228,13 @@ namespace History { type ActionOptions = 1 | 2 | 3; } +declare namespace Parameter { + interface Range { + start: number; + length: number; + } +} + interface SearchResultType { matches: string[]; dont_matches: string[]; diff --git a/frontend/src/@types/async.d.ts b/frontend/src/@types/async.d.ts new file mode 100644 index 000000000..d72cc0ef2 --- /dev/null +++ b/frontend/src/@types/async.d.ts @@ -0,0 +1,22 @@ +declare namespace Async { + type State = "loading" | "succeeded" | "failed" | "dirty" | "uninitialized"; + + type IdType = number | string; + + type Base = { + state: State; + content: T; + error: string | null; + }; + + type List = Base & { + keyName: keyof T; + dirtyEntities: string[]; + }; + + type Item = Base; + + type Entity = Base> & { + dirtyEntities: string[]; + }; +} diff --git a/frontend/src/@types/basic.d.ts b/frontend/src/@types/basic.d.ts index 11ae9c5de..a2f50a277 100644 --- a/frontend/src/@types/basic.d.ts +++ b/frontend/src/@types/basic.d.ts @@ -11,22 +11,6 @@ type FileTree = { type StorageType = string | null; -interface OrderIdState { - items: IdState; - order: (number | null)[]; - dirty: boolean; -} - -interface AsyncState { - updating: boolean; - error?: Error; - data: Readonly; -} - -type AsyncOrderState = AsyncState>; - -type AsyncPayload = T extends AsyncState ? D : never; - type SelectorOption = { label: string; value: PAYLOAD; diff --git a/frontend/src/@types/form.d.ts b/frontend/src/@types/form.d.ts index d731bca07..b681e3a87 100644 --- a/frontend/src/@types/form.d.ts +++ b/frontend/src/@types/form.d.ts @@ -1,4 +1,4 @@ -namespace FormType { +declare namespace FormType { interface ModifyItem { id: number[]; profileid: (number | null)[]; @@ -57,7 +57,7 @@ namespace FormType { interface AddBlacklist { provider: string; subs_id: string; - language: LanguageCodeType; + language: Language.CodeType; subtitles_path: string; } diff --git a/frontend/src/@types/react-table.d.ts b/frontend/src/@types/react-table.d.ts index 0c917d200..05bb31cf3 100644 --- a/frontend/src/@types/react-table.d.ts +++ b/frontend/src/@types/react-table.d.ts @@ -1,3 +1,6 @@ +// @ts-nocheck +// TODO: Fine a better solution for this + import { UseColumnOrderInstanceProps, UseColumnOrderState, diff --git a/frontend/src/@types/server.d.ts b/frontend/src/@types/server.d.ts new file mode 100644 index 000000000..e2db5b185 --- /dev/null +++ b/frontend/src/@types/server.d.ts @@ -0,0 +1,16 @@ +declare namespace Server { + interface Notification { + type: "error" | "warning" | "info"; + id: string; + message: string; + timeout: number; + } + + interface Progress { + id: string; + header: string; + name: string; + value: number; + count: number; + } +} diff --git a/frontend/src/@types/settings.d.ts b/frontend/src/@types/settings.d.ts index 6a6e326d7..c47e7edbf 100644 --- a/frontend/src/@types/settings.d.ts +++ b/frontend/src/@types/settings.d.ts @@ -20,11 +20,11 @@ interface Settings { napisy24: Settings.Napisy24; subscene: Settings.Subscene; betaseries: Settings.Betaseries; - titlovi: Settings.titlovi; + titlovi: Settings.Titlovi; notifications: Settings.Notifications; } -namespace Settings { +declare namespace Settings { interface General { adaptive_searching: boolean; anti_captcha_provider?: string; diff --git a/frontend/src/@types/socket.d.ts b/frontend/src/@types/socket.d.ts index 4a00a0a31..10224bde3 100644 --- a/frontend/src/@types/socket.d.ts +++ b/frontend/src/@types/socket.d.ts @@ -1,4 +1,4 @@ -namespace SocketIO { +declare namespace SocketIO { type EventType = NumEventType | NullEventType | SpecialEventType; type NumEventType = @@ -23,25 +23,26 @@ namespace SocketIO { type SpecialEventType = "message" | "progress"; - type ReducerCreator = ValueOf< + type ActionType = "update" | "delete"; + + type ReducerCreator = ValueOf< { [P in E]: { key: P; - any?: () => void; - update?: ActionFn; - delete?: ActionFn; - } & LooseObject; - // TODO: Typing + any?: ActionHandler; + update?: ActionHandler; + delete?: ActionHandler; + }; } >; type Event = { type: EventType; - action: string; + action: ActionType; payload: any; }; - type ActionFn = (payload?: T[]) => void; + type ActionHandler = T extends null ? () => void : (payload: T[]) => void; type Reducer = | ReducerCreator @@ -49,9 +50,13 @@ namespace SocketIO { | ReducerCreator<"message", string> | ReducerCreator<"progress", CustomEvent.Progress, string>; - type ActionRecord = OptionalRecord>; + type ActionRecord = { + [P in EventType]?: { + [R in ActionType]?: any[]; + }; + }; namespace CustomEvent { - type Progress = ReduxStore.Progress; + type Progress = Server.Progress; } } diff --git a/frontend/src/@types/system.d.ts b/frontend/src/@types/system.d.ts index 66bbab8cc..154bb5b98 100644 --- a/frontend/src/@types/system.d.ts +++ b/frontend/src/@types/system.d.ts @@ -1,4 +1,4 @@ -namespace System { +declare namespace System { interface Task { interval: string; job_id: string; diff --git a/frontend/src/@types/utilities.d.ts b/frontend/src/@types/utilities.d.ts index 023ddfebf..d59e6e39d 100644 --- a/frontend/src/@types/utilities.d.ts +++ b/frontend/src/@types/utilities.d.ts @@ -17,6 +17,14 @@ type Pair = { value: T; }; +type EntityStruct = { + keyName: keyof T; + ids: (string | null)[]; + entities: { + [id: string]: T; + }; +}; + interface DataWrapper { data: T; } @@ -32,13 +40,7 @@ type Override = T & Omit; type Comparer = (lhs: T, rhs: T) => boolean; -type KeysOfType = NonNullable< - ValueOf<{ [P in keyof D]: D[P] extends T ? P : never }> ->; - -type ItemIdType = KeysOfType; - -type OptionalRecord = { [P in T]?: D }; +type OptionalRecord = { [P in T]?: D }; interface IdState { [key: number]: Readonly; diff --git a/frontend/src/App/Header.tsx b/frontend/src/App/Header.tsx index 47b4263b1..f0b1aacc8 100644 --- a/frontend/src/App/Header.tsx +++ b/frontend/src/App/Header.tsx @@ -50,9 +50,9 @@ interface Props {} const Header: FunctionComponent = () => { const setNeedAuth = useReduxAction(siteRedirectToAuth); - const [settings] = useSystemSettings(); + const settings = useSystemSettings(); - const canLogout = (settings.data?.auth.type ?? "none") === "form"; + const canLogout = (settings.content?.auth.type ?? "none") === "form"; const toggleSidebar = useContext(SidebarToggleContext); diff --git a/frontend/src/App/index.tsx b/frontend/src/App/index.tsx index 995a17ebc..93d0bf9c5 100644 --- a/frontend/src/App/index.tsx +++ b/frontend/src/App/index.tsx @@ -1,3 +1,4 @@ +import "@fontsource/roboto/300.css"; import React, { FunctionComponent, useCallback, @@ -5,14 +6,21 @@ import React, { useState, } from "react"; import { Row } from "react-bootstrap"; -import { Redirect } from "react-router-dom"; +import { Provider } from "react-redux"; +import { Route, Switch } from "react-router"; +import { BrowserRouter, Redirect } from "react-router-dom"; +import { useEffectOnceWhen } from "rooks"; import { useReduxStore } from "../@redux/hooks/base"; import { useNotification } from "../@redux/hooks/site"; +import store from "../@redux/store"; +import "../@scss/index.scss"; +import Socketio from "../@socketio"; +import Auth from "../Auth"; import { LoadingIndicator, ModalProvider } from "../components"; import Sidebar from "../Sidebar"; import LaunchError from "../special-pages/LaunchError"; import UIError from "../special-pages/UIError"; -import { useHasUpdateInject } from "../utilites"; +import { useBaseUrl, useHasUpdateInject } from "../utilites"; import Header from "./Header"; import NotificationContainer from "./notifications"; import Router from "./Router"; @@ -29,17 +37,15 @@ const App: FunctionComponent = () => { // Has any update? const hasUpdate = useHasUpdateInject(); - useEffect(() => { - if (initialized) { - if (hasUpdate) { - notify({ - type: "info", - message: "A new version of Bazarr is ready, restart is required", - // TODO: Restart action - }); - } + useEffectOnceWhen(() => { + if (hasUpdate) { + notify({ + type: "info", + message: "A new version of Bazarr is ready, restart is required", + // TODO: Restart action + }); } - }, [initialized, hasUpdate, notify]); + }, initialized === true); const [sidebar, setSidebar] = useState(false); const toggleSidebar = useCallback(() => setSidebar((s) => !s), []); @@ -77,4 +83,36 @@ const App: FunctionComponent = () => { } }; -export default App; +const MainRouter: FunctionComponent = () => { + const baseUrl = useBaseUrl(); + + useEffect(() => { + Socketio.initialize(); + }, []); + + return ( + + + + + + + + + + + ); +}; + +const Main: FunctionComponent = () => { + return ( + + {/* TODO: Enabled Strict Mode after react-bootstrap upgrade to bootstrap 5 */} + {/* */} + + {/* */} + + ); +}; + +export default Main; diff --git a/frontend/src/App/notifications/index.tsx b/frontend/src/App/notifications/index.tsx index d4f3806b4..1ea2f322a 100644 --- a/frontend/src/App/notifications/index.tsx +++ b/frontend/src/App/notifications/index.tsx @@ -20,37 +20,38 @@ import "./style.scss"; export interface NotificationContainerProps {} -const NotificationContainer: FunctionComponent = () => { - const { progress, notifications } = useReduxStore((s) => s.site); +const NotificationContainer: FunctionComponent = + () => { + const { progress, notifications } = useReduxStore((s) => s.site); - const items = useMemo(() => { - const progressItems = progress.map((v) => ( - - )); + const items = useMemo(() => { + const progressItems = progress.map((v) => ( + + )); - const notificationItems = notifications.map((v) => ( - - )); + const notificationItems = notifications.map((v) => ( + + )); - return [...progressItems, ...notificationItems]; - }, [notifications, progress]); - return ( -
-
{items}
-
- ); -}; + return [...progressItems, ...notificationItems]; + }, [notifications, progress]); + return ( +
+
{items}
+
+ ); + }; -type MessageHolderProps = ReduxStore.Notification & {}; +type MessageHolderProps = Server.Notification & {}; const NotificationToast: FunctionComponent = (props) => { const { message, type, id, timeout } = props; const removeNotification = useReduxAction(siteRemoveNotifications); - const remove = useCallback(() => removeNotification(id), [ - removeNotification, - id, - ]); + const remove = useCallback( + () => removeNotification(id), + [removeNotification, id] + ); useEffect(() => { const handle = setTimeout(remove, timeout); @@ -73,7 +74,7 @@ const NotificationToast: FunctionComponent = (props) => { ); }; -type ProgressHolderProps = ReduxStore.Progress & {}; +type ProgressHolderProps = Server.Progress & {}; const ProgressToast: FunctionComponent = ({ id, diff --git a/frontend/src/Blacklist/Movies/index.tsx b/frontend/src/Blacklist/Movies/index.tsx index f8913a3e2..7a13cc0ee 100644 --- a/frontend/src/Blacklist/Movies/index.tsx +++ b/frontend/src/Blacklist/Movies/index.tsx @@ -4,16 +4,16 @@ import { Container, Row } from "react-bootstrap"; import { Helmet } from "react-helmet"; import { useBlacklistMovies } from "../../@redux/hooks"; import { MoviesApi } from "../../apis"; -import { AsyncStateOverlay, ContentHeader } from "../../components"; +import { AsyncOverlay, ContentHeader } from "../../components"; import Table from "./table"; interface Props {} const BlacklistMoviesView: FunctionComponent = () => { - const [blacklist] = useBlacklistMovies(); + const blacklist = useBlacklistMovies(); return ( - - {({ data }) => ( + + {({ content }) => ( Movies Blacklist - Bazarr @@ -21,18 +21,18 @@ const BlacklistMoviesView: FunctionComponent = () => { MoviesApi.deleteBlacklist(true)} > Remove All -
+
)} -
+ ); }; diff --git a/frontend/src/Blacklist/Series/index.tsx b/frontend/src/Blacklist/Series/index.tsx index bde82a1a8..d0262585d 100644 --- a/frontend/src/Blacklist/Series/index.tsx +++ b/frontend/src/Blacklist/Series/index.tsx @@ -4,16 +4,16 @@ import { Container, Row } from "react-bootstrap"; import { Helmet } from "react-helmet"; import { useBlacklistSeries } from "../../@redux/hooks"; import { EpisodesApi } from "../../apis"; -import { AsyncStateOverlay, ContentHeader } from "../../components"; +import { AsyncOverlay, ContentHeader } from "../../components"; import Table from "./table"; interface Props {} const BlacklistSeriesView: FunctionComponent = () => { - const [blacklist] = useBlacklistSeries(); + const blacklist = useBlacklistSeries(); return ( - - {({ data }) => ( + + {({ content }) => ( Series Blacklist - Bazarr @@ -21,18 +21,18 @@ const BlacklistSeriesView: FunctionComponent = () => { EpisodesApi.deleteBlacklist(true)} > Remove All -
+
)} -
+ ); }; diff --git a/frontend/src/History/Movies/index.tsx b/frontend/src/History/Movies/index.tsx index 8484f4a3f..7669bf30c 100644 --- a/frontend/src/History/Movies/index.tsx +++ b/frontend/src/History/Movies/index.tsx @@ -13,7 +13,7 @@ import HistoryGenericView from "../generic"; interface Props {} const MoviesHistoryView: FunctionComponent = () => { - const [movies] = useMoviesHistory(); + const movies = useMoviesHistory(); const columns: Column[] = useMemo[]>( () => [ diff --git a/frontend/src/History/Series/index.tsx b/frontend/src/History/Series/index.tsx index d29cbc656..6c82d84a1 100644 --- a/frontend/src/History/Series/index.tsx +++ b/frontend/src/History/Series/index.tsx @@ -13,7 +13,7 @@ import HistoryGenericView from "../generic"; interface Props {} const SeriesHistoryView: FunctionComponent = () => { - const [series] = useSeriesHistory(); + const series = useSeriesHistory(); const columns: Column[] = useMemo[]>( () => [ diff --git a/frontend/src/History/Statistics/index.tsx b/frontend/src/History/Statistics/index.tsx index 6616a5182..f3444f6cd 100644 --- a/frontend/src/History/Statistics/index.tsx +++ b/frontend/src/History/Statistics/index.tsx @@ -12,6 +12,7 @@ import { XAxis, YAxis, } from "recharts"; +import { useDidMount } from "rooks"; import { HistoryApi, ProvidersApi, @@ -49,16 +50,26 @@ const SelectorContainer: FunctionComponent = ({ children }) => ( ); const HistoryStats: FunctionComponent = () => { - const [languages] = useAsyncRequest(() => SystemApi.languages(true), []); - - const [providerList] = useAsyncRequest( - () => ProvidersApi.providers(true), + const [languages, updateLanguages] = useAsyncRequest( + SystemApi.languages.bind(SystemApi), + [] + ); + const [providerList, updateProviderParam] = useAsyncRequest( + ProvidersApi.providers.bind(ProvidersApi), [] ); + const updateProvider = useCallback(() => updateProviderParam(true), [ + updateProviderParam, + ]); + + useDidMount(() => { + updateLanguages(true); + }); + const [timeframe, setTimeframe] = useState("month"); const [action, setAction] = useState>(null); - const [lang, setLanguage] = useState>(null); + const [lang, setLanguage] = useState>(null); const [provider, setProvider] = useState>(null); const promise = useCallback(() => { @@ -103,13 +114,14 @@ const HistoryStats: FunctionComponent = () => { clearable state={providerList} label={providerLabel} + update={updateProvider} onChange={setProvider} > diff --git a/frontend/src/History/generic/index.tsx b/frontend/src/History/generic/index.tsx index 4b14c486e..58dbe5acd 100644 --- a/frontend/src/History/generic/index.tsx +++ b/frontend/src/History/generic/index.tsx @@ -3,11 +3,11 @@ import React, { FunctionComponent } from "react"; import { Container, Row } from "react-bootstrap"; import { Helmet } from "react-helmet"; import { Column } from "react-table"; -import { AsyncStateOverlay, PageTable } from "../../components"; +import { AsyncOverlay, PageTable } from "../../components"; interface Props { type: "movies" | "series"; - state: Readonly>; + state: Readonly>; columns: Column[]; } @@ -23,15 +23,15 @@ const HistoryGenericView: FunctionComponent = ({ {typeName} History - Bazarr - - {({ data }) => ( + + {({ content }) => ( )} - + ); diff --git a/frontend/src/Movies/Detail/index.tsx b/frontend/src/Movies/Detail/index.tsx index 5415d2c8c..5adf6265f 100644 --- a/frontend/src/Movies/Detail/index.tsx +++ b/frontend/src/Movies/Detail/index.tsx @@ -7,7 +7,7 @@ import { faUser, faWrench, } from "@fortawesome/free-solid-svg-icons"; -import React, { FunctionComponent, useCallback, useState } from "react"; +import React, { FunctionComponent, useState } from "react"; import { Container, Row } from "react-bootstrap"; import { Helmet } from "react-helmet"; import { Redirect, RouteComponentProps, withRouter } from "react-router-dom"; @@ -25,7 +25,7 @@ import { import { ManualSearchModal } from "../../components/modals/ManualSearchModal"; import ItemOverview from "../../generic/ItemOverview"; import { RouterEmptyPath } from "../../special-pages/404"; -import { useOnLoadingFinish } from "../../utilites"; +import { useOnLoadedOnce } from "../../utilites"; import Table from "./table"; const download = (item: any, result: SearchResultType) => { @@ -48,22 +48,20 @@ interface Props extends RouteComponentProps {} const MovieDetailView: FunctionComponent = ({ match }) => { const id = Number.parseInt(match.params.id); - const [movie] = useMovieBy(id); - const item = movie.data; + const movie = useMovieBy(id); + const item = movie.content; - const profile = useProfileBy(movie.data?.profileId); + const profile = useProfileBy(movie.content?.profileId); const showModal = useShowModal(); const [valid, setValid] = useState(true); - const validator = useCallback(() => { - if (movie.data === null) { + useOnLoadedOnce(() => { + if (movie.content === null) { setValid(false); } - }, [movie.data]); - - useOnLoadingFinish(movie, validator); + }, movie); if (isNaN(id) || !valid) { return ; diff --git a/frontend/src/Movies/Detail/table.tsx b/frontend/src/Movies/Detail/table.tsx index 1bea23623..dfbf6fac5 100644 --- a/frontend/src/Movies/Detail/table.tsx +++ b/frontend/src/Movies/Detail/table.tsx @@ -3,7 +3,7 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import React, { FunctionComponent, useMemo } from "react"; import { Badge } from "react-bootstrap"; import { Column } from "react-table"; -import { useProfileItems } from "../../@redux/hooks"; +import { useProfileItemsToLanguages } from "../../@redux/hooks"; import { useShowOnlyDesired } from "../../@redux/hooks/site"; import { MoviesApi } from "../../apis"; import { AsyncButton, LanguageText, SimpleTable } from "../../components"; @@ -13,13 +13,13 @@ const missingText = "Missing Subtitles"; interface Props { movie: Item.Movie; - profile?: Profile.Languages; + profile?: Language.Profile; } const Table: FunctionComponent = ({ movie, profile }) => { const onlyDesired = useShowOnlyDesired(); - const profileItems = useProfileItems(profile); + const profileItems = useProfileItemsToLanguages(profile); const columns: Column[] = useMemo[]>( () => [ diff --git a/frontend/src/Movies/index.tsx b/frontend/src/Movies/index.tsx index a8c3f5bbe..b6415e6e8 100644 --- a/frontend/src/Movies/index.tsx +++ b/frontend/src/Movies/index.tsx @@ -5,8 +5,8 @@ import React, { FunctionComponent, useMemo } from "react"; import { Badge } from "react-bootstrap"; import { Link } from "react-router-dom"; import { Column } from "react-table"; -import { movieUpdateByRange, movieUpdateList } from "../@redux/actions"; -import { useRawMovies } from "../@redux/hooks"; +import { movieUpdateAll, movieUpdateByRange } from "../@redux/actions"; +import { useMovieEntities } from "../@redux/hooks"; import { useReduxAction } from "../@redux/hooks/base"; import { MoviesApi } from "../apis"; import { ActionBadge, LanguageText, TextPopover } from "../components"; @@ -16,8 +16,8 @@ import { BuildKey } from "../utilites"; interface Props {} const MovieView: FunctionComponent = () => { - const [movies] = useRawMovies(); - const load = useReduxAction(movieUpdateByRange); + const movies = useMovieEntities(); + const loader = useReduxAction(movieUpdateByRange); const columns: Column[] = useMemo[]>( () => [ { @@ -70,7 +70,7 @@ const MovieView: FunctionComponent = () => { Cell: ({ value, loose }) => { if (loose) { // Define in generic/BaseItemView/table.tsx - const profiles = loose[0] as Profile.Languages[]; + const profiles = loose[0] as Language.Profile[]; return profiles.find((v) => v.profileId === value)?.name ?? null; } else { return null; @@ -112,8 +112,8 @@ const MovieView: FunctionComponent = () => { MoviesApi.modify(form)} > diff --git a/frontend/src/Series/Episodes/index.tsx b/frontend/src/Series/Episodes/index.tsx index 169a30ba3..bf21b0a0c 100644 --- a/frontend/src/Series/Episodes/index.tsx +++ b/frontend/src/Series/Episodes/index.tsx @@ -7,12 +7,7 @@ import { faSync, faWrench, } from "@fortawesome/free-solid-svg-icons"; -import React, { - FunctionComponent, - useCallback, - useMemo, - useState, -} from "react"; +import React, { FunctionComponent, useMemo, useState } from "react"; import { Container, Row } from "react-bootstrap"; import { Helmet } from "react-helmet"; import { Redirect, RouteComponentProps, withRouter } from "react-router-dom"; @@ -27,7 +22,7 @@ import { } from "../../components"; import ItemOverview from "../../generic/ItemOverview"; import { RouterEmptyPath } from "../../special-pages/404"; -import { useOnLoadingFinish } from "../../utilites"; +import { useOnLoadedOnce } from "../../utilites"; import Table from "./table"; interface Params { @@ -39,53 +34,50 @@ interface Props extends RouteComponentProps {} const SeriesEpisodesView: FunctionComponent = (props) => { const { match } = props; const id = Number.parseInt(match.params.id); - const [serie] = useSerieBy(id); - const item = serie.data; + const series = useSerieBy(id); + const episodes = useEpisodesBy(id); + const serie = series.content; - const [episodes] = useEpisodesBy(serie.data?.sonarrSeriesId); - - const available = episodes.data.length !== 0; + const available = episodes.content.length !== 0; const details = useMemo( () => [ { icon: faHdd, - text: `${item?.episodeFileCount} files`, + text: `${serie?.episodeFileCount} files`, }, { icon: faAdjust, - text: item?.seriesType ?? "", + text: serie?.seriesType ?? "", }, ], - [item] + [serie] ); const showModal = useShowModal(); const [valid, setValid] = useState(true); - const validator = useCallback(() => { - if (serie.data === null) { + useOnLoadedOnce(() => { + if (series.content === null) { setValid(false); } - }, [serie.data]); + }, series); - useOnLoadingFinish(serie, validator); - - const profile = useProfileBy(serie.data?.profileId); + const profile = useProfileBy(series.content?.profileId); if (isNaN(id) || !valid) { return ; } - if (!item) { + if (!serie) { return ; } return ( - {item.title} - Bazarr (Series) + {serie.title} - Bazarr (Series) @@ -104,8 +96,8 @@ const SeriesEpisodesView: FunctionComponent = (props) => { SeriesApi.action({ action: "search-missing", seriesid: id }) } disabled={ - item.episodeFileCount === 0 || - item.profileId === null || + serie.episodeFileCount === 0 || + serie.profileId === null || !available } > @@ -114,36 +106,36 @@ const SeriesEpisodesView: FunctionComponent = (props) => { showModal("tools", episodes.data)} + onClick={() => showModal("tools", episodes.content)} > Tools showModal("upload", item)} + onClick={() => showModal("upload", serie)} > Upload showModal("edit", item)} + onClick={() => showModal("edit", serie)} > Edit Series - + -
+
= (props) => { >
); diff --git a/frontend/src/Series/Episodes/table.tsx b/frontend/src/Series/Episodes/table.tsx index c449ca8c0..ca7a4f00e 100644 --- a/frontend/src/Series/Episodes/table.tsx +++ b/frontend/src/Series/Episodes/table.tsx @@ -9,12 +9,12 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import React, { FunctionComponent, useCallback, useMemo } from "react"; import { Badge, ButtonGroup } from "react-bootstrap"; import { Column, TableUpdater } from "react-table"; -import { useProfileItems, useSerieBy } from "../../@redux/hooks"; +import { useProfileItemsToLanguages } from "../../@redux/hooks"; import { useShowOnlyDesired } from "../../@redux/hooks/site"; import { ProvidersApi } from "../../apis"; import { ActionButton, - AsyncStateOverlay, + AsyncOverlay, EpisodeHistoryModal, GroupTable, SubtitleToolModal, @@ -26,8 +26,9 @@ import { BuildKey, filterSubtitleBy } from "../../utilites"; import { SubtitleAction } from "./components"; interface Props { - episodes: AsyncState; - profile?: Profile.Languages; + serie: Async.Item; + episodes: Async.Base; + profile?: Language.Profile; } const download = (item: any, result: SearchResultType) => { @@ -46,12 +47,12 @@ const download = (item: any, result: SearchResultType) => { ); }; -const Table: FunctionComponent = ({ episodes, profile }) => { +const Table: FunctionComponent = ({ serie, episodes, profile }) => { const showModal = useShowModal(); const onlyDesired = useShowOnlyDesired(); - const profileItems = useProfileItems(profile); + const profileItems = useProfileItemsToLanguages(profile); const columns: Column[] = useMemo[]>( () => [ @@ -142,13 +143,11 @@ const Table: FunctionComponent = ({ episodes, profile }) => { Header: "Actions", accessor: "sonarrEpisodeId", Cell: ({ row, externalUpdate }) => { - const [serie] = useSerieBy(row.original.sonarrSeriesId); - return ( { externalUpdate && externalUpdate(row, "manual-search"); }} @@ -170,7 +169,7 @@ const Table: FunctionComponent = ({ episodes, profile }) => { }, }, ], - [onlyDesired, profileItems] + [onlyDesired, profileItems, serie] ); const updateRow = useCallback>( @@ -186,7 +185,7 @@ const Table: FunctionComponent = ({ episodes, profile }) => { const maxSeason = useMemo( () => - episodes.data.reduce( + episodes.content.reduce( (prev, curr) => Math.max(prev, curr.season), 0 ), @@ -195,11 +194,11 @@ const Table: FunctionComponent = ({ episodes, profile }) => { return ( - - {({ data }) => ( + + {({ content }) => ( = ({ episodes, profile }) => { emptyText="No Episode Found For This Series" > )} - + = () => { - const [series] = useRawSeries(); - const load = useReduxAction(seriesUpdateByRange); + const series = useSerieEntities(); + const loader = useReduxAction(seriesUpdateByRange); const columns: Column[] = useMemo[]>( () => [ { @@ -56,7 +56,7 @@ const SeriesView: FunctionComponent = () => { Cell: ({ value, loose }) => { if (loose) { // Define in generic/BaseItemView/table.tsx - const profiles = loose[0] as Profile.Languages[]; + const profiles = loose[0] as Language.Profile[]; return profiles.find((v) => v.profileId === value)?.name ?? null; } else { return null; @@ -68,11 +68,8 @@ const SeriesView: FunctionComponent = () => { accessor: "episodeFileCount", selectHide: true, Cell: (row) => { - const { - episodeFileCount, - episodeMissingCount, - profileId, - } = row.row.original; + const { episodeFileCount, episodeMissingCount, profileId } = + row.row.original; let progress = 0; let label = ""; if (episodeFileCount === 0 || !profileId) { @@ -118,8 +115,8 @@ const SeriesView: FunctionComponent = () => { SeriesApi.modify(form)} > diff --git a/frontend/src/Settings/Languages/components.tsx b/frontend/src/Settings/Languages/components.tsx index 37924da28..05c1793b6 100644 --- a/frontend/src/Settings/Languages/components.tsx +++ b/frontend/src/Settings/Languages/components.tsx @@ -1,16 +1,16 @@ import React, { FunctionComponent, useMemo } from "react"; -import { useEnabledLanguages, useProfiles } from "."; +import { useEnabledLanguagesContext, useProfilesContext } from "."; import { LanguageSelector as CLanguageSelector } from "../../components"; import { BaseInput, Selector, useSingleUpdate } from "../components"; interface LanguageSelectorProps { - options: readonly Language[]; + options: readonly Language.Info[]; } export const LanguageSelector: FunctionComponent< LanguageSelectorProps & BaseInput > = ({ settingKey, options }) => { - const enabled = useEnabledLanguages(); + const enabled = useEnabledLanguagesContext(); const update = useSingleUpdate(); return ( @@ -28,9 +28,9 @@ export const LanguageSelector: FunctionComponent< interface ProfileSelectorProps {} export const ProfileSelector: FunctionComponent< - ProfileSelectorProps & BaseInput + ProfileSelectorProps & BaseInput > = ({ settingKey }) => { - const profiles = useProfiles(); + const profiles = useProfilesContext(); const profileOptions = useMemo[]>( () => diff --git a/frontend/src/Settings/Languages/index.tsx b/frontend/src/Settings/Languages/index.tsx index 0274c33eb..01629bb51 100644 --- a/frontend/src/Settings/Languages/index.tsx +++ b/frontend/src/Settings/Languages/index.tsx @@ -1,6 +1,10 @@ import { isArray } from "lodash"; import React, { FunctionComponent, useContext } from "react"; -import { useLanguageProfiles, useLanguages } from "../../@redux/hooks"; +import { + useEnabledLanguages, + useLanguageProfiles, + useLanguages, +} from "../../@redux/hooks"; import { Check, CollapseBox, @@ -14,14 +18,16 @@ import { enabledLanguageKey, languageProfileKey } from "../keys"; import { LanguageSelector, ProfileSelector } from "./components"; import Table from "./table"; -const EnabledLanguageContext = React.createContext([]); +const EnabledLanguageContext = React.createContext( + [] +); const LanguagesProfileContext = React.createContext< - readonly Profile.Languages[] + readonly Language.Profile[] >([]); -export function useEnabledLanguages() { +export function useEnabledLanguagesContext() { const list = useContext(EnabledLanguageContext); - const latest = useLatest(enabledLanguageKey, isArray); + const latest = useLatest(enabledLanguageKey, isArray); if (latest) { return latest; @@ -30,9 +36,9 @@ export function useEnabledLanguages() { } } -export function useProfiles() { +export function useProfilesContext() { const list = useContext(LanguagesProfileContext); - const latest = useLatest(languageProfileKey, isArray); + const latest = useLatest(languageProfileKey, isArray); if (latest) { return latest; @@ -44,14 +50,14 @@ export function useProfiles() { interface Props {} const SettingsLanguagesView: FunctionComponent = () => { - const [languages] = useLanguages(false); - const [enabled] = useLanguages(true); - const [profiles] = useLanguageProfiles(); + const languages = useLanguages(); + const enabled = useEnabledLanguages(); + const profiles = useLanguageProfiles(); return ( - + void; + update: (profile: Language.Profile) => void; } -function createDefaultProfile(): Profile.Languages { +function createDefaultProfile(): Language.Profile { return { profileId: -1, name: "", @@ -40,11 +40,11 @@ const LanguagesProfileModal: FunctionComponent = ( ) => { const { update, ...modal } = props; - const profile = usePayload(modal.modalKey); + const profile = usePayload(modal.modalKey); const closeModal = useCloseModal(); - const languages = useEnabledLanguages(); + const languages = useEnabledLanguagesContext(); const [current, setProfile] = useState(createDefaultProfile); @@ -70,10 +70,7 @@ const LanguagesProfileModal: FunctionComponent = ( }, [current.items]); const updateProfile = useCallback( - ( - key: K, - value: Profile.Languages[K] - ) => { + (key: K, value: Language.Profile[K]) => { const newProfile = { ...current }; newProfile[key] = value; setProfile(newProfile); @@ -81,8 +78,8 @@ const LanguagesProfileModal: FunctionComponent = ( [current] ); - const updateRow = useCallback>( - (row, item: Profile.Item) => { + const updateRow = useCallback>( + (row, item: Language.ProfileItem) => { const list = [...current.items]; if (item) { list[row.index] = item; @@ -102,7 +99,7 @@ const LanguagesProfileModal: FunctionComponent = ( if (languages.length > 0) { const language = languages[0].code2; - const item: Profile.Item = { + const item: Language.ProfileItem = { id, language, audio_exclude: "False", @@ -131,7 +128,7 @@ const LanguagesProfileModal: FunctionComponent = ( ); - const columns = useMemo[]>( + const columns = useMemo[]>( () => [ { Header: "ID", diff --git a/frontend/src/Settings/Languages/table.tsx b/frontend/src/Settings/Languages/table.tsx index 8c70608f3..bbc7bf63a 100644 --- a/frontend/src/Settings/Languages/table.tsx +++ b/frontend/src/Settings/Languages/table.tsx @@ -8,7 +8,7 @@ import React, { } from "react"; import { Badge, Button, ButtonGroup } from "react-bootstrap"; import { Column, TableUpdater } from "react-table"; -import { useEnabledLanguages, useProfiles } from "."; +import { useEnabledLanguagesContext, useProfilesContext } from "."; import { ActionButton, SimpleTable, useShowModal } from "../../components"; import { useSingleUpdate } from "../components"; import { languageProfileKey } from "../keys"; @@ -16,9 +16,9 @@ import Modal from "./modal"; import { anyCutoff } from "./options"; const Table: FunctionComponent = () => { - const originalProfiles = useProfiles(); + const originalProfiles = useProfilesContext(); - const languages = useEnabledLanguages(); + const languages = useEnabledLanguagesContext(); const [profiles, setProfiles] = useState(() => cloneDeep(originalProfiles)); @@ -34,7 +34,7 @@ const Table: FunctionComponent = () => { const showModal = useShowModal(); const submitProfiles = useCallback( - (list: Profile.Languages[]) => { + (list: Language.Profile[]) => { update(list, languageProfileKey); setProfiles(list); }, @@ -42,7 +42,7 @@ const Table: FunctionComponent = () => { ); const updateProfile = useCallback( - (profile: Profile.Languages) => { + (profile: Language.Profile) => { const list = [...profiles]; const idx = list.findIndex((v) => v.profileId === profile.profileId); @@ -56,8 +56,8 @@ const Table: FunctionComponent = () => { [profiles, submitProfiles] ); - const updateRow = useCallback>( - (row, item?: Profile.Languages) => { + const updateRow = useCallback>( + (row, item?: Language.Profile) => { if (item) { showModal("profile", cloneDeep(item)); } else { @@ -69,7 +69,7 @@ const Table: FunctionComponent = () => { [submitProfiles, showModal, profiles] ); - const columns = useMemo[]>( + const columns = useMemo[]>( () => [ { Header: "Name", @@ -151,7 +151,7 @@ const Table: FunctionComponent = () => { interface ItemProps { className?: string; - item: Profile.Item; + item: Language.ProfileItem; cutoff: boolean; } diff --git a/frontend/src/Settings/Router.tsx b/frontend/src/Settings/Router.tsx index e7f4e277c..5bf6828c5 100644 --- a/frontend/src/Settings/Router.tsx +++ b/frontend/src/Settings/Router.tsx @@ -1,7 +1,5 @@ -import React, { FunctionComponent, useEffect } from "react"; +import React, { FunctionComponent } from "react"; import { Redirect, Route, Switch } from "react-router-dom"; -import { systemUpdateSettings } from "../@redux/actions"; -import { useReduxAction } from "../@redux/hooks/base"; import { useSetSidebar } from "../@redux/hooks/site"; import { RouterEmptyPath } from "../special-pages/404"; import General from "./General"; @@ -17,9 +15,6 @@ import UI from "./UI"; interface Props {} const Router: FunctionComponent = () => { - const update = useReduxAction(systemUpdateSettings); - useEffect(() => update, [update]); - useSetSidebar("Settings"); return ( diff --git a/frontend/src/Settings/components/hooks.ts b/frontend/src/Settings/components/hooks.ts index bdcc9f567..e2a81fe56 100644 --- a/frontend/src/Settings/components/hooks.ts +++ b/frontend/src/Settings/components/hooks.ts @@ -51,8 +51,7 @@ export function useExtract( validate: ValidateFuncType, override?: OverrideFuncType ): Readonly> { - const [systemSettings] = useSystemSettings(); - const settings = systemSettings.data; + const settings = useSystemSettings().content!; const extractValue = useMemo(() => { let value: Nullable = null; diff --git a/frontend/src/Settings/components/provider.tsx b/frontend/src/Settings/components/provider.tsx index 1c66e97b7..1d25cf843 100644 --- a/frontend/src/Settings/components/provider.tsx +++ b/frontend/src/Settings/components/provider.tsx @@ -10,11 +10,11 @@ import React, { import { Container, Row } from "react-bootstrap"; import { Helmet } from "react-helmet"; import { Prompt } from "react-router"; +import { useDidUpdate } from "rooks"; import { useSystemSettings } from "../../@redux/hooks"; import { useUpdateLocalStorage } from "../../@storage/local"; import { SystemApi } from "../../apis"; import { ContentHeader } from "../../components"; -import { useOnLoadingFinish } from "../../utilites"; import { log } from "../../utilites/logger"; import { enabledLanguageKey, @@ -35,7 +35,7 @@ function submitHooks(settings: LooseObject) { } if (enabledLanguageKey in settings) { - const item = settings[enabledLanguageKey] as Language[]; + const item = settings[enabledLanguageKey] as Language.Info[]; settings[enabledLanguageKey] = item.map((v) => v.code2); } @@ -59,13 +59,14 @@ const SettingsProvider: FunctionComponent = (props) => { const [updating, setUpdating] = useState(false); const [dispatcher, setDispatcher] = useState({}); - const cleanup = useCallback(() => { - setChange({}); - setUpdating(false); - }, []); - - const [settings] = useSystemSettings(); - useOnLoadingFinish(settings, cleanup); + const settings = useSystemSettings(); + useDidUpdate(() => { + // Will be updated by websocket + if (settings.state !== "loading") { + setChange({}); + setUpdating(false); + } + }, [settings.state]); const saveSettings = useCallback((settings: LooseObject) => { submitHooks(settings); @@ -90,9 +91,10 @@ const SettingsProvider: FunctionComponent = (props) => { setDispatcher(newDispatch); }, [saveSettings, saveLocalStorage]); - const defaultDispatcher = useMemo(() => dispatcher["__default__"], [ - dispatcher, - ]); + const defaultDispatcher = useMemo( + () => dispatcher["__default__"], + [dispatcher] + ); const submit = useCallback(() => { const dispatchMaps = new Map(); diff --git a/frontend/src/System/Logs/index.tsx b/frontend/src/System/Logs/index.tsx index 151d6fb69..49840abbf 100644 --- a/frontend/src/System/Logs/index.tsx +++ b/frontend/src/System/Logs/index.tsx @@ -2,16 +2,19 @@ import { faDownload, faSync, faTrash } from "@fortawesome/free-solid-svg-icons"; import React, { FunctionComponent, useCallback, useState } from "react"; import { Container, Row } from "react-bootstrap"; import { Helmet } from "react-helmet"; +import { systemUpdateLogs } from "../../@redux/actions"; import { useSystemLogs } from "../../@redux/hooks"; +import { useReduxAction } from "../../@redux/hooks/base"; import { SystemApi } from "../../apis"; -import { AsyncStateOverlay, ContentHeader } from "../../components"; +import { AsyncOverlay, ContentHeader } from "../../components"; import { useBaseUrl } from "../../utilites"; import Table from "./table"; interface Props {} const SystemLogsView: FunctionComponent = () => { - const [logs, update] = useSystemLogs(); + const logs = useSystemLogs(); + const update = useReduxAction(systemUpdateLogs); const [resetting, setReset] = useState(false); @@ -22,15 +25,15 @@ const SystemLogsView: FunctionComponent = () => { }, [baseUrl]); return ( - - {({ data }) => ( + + {({ content, state }) => ( Logs - Bazarr (System) @@ -54,11 +57,11 @@ const SystemLogsView: FunctionComponent = () => { -
+
)} -
+ ); }; diff --git a/frontend/src/System/Providers/index.tsx b/frontend/src/System/Providers/index.tsx index 3f8a15ae4..ea3e25fe5 100644 --- a/frontend/src/System/Providers/index.tsx +++ b/frontend/src/System/Providers/index.tsx @@ -2,26 +2,29 @@ import { faSync, faTrash } from "@fortawesome/free-solid-svg-icons"; import React, { FunctionComponent } from "react"; import { Container, Row } from "react-bootstrap"; import { Helmet } from "react-helmet"; +import { providerUpdateList } from "../../@redux/actions"; import { useSystemProviders } from "../../@redux/hooks"; +import { useReduxAction } from "../../@redux/hooks/base"; import { ProvidersApi } from "../../apis"; -import { AsyncStateOverlay, ContentHeader } from "../../components"; +import { AsyncOverlay, ContentHeader } from "../../components"; import Table from "./table"; interface Props {} const SystemProvidersView: FunctionComponent = () => { - const [providers, update] = useSystemProviders(); + const providers = useSystemProviders(); + const update = useReduxAction(providerUpdateList); return ( - - {({ data }) => ( + + {({ content, state }) => ( Providers - Bazarr (System) @@ -36,11 +39,11 @@ const SystemProvidersView: FunctionComponent = () => { -
+
)} -
+ ); }; diff --git a/frontend/src/System/Releases/index.tsx b/frontend/src/System/Releases/index.tsx index 778916c35..1e4cb857f 100644 --- a/frontend/src/System/Releases/index.tsx +++ b/frontend/src/System/Releases/index.tsx @@ -2,32 +2,55 @@ import React, { FunctionComponent, useMemo } from "react"; import { Badge, Card, Col, Container, Row } from "react-bootstrap"; import { Helmet } from "react-helmet"; import { useSystemReleases } from "../../@redux/hooks"; -import { AsyncStateOverlay } from "../../components"; +import { AsyncOverlay } from "../../components"; import { BuildKey } from "../../utilites"; interface Props {} const ReleasesView: FunctionComponent = () => { - const [releases] = useSystemReleases(); + const releases = useSystemReleases(); return ( - - {({ data }) => ( - - - Releases - Bazarr (System) - - - {data.map((v, idx) => ( - - - - ))} - - - )} - + + + Releases - Bazarr (System) + + + + {({ content }) => { + return ( + + {content?.map((v, idx) => ( + + + + ))} + + ); + }} + + + ); + + // return ( + // + // {({ data }) => ( + // + // + // Releases - Bazarr (System) + // + // + // {data.map((v, idx) => ( + // + // + // + // ))} + // + // + // )} + // + // ); }; const headerBadgeCls = "mr-2"; diff --git a/frontend/src/System/Status/index.tsx b/frontend/src/System/Status/index.tsx index 422c41dd8..9db1380ef 100644 --- a/frontend/src/System/Status/index.tsx +++ b/frontend/src/System/Status/index.tsx @@ -10,7 +10,7 @@ import React, { FunctionComponent } from "react"; import { Col, Container, Row } from "react-bootstrap"; import { Helmet } from "react-helmet"; import { useSystemHealth, useSystemStatus } from "../../@redux/hooks"; -import { AsyncStateOverlay } from "../../components"; +import { AsyncOverlay } from "../../components"; import { GithubRepoRoot } from "../../constants"; import Table from "./table"; @@ -65,19 +65,8 @@ const InfoContainer: FunctionComponent<{ title: string }> = ({ interface Props {} const SystemStatusView: FunctionComponent = () => { - const [health] = useSystemHealth(); - const [status] = useSystemStatus(); - - let health_table; - if (health.data.length) { - health_table = ( - - {({ data }) =>
} -
- ); - } else { - health_table = "No issues with your configuration"; - } + const health = useSystemHealth(); + const status = useSystemStatus(); return ( @@ -85,7 +74,13 @@ const SystemStatusView: FunctionComponent = () => { Status - Bazarr (System) - {health_table} + + + {({ content }) => { + return
; + }} +
+
diff --git a/frontend/src/System/Status/table.tsx b/frontend/src/System/Status/table.tsx index db6e9173d..b157d9378 100644 --- a/frontend/src/System/Status/table.tsx +++ b/frontend/src/System/Status/table.tsx @@ -6,7 +6,7 @@ interface Props { health: readonly System.Health[]; } -const Table: FunctionComponent = (props) => { +const Table: FunctionComponent = ({ health }) => { const columns: Column[] = useMemo[]>( () => [ { @@ -21,7 +21,13 @@ const Table: FunctionComponent = (props) => { [] ); - return ; + return ( + + ); }; export default Table; diff --git a/frontend/src/System/Tasks/index.tsx b/frontend/src/System/Tasks/index.tsx index 149624406..4211e0991 100644 --- a/frontend/src/System/Tasks/index.tsx +++ b/frontend/src/System/Tasks/index.tsx @@ -2,25 +2,28 @@ import { faSync } from "@fortawesome/free-solid-svg-icons"; import React, { FunctionComponent } from "react"; import { Container, Row } from "react-bootstrap"; import { Helmet } from "react-helmet"; +import { systemMarkTasksDirty } from "../../@redux/actions"; import { useSystemTasks } from "../../@redux/hooks"; -import { AsyncStateOverlay, ContentHeader } from "../../components"; +import { useReduxAction } from "../../@redux/hooks/base"; +import { AsyncOverlay, ContentHeader } from "../../components"; import Table from "./table"; interface Props {} const SystemTasksView: FunctionComponent = () => { - const [tasks, update] = useSystemTasks(); + const tasks = useSystemTasks(); + const update = useReduxAction(systemMarkTasksDirty); return ( - - {({ data }) => ( + + {({ content, state }) => ( Tasks - Bazarr (System) @@ -28,11 +31,11 @@ const SystemTasksView: FunctionComponent = () => { -
+
)} -
+ ); }; diff --git a/frontend/src/Wanted/Movies/index.tsx b/frontend/src/Wanted/Movies/index.tsx index 3d9e5cfe0..2d33b144b 100644 --- a/frontend/src/Wanted/Movies/index.tsx +++ b/frontend/src/Wanted/Movies/index.tsx @@ -15,7 +15,7 @@ import GenericWantedView from "../generic"; interface Props {} const WantedMoviesView: FunctionComponent = () => { - const [movies] = useWantedMovies(); + const wantedMovies = useWantedMovies(); const loader = useReduxAction(movieUpdateWantedByRange); @@ -75,7 +75,7 @@ const WantedMoviesView: FunctionComponent = () => { diff --git a/frontend/src/Wanted/Series/index.tsx b/frontend/src/Wanted/Series/index.tsx index 04d268c4c..57d62290f 100644 --- a/frontend/src/Wanted/Series/index.tsx +++ b/frontend/src/Wanted/Series/index.tsx @@ -15,7 +15,7 @@ import GenericWantedView from "../generic"; interface Props {} const WantedSeriesView: FunctionComponent = () => { - const [series] = useWantedSeries(); + const series = useWantedSeries(); const loader = useReduxAction(seriesUpdateWantedByRange); diff --git a/frontend/src/Wanted/generic/index.tsx b/frontend/src/Wanted/generic/index.tsx index 0a198afd2..f8a4fda36 100644 --- a/frontend/src/Wanted/generic/index.tsx +++ b/frontend/src/Wanted/generic/index.tsx @@ -9,8 +9,8 @@ import { AsyncPageTable, ContentHeader } from "../../components"; interface Props { type: "movies" | "series"; columns: Column[]; - state: Readonly>; - loader: (start: number, length: number) => void; + state: Async.Entity; + loader: (params: Parameter.Range) => void; searchAll: () => Promise; } @@ -23,7 +23,7 @@ function GenericWantedView({ }: Props) { const typeName = capitalize(type); - const dataCount = Object.keys(state.data.items).length; + const dataCount = Object.keys(state.content.entities).length; return ( @@ -41,7 +41,7 @@ function GenericWantedView({ { + const div = document.createElement("div"); + ReactDOM.render(, div); + ReactDOM.unmountComponentAtNode(div); +}); diff --git a/frontend/src/apis/episodes.ts b/frontend/src/apis/episodes.ts index 72cd9de15..4b8eefa0e 100644 --- a/frontend/src/apis/episodes.ts +++ b/frontend/src/apis/episodes.ts @@ -5,9 +5,9 @@ class EpisodeApi extends BaseApi { super("/episodes"); } - async bySeriesId(seriesid: number[]): Promise> { - return new Promise>((resolve, reject) => { - this.get>>("", { seriesid }) + async bySeriesId(seriesid: number[]): Promise { + return new Promise((resolve, reject) => { + this.get>("", { seriesid }) .then((result) => { resolve(result.data.data); }) @@ -17,9 +17,9 @@ class EpisodeApi extends BaseApi { }); } - async byEpisodeId(episodeid: number[]): Promise> { - return new Promise>((resolve, reject) => { - this.get>>("", { episodeid }) + async byEpisodeId(episodeid: number[]): Promise { + return new Promise((resolve, reject) => { + this.get>("", { episodeid }) .then((result) => { resolve(result.data.data); }) @@ -29,9 +29,9 @@ class EpisodeApi extends BaseApi { }); } - async wanted(start: number, length: number) { + async wanted(params: Parameter.Range) { return new Promise>((resolve, reject) => { - this.get>("/wanted", { start, length }) + this.get>("/wanted", params) .then((result) => { resolve(result.data); }) @@ -53,9 +53,9 @@ class EpisodeApi extends BaseApi { }); } - async history(episodeid?: number): Promise> { - return new Promise>((resolve, reject) => { - this.get>>("/history", { episodeid }) + async history(episodeid?: number): Promise { + return new Promise((resolve, reject) => { + this.get>("/history", { episodeid }) .then((result) => { resolve(result.data.data); }) @@ -101,9 +101,9 @@ class EpisodeApi extends BaseApi { }); } - async blacklist(): Promise> { - return new Promise>((resolve, reject) => { - this.get>>("/blacklist") + async blacklist(): Promise { + return new Promise((resolve, reject) => { + this.get>("/blacklist") .then((res) => { resolve(res.data.data); }) diff --git a/frontend/src/apis/history.ts b/frontend/src/apis/history.ts index 9847ab3eb..375aafff8 100644 --- a/frontend/src/apis/history.ts +++ b/frontend/src/apis/history.ts @@ -9,7 +9,7 @@ class HistoryApi extends BaseApi { timeframe?: History.TimeframeOptions, action?: History.ActionOptions, provider?: string, - language?: LanguageCodeType + language?: Language.CodeType ): Promise { return new Promise((resolve, reject) => { this.get("/stats", { diff --git a/frontend/src/apis/hooks.ts b/frontend/src/apis/hooks.ts index f0ee4f8a0..8b6a17788 100644 --- a/frontend/src/apis/hooks.ts +++ b/frontend/src/apis/hooks.ts @@ -1,24 +1,28 @@ import { useCallback, useState } from "react"; -import { useDidMount } from "rooks"; -type RequestReturn Promise> = PromiseType>; +type Request = (...args: any[]) => Promise; +type Return = PromiseType>; -export function useAsyncRequest Promise>( +export function useAsyncRequest( request: F, - defaultData: RequestReturn -): [AsyncState>, () => void] { - const [state, setState] = useState>>({ - updating: true, - data: defaultData, + initial: Return +): [Async.Base>, (...args: Parameters) => void] { + const [state, setState] = useState>>({ + state: "uninitialized", + content: initial, + error: null, }); - const update = useCallback(() => { - setState((s) => ({ ...s, updating: true })); - request() - .then((res) => setState({ updating: false, data: res })) - .catch((err) => setState((s) => ({ ...s, updating: false, err }))); - }, [request]); - - useDidMount(update); + const update = useCallback( + (...args: Parameters) => { + setState((s) => ({ ...s, state: "loading" })); + request(...args) + .then((res) => + setState({ state: "succeeded", content: res, error: null }) + ) + .catch((error) => setState((s) => ({ ...s, state: "failed", error }))); + }, + [request] + ); return [state, update]; } diff --git a/frontend/src/apis/index.ts b/frontend/src/apis/index.ts index e6e085542..eb91fe87c 100644 --- a/frontend/src/apis/index.ts +++ b/frontend/src/apis/index.ts @@ -1,14 +1,15 @@ import Axios, { AxiosError, AxiosInstance, CancelTokenSource } from "axios"; -import { siteRedirectToAuth, siteUpdateOffline } from "../@redux/actions"; -import reduxStore from "../@redux/store"; +import { siteRedirectToAuth } from "../@redux/actions"; +import { AppDispatch } from "../@redux/store"; import { getBaseUrl } from "../utilites"; class Api { axios!: AxiosInstance; source!: CancelTokenSource; + dispatch!: AppDispatch; constructor() { const baseUrl = `${getBaseUrl()}/api/`; - if (process.env.NODE_ENV === "development") { + if (process.env.NODE_ENV !== "production") { this.initialize(baseUrl, process.env["REACT_APP_APIKEY"]!); } else { this.initialize(baseUrl, window.Bazarr.apiKey); @@ -55,21 +56,10 @@ class Api { this.axios.defaults.headers.common["X-API-KEY"] = apikey; } - onOnline() { - const offline = reduxStore.getState().site.offline; - if (offline) { - reduxStore.dispatch(siteUpdateOffline(false)); - } - } - - onOffline() { - reduxStore.dispatch(siteUpdateOffline(true)); - } - handleError(code: number) { switch (code) { case 401: - reduxStore.dispatch(siteRedirectToAuth()); + this.dispatch(siteRedirectToAuth()); break; case 500: break; diff --git a/frontend/src/apis/movies.ts b/frontend/src/apis/movies.ts index 044b4540a..ac6bad5ae 100644 --- a/frontend/src/apis/movies.ts +++ b/frontend/src/apis/movies.ts @@ -5,9 +5,9 @@ class MovieApi extends BaseApi { super("/movies"); } - async blacklist(): Promise> { - return new Promise>((resolve, reject) => { - this.get>>("/blacklist") + async blacklist(): Promise { + return new Promise((resolve, reject) => { + this.get>("/blacklist") .then((res) => { resolve(res.data.data); }) @@ -49,9 +49,9 @@ class MovieApi extends BaseApi { }); } - async moviesBy(start: number, length: number) { + async moviesBy(params: Parameter.Range) { return new Promise>((resolve, reject) => { - this.get>("", { start, length }) + this.get>("", params) .then((result) => { resolve(result.data); }) @@ -69,9 +69,9 @@ class MovieApi extends BaseApi { }); } - async wanted(start: number, length: number) { + async wanted(params: Parameter.Range) { return new Promise>((resolve, reject) => { - this.get>("/wanted", { start, length }) + this.get>("/wanted", params) .then((result) => { resolve(result.data); }) @@ -93,9 +93,9 @@ class MovieApi extends BaseApi { }); } - async history(id?: number): Promise> { - return new Promise>((resolve, reject) => { - this.get>>("/history", { + async history(id?: number): Promise { + return new Promise((resolve, reject) => { + this.get>("/history", { radarrid: id, }) .then((result) => { diff --git a/frontend/src/apis/providers.ts b/frontend/src/apis/providers.ts index 7e04239e7..5e1239092 100644 --- a/frontend/src/apis/providers.ts +++ b/frontend/src/apis/providers.ts @@ -6,8 +6,8 @@ class ProviderApi extends BaseApi { } async providers(history: boolean = false) { - return new Promise>((resolve, reject) => { - this.get>>("", { history }) + return new Promise((resolve, reject) => { + this.get>("", { history }) .then((result) => { resolve(result.data.data); }) diff --git a/frontend/src/apis/series.ts b/frontend/src/apis/series.ts index 516891b50..d5349723d 100644 --- a/frontend/src/apis/series.ts +++ b/frontend/src/apis/series.ts @@ -17,9 +17,9 @@ class SeriesApi extends BaseApi { }); } - async seriesBy(start: number, length: number) { + async seriesBy(params: Parameter.Range) { return new Promise>((resolve, reject) => { - this.get>("", { start, length }) + this.get>("", params) .then((result) => { resolve(result.data); }) diff --git a/frontend/src/apis/system.ts b/frontend/src/apis/system.ts index 7bd1c6f93..f9bbbeab5 100644 --- a/frontend/src/apis/system.ts +++ b/frontend/src/apis/system.ts @@ -58,8 +58,8 @@ class SystemApi extends BaseApi { } async languages(history: boolean = false) { - return new Promise>((resolve, reject) => { - this.get>("/languages", { history }) + return new Promise((resolve, reject) => { + this.get("/languages", { history }) .then((result) => { resolve(result.data); }) @@ -70,8 +70,8 @@ class SystemApi extends BaseApi { } async languagesProfileList() { - return new Promise>((resolve, reject) => { - this.get>("/languages/profiles") + return new Promise((resolve, reject) => { + this.get("/languages/profiles") .then((result) => resolve(result.data)) .catch(reject); }); @@ -90,8 +90,8 @@ class SystemApi extends BaseApi { } async health() { - return new Promise((resolve, reject) => { - this.get>("/health") + return new Promise((resolve, reject) => { + this.get>("/health") .then((result) => { resolve(result.data.data); }) @@ -102,16 +102,16 @@ class SystemApi extends BaseApi { } async logs() { - return new Promise>((resolve, reject) => { - this.get>>("/logs") + return new Promise((resolve, reject) => { + this.get>("/logs") .then((result) => resolve(result.data.data)) .catch((err) => reject(err)); }); } async releases() { - return new Promise>((resolve, reject) => { - this.get>>("/releases") + return new Promise((resolve, reject) => { + this.get>("/releases") .then((result) => resolve(result.data.data)) .catch(reject); }); @@ -125,9 +125,9 @@ class SystemApi extends BaseApi { }); } - async getTasks() { - return new Promise((resolve, reject) => { - this.get>("/tasks") + async tasks() { + return new Promise((resolve, reject) => { + this.get>("/tasks") .then((result) => { resolve(result.data.data); }) diff --git a/frontend/src/components/LanguageSelector.tsx b/frontend/src/components/LanguageSelector.tsx index 1e17d7d90..17e17d8ac 100644 --- a/frontend/src/components/LanguageSelector.tsx +++ b/frontend/src/components/LanguageSelector.tsx @@ -2,11 +2,11 @@ import React, { useMemo } from "react"; import { Selector, SelectorProps } from "../components"; interface Props { - options: readonly Language[]; + options: readonly Language.Info[]; } type RemovedSelectorProps = Omit< - SelectorProps, + SelectorProps, "label" | "placeholder" >; @@ -15,7 +15,7 @@ export type LanguageSelectorProps = Override< RemovedSelectorProps >; -function getLabel(lang: Language) { +function getLabel(lang: Language.Info) { return lang.name; } @@ -24,7 +24,7 @@ export function LanguageSelector( ) { const { options, ...selector } = props; - const items = useMemo[]>( + const items = useMemo[]>( () => options.map((v) => ({ label: v.name, diff --git a/frontend/src/components/async.tsx b/frontend/src/components/async.tsx index 9f5ac273c..79a3b4f5c 100644 --- a/frontend/src/components/async.tsx +++ b/frontend/src/components/async.tsx @@ -1,10 +1,10 @@ import { faCheck, faCircleNotch, - faExclamationTriangle, faTimes, } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { isEmpty } from "lodash"; import React, { FunctionComponent, PropsWithChildren, @@ -13,84 +13,30 @@ import React, { useMemo, useState, } from "react"; -import { Alert, Button, ButtonProps, Container } from "react-bootstrap"; +import { Button, ButtonProps } from "react-bootstrap"; +import { useTimeoutWhen } from "rooks"; import { LoadingIndicator } from "."; -import { useNotification } from "../@redux/hooks/site"; -import { Reload } from "../utilites"; import { Selector, SelectorProps } from "./inputs"; -enum RequestState { - Success, - Error, - Invalid, +interface Props> { + ctx: T; + children: FunctionComponent; } -interface ChildProps { - data: NonNullable>; - error?: Error; -} - -interface AsyncStateOverlayProps { - state: AsyncState; - exist?: (item: T) => boolean; - children?: FunctionComponent>; -} - -function defaultExist(item: any) { - if (item instanceof Array) { - return item.length !== 0; +export function AsyncOverlay>(props: Props) { + const { ctx, children } = props; + if ( + ctx.state === "uninitialized" || + (ctx.state === "loading" && isEmpty(ctx.content)) + ) { + return ; + } else if (ctx.state === "failed") { + return

{ctx.error}

; } else { - return item !== null && item !== undefined; + return children(ctx); } } -export function AsyncStateOverlay(props: AsyncStateOverlayProps) { - const { exist, state, children } = props; - const missing = exist ? !exist(state.data) : !defaultExist(state.data); - - const onError = useNotification("async-loading"); - - useEffect(() => { - if (!state.updating && state.error !== undefined && !missing) { - onError({ - type: "error", - message: state.error.message, - }); - } - }, [state, onError, missing]); - - if (state.updating) { - if (missing) { - return ; - } - } else { - if (state.error && missing) { - return ( - - - - - Ouch! You got an error - -

{state.error.message}

-
-
- -
-
-
- ); - } - } - - return children ? children({ data: state.data!, error: state.error }) : null; -} - interface PromiseProps { promise: () => Promise; children: FunctionComponent; @@ -101,7 +47,7 @@ export function PromiseOverlay({ promise, children }: PromiseProps) { useEffect(() => { promise() - .then((result) => setItem(result)) + .then(setItem) .catch(() => {}); }, [promise]); @@ -112,29 +58,27 @@ export function PromiseOverlay({ promise, children }: PromiseProps) { } } -type ExtractAS> = Unpacked>; - -type AsyncSelectorProps> = { +type AsyncSelectorProps> = { state: T; - label: (item: ExtractAS) => string; + update: () => void; + label: (item: V) => string; }; type RemovedSelectorProps = Omit< SelectorProps, - "loading" | "options" + "loading" | "options" | "onFocus" >; export function AsyncSelector< - T extends AsyncState, + V, + T extends Async.Base, M extends boolean = false ->( - props: Override, RemovedSelectorProps, M>> -) { - const { label, state, ...selector } = props; +>(props: Override, RemovedSelectorProps>) { + const { label, state, update, ...selector } = props; - const options = useMemo>[]>( + const options = useMemo[]>( () => - state.data.map((v) => ({ + state.content.map((v) => ({ label: label(v), value: v, })), @@ -143,9 +87,14 @@ export function AsyncSelector< return ( { + if (state.state === "uninitialized") { + update(); + } + }} {...selector} > ); @@ -168,6 +117,12 @@ interface AsyncButtonProps { error?: () => void; } +enum RequestState { + Success, + Error, + Invalid, +} + export function AsyncButton( props: PropsWithChildren> ): JSX.Element { @@ -188,28 +143,15 @@ export function AsyncButton( const [state, setState] = useState(RequestState.Invalid); - const [, setHandle] = useState>(null); + const needFire = state !== RequestState.Invalid && !noReset; - useEffect(() => { - if (noReset) { - return; - } - - if (state === RequestState.Error || state === RequestState.Success) { - const handle = setTimeout(() => setState(RequestState.Invalid), 2 * 1000); - setHandle(handle); - } - - // Clear timeout handle so we wont leak memory - return () => { - setHandle((handle) => { - if (handle) { - clearTimeout(handle); - } - return null; - }); - }; - }, [state, noReset]); + useTimeoutWhen( + () => { + setState(RequestState.Invalid); + }, + 2 * 1000, + needFire + ); const click = useCallback(() => { if (state !== RequestState.Invalid) { diff --git a/frontend/src/components/index.tsx b/frontend/src/components/index.tsx index c8221f3d8..517153c0f 100644 --- a/frontend/src/components/index.tsx +++ b/frontend/src/components/index.tsx @@ -98,7 +98,7 @@ export const LoadingIndicator: FunctionComponent<{ }; interface LanguageTextProps { - text: Language; + text: Language.Info; className?: string; long?: boolean; } diff --git a/frontend/src/components/inputs/Selector.tsx b/frontend/src/components/inputs/Selector.tsx index bb3b25848..7ac6099c1 100644 --- a/frontend/src/components/inputs/Selector.tsx +++ b/frontend/src/components/inputs/Selector.tsx @@ -13,6 +13,7 @@ export interface SelectorProps { loading?: boolean; multiple?: M; onChange?: (k: SelectorValueType) => void; + onFocus?: (e: React.FocusEvent) => void; label?: (item: T) => string; defaultValue?: SelectorValueType; value?: SelectorValueType; @@ -32,6 +33,7 @@ export function Selector( options, multiple, onChange, + onFocus, defaultValue, components, value, @@ -89,6 +91,7 @@ export function Selector( components={components} className={`custom-selector w-100 ${className ?? ""}`} classNamePrefix="selector" + onFocus={onFocus} onChange={(v) => { if (onChange) { let res: T | T[] | null = null; diff --git a/frontend/src/components/modals/HistoryModal.tsx b/frontend/src/components/modals/HistoryModal.tsx index eb0977157..e842b5b8d 100644 --- a/frontend/src/components/modals/HistoryModal.tsx +++ b/frontend/src/components/modals/HistoryModal.tsx @@ -1,21 +1,10 @@ -import React, { - FunctionComponent, - useCallback, - useEffect, - useMemo, - useState, -} from "react"; +import React, { FunctionComponent, useCallback, useMemo } from "react"; import { Column } from "react-table"; -import { - AsyncStateOverlay, - HistoryIcon, - LanguageText, - PageTable, - TextPopover, -} from ".."; -import { EpisodesApi, MoviesApi } from "../../apis"; +import { useDidUpdate } from "rooks"; +import { HistoryIcon, LanguageText, PageTable, TextPopover } from ".."; +import { EpisodesApi, MoviesApi, useAsyncRequest } from "../../apis"; import { BlacklistButton } from "../../generic/blacklist"; -import { updateAsyncState } from "../../utilites"; +import { AsyncOverlay } from "../async"; import BaseModal, { BaseModalProps } from "./BaseModal"; import { usePayload } from "./provider"; @@ -24,20 +13,20 @@ export const MovieHistoryModal: FunctionComponent = (props) => { const movie = usePayload(modal.modalKey); - const [history, setHistory] = useState>({ - updating: false, - data: [], - }); + const [history, updateHistory] = useAsyncRequest( + MoviesApi.history.bind(MoviesApi), + [] + ); const update = useCallback(() => { if (movie) { - updateAsyncState(MoviesApi.history(movie.radarrId), setHistory, []); + updateHistory(movie.radarrId); } - }, [movie]); + }, [movie, updateHistory]); - useEffect(() => { + useDidUpdate(() => { update(); - }, [update]); + }, [movie?.radarrId]); const columns = useMemo[]>( () => [ @@ -104,15 +93,15 @@ export const MovieHistoryModal: FunctionComponent = (props) => { return ( - - {({ data }) => ( + + {({ content }) => ( )} - + ); }; @@ -124,22 +113,20 @@ export const EpisodeHistoryModal: FunctionComponent< > = (props) => { const episode = usePayload(props.modalKey); - const [history, setHistory] = useState>({ - updating: false, - data: [], - }); + const [history, updateHistory] = useAsyncRequest( + EpisodesApi.history.bind(EpisodesApi), + [] + ); const update = useCallback(() => { if (episode) { - updateAsyncState( - EpisodesApi.history(episode.sonarrEpisodeId), - setHistory, - [] - ); + updateHistory(episode.sonarrEpisodeId); } - }, [episode]); + }, [episode, updateHistory]); - useEffect(() => update(), [update]); + useDidUpdate(() => { + update(); + }, [episode?.sonarrEpisodeId]); const columns = useMemo[]>( () => [ @@ -207,15 +194,15 @@ export const EpisodeHistoryModal: FunctionComponent< return ( - - {({ data }) => ( + + {({ content }) => ( )} - + ); }; diff --git a/frontend/src/components/modals/ItemEditorModal.tsx b/frontend/src/components/modals/ItemEditorModal.tsx index de8ec19d0..b1a73a4b9 100644 --- a/frontend/src/components/modals/ItemEditorModal.tsx +++ b/frontend/src/components/modals/ItemEditorModal.tsx @@ -14,7 +14,7 @@ interface Props { const Editor: FunctionComponent = (props) => { const { onSuccess, submit, ...modal } = props; - const [profiles] = useLanguageProfiles(); + const profiles = useLanguageProfiles(); const item = usePayload(modal.modalKey); @@ -22,9 +22,9 @@ const Editor: FunctionComponent = (props) => { const profileOptions = useMemo[]>( () => - profiles.map((v) => { + profiles?.map((v) => { return { label: v.name, value: v.profileId }; - }), + }) ?? [], [profiles] ); const [id, setId] = useState>(null); diff --git a/frontend/src/components/modals/ManualSearchModal.tsx b/frontend/src/components/modals/ManualSearchModal.tsx index 6736ca888..31e116fd9 100644 --- a/frontend/src/components/modals/ManualSearchModal.tsx +++ b/frontend/src/components/modals/ManualSearchModal.tsx @@ -89,7 +89,7 @@ export const ManualSearchModal: FunctionComponent = ( { accessor: "language", Cell: ({ row: { original }, value }) => { - const lang: Language = { + const lang: Language.Info = { code2: value, hi: original.hearing_impaired === "True", forced: original.forced === "True", diff --git a/frontend/src/components/modals/MovieUploadModal.tsx b/frontend/src/components/modals/MovieUploadModal.tsx index 7d2750d63..c247db567 100644 --- a/frontend/src/components/modals/MovieUploadModal.tsx +++ b/frontend/src/components/modals/MovieUploadModal.tsx @@ -7,7 +7,11 @@ import { useCloseModal, usePayload, } from ".."; -import { useLanguageBy, useLanguages, useProfileBy } from "../../@redux/hooks"; +import { + useEnabledLanguages, + useLanguageBy, + useProfileBy, +} from "../../@redux/hooks"; import { MoviesApi } from "../../apis"; import BaseModal, { BaseModalProps } from "./BaseModal"; interface MovieProps {} @@ -17,7 +21,7 @@ const MovieUploadModal: FunctionComponent = ( ) => { const modal = props; - const [availableLanguages] = useLanguages(true); + const availableLanguages = useEnabledLanguages(); const movie = usePayload(modal.modalKey); @@ -25,7 +29,7 @@ const MovieUploadModal: FunctionComponent = ( const [uploading, setUpload] = useState(false); - const [language, setLanguage] = useState>(null); + const [language, setLanguage] = useState>(null); const profile = useProfileBy(movie?.profileId); diff --git a/frontend/src/components/modals/SeriesUploadModal.tsx b/frontend/src/components/modals/SeriesUploadModal.tsx index 69501360b..1a4ca4dbc 100644 --- a/frontend/src/components/modals/SeriesUploadModal.tsx +++ b/frontend/src/components/modals/SeriesUploadModal.tsx @@ -24,7 +24,7 @@ import { useCloseModal, usePayload, } from ".."; -import { useProfileBy, useProfileItems } from "../../@redux/hooks"; +import { useProfileBy, useProfileItemsToLanguages } from "../../@redux/hooks"; import { EpisodesApi, SubtitlesApi } from "../../apis"; import { Selector } from "../inputs"; import BaseModal, { BaseModalProps } from "./BaseModal"; @@ -75,7 +75,7 @@ const SeriesUploadModal: FunctionComponent = ({ const profile = useProfileBy(series?.profileId); - const languages = useProfileItems(profile); + const languages = useProfileItemsToLanguages(profile); const filelist = useMemo(() => pending.map((v) => v.form.file), [pending]); @@ -141,7 +141,7 @@ const SeriesUploadModal: FunctionComponent = ({ ); const updateLanguage = useCallback( - (lang: Nullable) => { + (lang: Nullable) => { if (lang) { const list = pending.map((v) => { const form = v.form; diff --git a/frontend/src/components/modals/SubtitleToolModal.tsx b/frontend/src/components/modals/SubtitleToolModal.tsx index a21878696..a3d6b68c3 100644 --- a/frontend/src/components/modals/SubtitleToolModal.tsx +++ b/frontend/src/components/modals/SubtitleToolModal.tsx @@ -42,7 +42,7 @@ import { usePayload, useShowModal, } from ".."; -import { useLanguages } from "../../@redux/hooks"; +import { useEnabledLanguages } from "../../@redux/hooks"; import { SubtitlesApi } from "../../apis"; import { isMovie, submodProcessColor } from "../../utilites"; import { log } from "../../utilites/logger"; @@ -54,7 +54,7 @@ import { availableTranslation, colorOptions } from "./toolOptions"; type SupportType = Item.Episode | Item.Movie; type TableColumnType = FormType.ModifySubtitle & { - _language: Language; + _language: Language.Info; }; enum State { @@ -207,10 +207,7 @@ const AdjustTimesModal: FunctionComponent = ( const [isPlus, setPlus] = useState(true); const [offset, setOffset] = useState<[number, number, number, number]>([ - 0, - 0, - 0, - 0, + 0, 0, 0, 0, ]); const updateOffset = useCallback( @@ -293,14 +290,15 @@ const TranslateModal: FunctionComponent = ({ process, ...modal }) => { - const [languages] = useLanguages(true); + const languages = useEnabledLanguages(); const available = useMemo( () => languages.filter((v) => v.code2 in availableTranslation), [languages] ); - const [selectedLanguage, setLanguage] = useState>(null); + const [selectedLanguage, setLanguage] = + useState>(null); const submit = useCallback(() => { if (selectedLanguage) { diff --git a/frontend/src/components/tables/AsyncPageTable.tsx b/frontend/src/components/tables/AsyncPageTable.tsx index 54bb969c9..254663176 100644 --- a/frontend/src/components/tables/AsyncPageTable.tsx +++ b/frontend/src/components/tables/AsyncPageTable.tsx @@ -1,41 +1,76 @@ -import { isNull } from "lodash"; -import React, { useCallback, useEffect, useMemo, useState } from "react"; +import React, { useCallback, useEffect, useState } from "react"; import { PluginHook, TableOptions, useTable } from "react-table"; import { LoadingIndicator } from ".."; import { usePageSize } from "../../@storage/local"; -import { buildOrderListFrom, isNonNullable, ScrollToTop } from "../../utilites"; +import { + ScrollToTop, + useEntityByRange, + useIsEntityLoaded, +} from "../../utilites"; import BaseTable, { TableStyleProps, useStyleAndOptions } from "./BaseTable"; import PageControl from "./PageControl"; import { useDefaultSettings } from "./plugins"; +function useEntityPagination( + entity: Async.Entity, + loader: (range: Parameter.Range) => void, + start: number, + end: number +): T[] { + const { state, content } = entity; + + const needInit = state === "uninitialized"; + const hasEmpty = useIsEntityLoaded(content, start, end) === false; + + useEffect(() => { + if (needInit || hasEmpty) { + const length = end - start; + loader({ start, length }); + } + }); + + return useEntityByRange(content, start, end); +} + type Props = TableOptions & TableStyleProps & { plugins?: PluginHook[]; - aos: AsyncOrderState; - loader: (start: number, length: number) => void; + entity: Async.Entity; + loader: (params: Parameter.Range) => void; }; export default function AsyncPageTable(props: Props) { - const { aos, plugins, loader, ...remain } = props; + const { entity, plugins, loader, ...remain } = props; const { style, options } = useStyleAndOptions(remain); const { - updating, - data: { order, items, dirty }, - } = aos; + state, + content: { ids }, + } = entity; - const allPlugins: PluginHook[] = [useDefaultSettings]; - - if (plugins) { - allPlugins.push(...plugins); - } - - // Impl a new pagination system instead of hooking into the existing one + // Impl a new pagination system instead of hacking into existing one const [pageIndex, setIndex] = useState(0); const [pageSize] = usePageSize(); - const totalRows = order.length; + const totalRows = ids.length; const pageCount = Math.ceil(totalRows / pageSize); + const pageStart = pageIndex * pageSize; + const pageEnd = pageStart + pageSize; + + const data = useEntityPagination(entity, loader, pageStart, pageEnd); + + const instance = useTable( + { + ...options, + data, + }, + useDefaultSettings, + ...(plugins ?? []) + ); + + const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow } = + instance; + const previous = useCallback(() => { setIndex((idx) => idx - 1); }, []); @@ -48,57 +83,22 @@ export default function AsyncPageTable(props: Props) { setIndex(idx); }, []); - const pageStart = pageIndex * pageSize; - const pageEnd = pageStart + pageSize; - - const visibleItemIds = useMemo(() => order.slice(pageStart, pageEnd), [ - pageStart, - pageEnd, - order, - ]); - - const newData = useMemo(() => buildOrderListFrom(items, visibleItemIds), [ - items, - visibleItemIds, - ]); - - const newOptions = useMemo>( - () => ({ - ...options, - data: newData, - }), - [options, newData] - ); - - const instance = useTable(newOptions, ...allPlugins); - - const { - getTableProps, - getTableBodyProps, - headerGroups, - rows, - prepareRow, - } = instance; - useEffect(() => { ScrollToTop(); }, [pageIndex]); + // Reset page index if we out of bound useEffect(() => { - const needFetch = visibleItemIds.length === 0 && dirty === false; - const needRefresh = !visibleItemIds.every(isNonNullable); - if (needFetch || needRefresh) { - loader(pageStart, pageSize); + if (pageCount === 0) return; + + if (pageIndex >= pageCount) { + setIndex(pageCount - 1); + } else if (pageIndex < 0) { + setIndex(0); } - }, [visibleItemIds, pageStart, pageSize, loader, dirty]); + }, [pageIndex, pageCount]); - const showLoading = useMemo( - () => - updating && (visibleItemIds.every(isNull) || visibleItemIds.length === 0), - [visibleItemIds, updating] - ); - - if (showLoading) { + if ((state === "loading" && data.length === 0) || state === "uninitialized") { return ; } diff --git a/frontend/src/generic/BaseItemView/index.tsx b/frontend/src/generic/BaseItemView/index.tsx index 616e4f771..07d970c31 100644 --- a/frontend/src/generic/BaseItemView/index.tsx +++ b/frontend/src/generic/BaseItemView/index.tsx @@ -1,26 +1,26 @@ import { faCheck, faList, faUndo } from "@fortawesome/free-solid-svg-icons"; +import { AsyncThunk } from "@reduxjs/toolkit"; import { uniqBy } from "lodash"; import React, { useCallback, useMemo, useState } from "react"; import { Container, Dropdown, Row } from "react-bootstrap"; import { Helmet } from "react-helmet"; import { Column } from "react-table"; import { useLanguageProfiles } from "../../@redux/hooks"; -import { useReduxActionWith } from "../../@redux/hooks/base"; -import { AsyncActionDispatcher } from "../../@redux/types"; +import { useAppDispatch } from "../../@redux/hooks/base"; import { ContentHeader } from "../../components"; import { GetItemId, isNonNullable } from "../../utilites"; import Table from "./table"; export interface SharedProps { name: string; - loader: (start: number, length: number) => void; + loader: (params: Parameter.Range) => void; columns: Column[]; modify: (form: FormType.ModifyItem) => Promise; - state: AsyncOrderState; + state: Async.Entity; } interface Props extends SharedProps { - updateAction: (id?: number[]) => AsyncActionDispatcher; + updateAction: AsyncThunk, void, {}>; } function BaseItemView({ @@ -32,35 +32,39 @@ function BaseItemView({ const [pendingEditMode, setPendingEdit] = useState(false); const [editMode, setEdit] = useState(false); - const onUpdated = useCallback(() => { - setPendingEdit((edit) => { - // Hack to remove all dependencies - setEdit(edit); - return edit; + const dispatch = useAppDispatch(); + const update = useCallback(() => { + dispatch(updateAction()).then(() => { + setPendingEdit((edit) => { + // Hack to remove all dependencies + setEdit(edit); + return edit; + }); + setDirty([]); }); - setDirty([]); - }, []); - - const update = useReduxActionWith(updateAction, onUpdated); + }, [dispatch, updateAction]); const [selections, setSelections] = useState([]); const [dirtyItems, setDirty] = useState([]); - const [profiles] = useLanguageProfiles(); + const profiles = useLanguageProfiles(); const profileOptions = useMemo(() => { const items: JSX.Element[] = []; - items.push( - Clear Profile - ); - items.push(); - items.push( - ...profiles.map((v) => ( - - {v.name} - - )) - ); + if (profiles) { + items.push( + Clear Profile + ); + items.push(); + items.push( + ...profiles.map((v) => ( + + {v.name} + + )) + ); + } + return items; }, [profiles]); @@ -79,13 +83,13 @@ function BaseItemView({ ); const startEdit = useCallback(() => { - if (shared.state.data.order.every(isNonNullable)) { + if (shared.state.content.ids.every(isNonNullable)) { setEdit(true); } else { update(); } setPendingEdit(true); - }, [shared.state.data.order, update]); + }, [shared.state.content.ids, update]); const endEdit = useCallback(() => { setEdit(false); @@ -143,7 +147,9 @@ function BaseItemView({ ) : ( diff --git a/frontend/src/generic/BaseItemView/table.tsx b/frontend/src/generic/BaseItemView/table.tsx index 8029c9231..708515bdc 100644 --- a/frontend/src/generic/BaseItemView/table.tsx +++ b/frontend/src/generic/BaseItemView/table.tsx @@ -11,7 +11,7 @@ import { } from "../../components"; import { TableStyleProps } from "../../components/tables/BaseTable"; import { useCustomSelection } from "../../components/tables/plugins"; -import { buildOrderList, GetItemId } from "../../utilites"; +import { GetItemId, useEntityToList } from "../../utilites"; interface Props extends SharedProps { dirtyItems: readonly T[]; @@ -38,16 +38,14 @@ function Table({ [showModal] ); - const idState = state.data; + const orderList = useEntityToList(state.content); - const orderList = useMemo(() => buildOrderList(idState), [idState]); + const data = useMemo( + () => uniqBy([...dirtyItems, ...orderList], GetItemId), + [dirtyItems, orderList] + ); - const data = useMemo(() => uniqBy([...dirtyItems, ...orderList], GetItemId), [ - dirtyItems, - orderList, - ]); - - const [profiles] = useLanguageProfiles(); + const profiles = useLanguageProfiles(); const options: Partial & TableStyleProps> = { loose: [profiles], @@ -71,7 +69,7 @@ function Table({ diff --git a/frontend/src/generic/ItemOverview.tsx b/frontend/src/generic/ItemOverview.tsx index 845c7f152..17d779c28 100644 --- a/frontend/src/generic/ItemOverview.tsx +++ b/frontend/src/generic/ItemOverview.tsx @@ -22,7 +22,7 @@ import { Popover, Row, } from "react-bootstrap"; -import { useProfileBy, useProfileItems } from "../@redux/hooks"; +import { useProfileBy, useProfileItemsToLanguages } from "../@redux/hooks"; import { LanguageText } from "../components"; import { BuildKey, isMovie } from "../utilites"; @@ -76,7 +76,7 @@ const ItemOverview: FunctionComponent = (props) => { ); const profile = useProfileBy(item.profileId); - const profileItems = useProfileItems(profile); + const profileItems = useProfileItemsToLanguages(profile); const languageBadges = useMemo(() => { const badges: (JSX.Element | null)[] = []; diff --git a/frontend/src/index.tsx b/frontend/src/index.tsx index a15e7c9f1..06abd4e3b 100644 --- a/frontend/src/index.tsx +++ b/frontend/src/index.tsx @@ -1,43 +1,5 @@ -import "@fontsource/roboto/300.css"; -import React, { FunctionComponent, useEffect } from "react"; +import React from "react"; import ReactDOM from "react-dom"; -import { Provider } from "react-redux"; -import { Route, Switch } from "react-router"; -import { BrowserRouter } from "react-router-dom"; -import store from "./@redux/store"; -import "./@scss/index.scss"; -import Socketio from "./@socketio"; import App from "./App"; -import Auth from "./Auth"; -import { useBaseUrl } from "./utilites"; -const MainRouter: FunctionComponent = () => { - const baseUrl = useBaseUrl(); - - useEffect(() => { - Socketio.initialize(); - }, []); - - return ( - - - - - - - - - - - ); -}; - -ReactDOM.render( - - {/* TODO: Enabled Strict Mode after react-bootstrap upgrade to bootstrap 5 */} - {/* */} - - {/* */} - , - document.getElementById("root") -); +ReactDOM.render(, document.getElementById("root")); diff --git a/frontend/src/utilites/async.ts b/frontend/src/utilites/async.ts new file mode 100644 index 000000000..2ec4a080e --- /dev/null +++ b/frontend/src/utilites/async.ts @@ -0,0 +1,95 @@ +import { difference, intersection, isString } from "lodash"; +import { useEffect, useMemo, useState } from "react"; +import { useEffectOnceWhen } from "rooks"; +import { useEntityIdByRange, useEntityToItem } from "./entity"; + +export function useNewEntityIds(entity: Async.Entity) { + return useMemo(() => { + const dirtyEntities = entity.dirtyEntities; + const rawIds = entity.content.ids; + + const ids = rawIds.filter(isString); + + return difference(dirtyEntities, ids); + }, [entity.dirtyEntities, entity.content.ids]); +} + +export function useDirtyEntityIds( + entity: Async.Entity, + start: number, + end: number +) { + const ids = useEntityIdByRange(entity.content, start, end); + + return useMemo(() => { + const dirtyIds = entity.dirtyEntities; + return intersection(ids, dirtyIds); + }, [ids, entity.dirtyEntities]); +} + +export function useEntityItemById( + entity: Async.Entity, + id: string +): Async.Item { + const { content, dirtyEntities, error, state } = entity; + const item = useEntityToItem(content, id); + + const newState = useMemo(() => { + if (state === "dirty") { + if (dirtyEntities.find((v) => v === id)) { + return "dirty"; + } else { + return "succeeded"; + } + } else { + return state; + } + }, [dirtyEntities, id, state]); + + return useMemo( + () => ({ content: item, state: newState, error }), + [error, newState, item] + ); +} + +// export function useListItemById( +// list: Async.List, +// id: string +// ): Async.Item { +// const { content, dirtyEntities, error, state, keyName } = list; +// const item = useMemo( +// () => content.find((v) => String(v[keyName]) === id) ?? null, +// [content, id, keyName] +// ); + +// const newState = useMemo(() => { +// if (state === "loading" || state === "uninitialized") { +// return state; +// } else if (dirtyEntities.find((v) => v === id)) { +// return "dirty"; +// } else { +// return "succeeded"; +// } +// }, [dirtyEntities, error, id, state]); + +// return useMemo( +// () => ({ content: item, state: newState, error }), +// [item, newState, error] +// ); +// } + +export function useOnLoadedOnce(callback: () => void, entity: Async.Base) { + const [didLoaded, setLoaded] = useState(false); + + const { state } = entity; + + const isLoaded = state !== "loading"; + + useEffect(() => { + if (!isLoaded) { + setLoaded(true); + } + }, [isLoaded]); + + useEffectOnceWhen(callback, didLoaded && isLoaded); +} diff --git a/frontend/src/utilites/entity.ts b/frontend/src/utilites/entity.ts new file mode 100644 index 000000000..8326b20ff --- /dev/null +++ b/frontend/src/utilites/entity.ts @@ -0,0 +1,63 @@ +import { isNull, isString } from "lodash"; +import { useMemo } from "react"; + +export function useIsEntityLoaded( + entity: EntityStruct, + start: number, + end: number +): boolean { + return useMemo( + () => entity.ids.slice(start, end).filter(isNull).length === 0, + [entity.ids, start, end] + ); +} + +export function useEntityIdByRange( + entity: EntityStruct, + start: number, + end: number +): string[] { + return useMemo(() => { + const ids = entity.ids; + return ids.slice(start, end).flatMap((v) => { + if (isString(v)) { + return [v]; + } else { + return []; + } + }); + }, [entity.ids, start, end]); +} + +export function useEntityByRange( + entity: EntityStruct, + start: number, + end: number +): T[] { + const filteredIds = useEntityIdByRange(entity, start, end); + const content = useMemo(() => { + const entities = entity.entities; + return filteredIds.map((v) => entities[v]); + }, [entity.entities, filteredIds]); + return content; +} + +export function useEntityToList(entity: EntityStruct): T[] { + return useMemo( + () => entity.ids.filter(isString).map((v) => entity.entities[v]), + [entity] + ); +} + +export function useEntityToItem( + entity: EntityStruct, + id: string +): T | null { + return useMemo(() => { + if (id in entity.entities) { + return entity.entities[id]; + } else { + return null; + } + }, [entity.entities, id]); +} diff --git a/frontend/src/utilites/hooks.ts b/frontend/src/utilites/hooks.ts index ea1303efa..153f235e5 100644 --- a/frontend/src/utilites/hooks.ts +++ b/frontend/src/utilites/hooks.ts @@ -1,6 +1,5 @@ import { useCallback, useMemo } from "react"; import { useHistory } from "react-router"; -import { useDidUpdate } from "rooks"; import { getBaseUrl } from "."; export function useBaseUrl(slash: boolean = false) { @@ -13,7 +12,7 @@ export function useGotoHomepage() { } export function useCanUpdateInject() { - if (process.env.NODE_ENV === "development") { + if (process.env.NODE_ENV !== "production") { return process.env["REACT_APP_CAN_UPDATE"] === "true"; } else { return window.Bazarr.canUpdate; @@ -21,20 +20,9 @@ export function useCanUpdateInject() { } export function useHasUpdateInject() { - if (process.env.NODE_ENV === "development") { + if (process.env.NODE_ENV !== "production") { return process.env["REACT_APP_HAS_UPDATE"] === "true"; } else { return window.Bazarr.hasUpdate; } } - -export function useOnLoadingFinish( - state: Readonly>, - callback: () => void -) { - return useDidUpdate(() => { - if (!state.updating) { - callback(); - } - }, [state.updating]); -} diff --git a/frontend/src/utilites/index.ts b/frontend/src/utilites/index.ts index 1e5376391..3689bdfc1 100644 --- a/frontend/src/utilites/index.ts +++ b/frontend/src/utilites/index.ts @@ -2,34 +2,9 @@ import { difference, differenceWith } from "lodash"; import { Dispatch } from "react"; import { isEpisode, isMovie, isSeries } from "./validate"; -export function updateAsyncState( - promise: Promise, - setter: (state: AsyncState) => void, - defaultVal: T -) { - setter({ - updating: true, - data: defaultVal, - }); - promise - .then((data) => { - setter({ - updating: false, - data: data, - }); - }) - .catch((err) => { - setter({ - updating: false, - error: err, - data: defaultVal, - }); - }); -} - export function getBaseUrl(slash: boolean = false) { let url: string = "/"; - if (process.env.NODE_ENV !== "development") { + if (process.env.NODE_ENV === "production") { url = window.Bazarr.baseUrl; } @@ -77,25 +52,6 @@ export function GetItemId(item: any): number { } } -export function buildOrderList(state: OrderIdState): T[] { - const { order, items } = state; - return buildOrderListFrom(items, order); -} - -export function buildOrderListFrom( - items: IdState, - order: (number | null)[] -): T[] { - return order.flatMap((v) => { - if (v !== null && v in items) { - const item = items[v]; - return [item]; - } - - return []; - }); -} - export function BuildKey(...args: any[]) { return args.join("-"); } @@ -110,7 +66,7 @@ export function ScrollToTop() { export function filterSubtitleBy( subtitles: Subtitle[], - languages: Language[] + languages: Language.Info[] ): Subtitle[] { if (languages.length === 0) { return subtitles.filter((subtitle) => { @@ -126,5 +82,7 @@ export function filterSubtitleBy( } } +export * from "./async"; +export * from "./entity"; export * from "./hooks"; export * from "./validate"; diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 274e1eb7f..e47ff4ac4 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -2,8 +2,8 @@ "compilerOptions": { "target": "es6", "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, + "allowJs": false, + "skipLibCheck": false, "esModuleInterop": true, "allowSyntheticDefaultImports": true, "strict": true, From 56729e0dbb4154bfd72e3af851327eb1e87b2d36 Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Sun, 15 Aug 2021 20:46:56 +0800 Subject: [PATCH 02/67] no log: Move auth page to special-page folder --- frontend/src/App/index.tsx | 2 +- frontend/src/{Auth/style.scss => special-pages/AuthPage.scss} | 0 frontend/src/{Auth/index.tsx => special-pages/AuthPage.tsx} | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename frontend/src/{Auth/style.scss => special-pages/AuthPage.scss} (100%) rename frontend/src/{Auth/index.tsx => special-pages/AuthPage.tsx} (99%) diff --git a/frontend/src/App/index.tsx b/frontend/src/App/index.tsx index 93d0bf9c5..6df87e3d1 100644 --- a/frontend/src/App/index.tsx +++ b/frontend/src/App/index.tsx @@ -15,9 +15,9 @@ import { useNotification } from "../@redux/hooks/site"; import store from "../@redux/store"; import "../@scss/index.scss"; import Socketio from "../@socketio"; -import Auth from "../Auth"; import { LoadingIndicator, ModalProvider } from "../components"; import Sidebar from "../Sidebar"; +import Auth from "../special-pages/AuthPage"; import LaunchError from "../special-pages/LaunchError"; import UIError from "../special-pages/UIError"; import { useBaseUrl, useHasUpdateInject } from "../utilites"; diff --git a/frontend/src/Auth/style.scss b/frontend/src/special-pages/AuthPage.scss similarity index 100% rename from frontend/src/Auth/style.scss rename to frontend/src/special-pages/AuthPage.scss diff --git a/frontend/src/Auth/index.tsx b/frontend/src/special-pages/AuthPage.tsx similarity index 99% rename from frontend/src/Auth/index.tsx rename to frontend/src/special-pages/AuthPage.tsx index 0293b1fa2..5c4c9dc8b 100644 --- a/frontend/src/Auth/index.tsx +++ b/frontend/src/special-pages/AuthPage.tsx @@ -12,7 +12,7 @@ import { Redirect } from "react-router-dom"; import { useReduxStore } from "../@redux/hooks/base"; import logo from "../@static/logo128.png"; import { SystemApi } from "../apis"; -import "./style.scss"; +import "./AuthPage.scss"; interface Props {} From d7533bac5767df6ffa61756ac12887be2a9eeca7 Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Mon, 16 Aug 2021 00:10:38 +0800 Subject: [PATCH 03/67] Add a new notification center to the UI --- bazarr/get_episodes.py | 6 - bazarr/get_movies.py | 8 +- bazarr/get_series.py | 6 - bazarr/get_subtitle.py | 38 ---- bazarr/list_subtitles.py | 12 -- frontend/src/@redux/actions/site.ts | 9 +- frontend/src/@redux/reducers/site.ts | 4 +- frontend/src/@socketio/reducer.ts | 4 +- frontend/src/App/Header.tsx | 6 +- frontend/src/App/Notification.tsx | 225 ++++++++++++++++++++++ frontend/src/App/index.tsx | 2 - frontend/src/App/notification.scss | 43 +++++ frontend/src/App/notifications/index.tsx | 118 ------------ frontend/src/App/notifications/style.scss | 46 ----- frontend/src/utilites/hooks.ts | 15 +- 15 files changed, 295 insertions(+), 247 deletions(-) create mode 100644 frontend/src/App/Notification.tsx create mode 100644 frontend/src/App/notification.scss delete mode 100644 frontend/src/App/notifications/index.tsx delete mode 100644 frontend/src/App/notifications/style.scss diff --git a/bazarr/get_episodes.py b/bazarr/get_episodes.py index f26c2f545..48d570a35 100644 --- a/bazarr/get_episodes.py +++ b/bazarr/get_episodes.py @@ -85,12 +85,6 @@ def sync_episodes(series_id=None, send_event=True): episodes_to_add.append(episodeParser(episode)) if send_event: - show_progress(id='episodes_progress', - header='Syncing episodes...', - name='Completed successfully', - value=series_count, - count=series_count) - hide_progress(id='episodes_progress') # Remove old episodes from DB diff --git a/bazarr/get_movies.py b/bazarr/get_movies.py index 322a948a5..95ff5b60d 100644 --- a/bazarr/get_movies.py +++ b/bazarr/get_movies.py @@ -88,14 +88,8 @@ def update_movies(send_event=True): tags_dict=tagsDict, movie_default_profile=movie_default_profile, audio_profiles=audio_profiles)) - + if send_event: - show_progress(id='movies_progress', - header='Syncing movies...', - name='Completed successfully', - value=movies_count, - count=movies_count) - hide_progress(id='movies_progress') # Remove old movies from DB diff --git a/bazarr/get_series.py b/bazarr/get_series.py index 0f3165dfa..9af7bb49b 100644 --- a/bazarr/get_series.py +++ b/bazarr/get_series.py @@ -72,12 +72,6 @@ def update_series(send_event=True): audio_profiles=audio_profiles)) if send_event: - show_progress(id='series_progress', - header='Syncing series...', - name='Completed successfully', - value=series_count, - count=series_count) - hide_progress(id='series_progress') # Remove old series from DB diff --git a/bazarr/get_subtitle.py b/bazarr/get_subtitle.py index 07363606d..ceac880b6 100644 --- a/bazarr/get_subtitle.py +++ b/bazarr/get_subtitle.py @@ -796,13 +796,6 @@ def series_download_subtitles(no): logging.info("BAZARR All providers are throttled") break - if count_episodes_details: - show_progress(id='series_search_progress_{}'.format(no), - header='Searching missing subtitles...', - name='Completed successfully', - value=count_episodes_details, - count=count_episodes_details) - hide_progress(id='series_search_progress_{}'.format(no)) @@ -975,13 +968,6 @@ def movies_download_subtitles(no): logging.info("BAZARR All providers are throttled") break - if count_movie: - show_progress(id='movie_search_progress_{}'.format(no), - header='Searching missing subtitles...', - name='Completed successfully', - value=count_movie, - count=count_movie) - hide_progress(id='movie_search_progress_{}'.format(no)) @@ -1189,12 +1175,6 @@ def wanted_search_missing_subtitles_series(): logging.info("BAZARR All providers are throttled") return - show_progress(id='wanted_episodes_progress', - header='Searching subtitles...', - name='Completed successfully', - value=count_episodes, - count=count_episodes) - hide_progress(id='wanted_episodes_progress') logging.info('BAZARR Finished searching for missing Series Subtitles. Check History for more information.') @@ -1226,12 +1206,6 @@ def wanted_search_missing_subtitles_movies(): logging.info("BAZARR All providers are throttled") return - show_progress(id='wanted_movies_progress', - header='Searching subtitles...', - name='Completed successfully', - value=count_movies, - count=count_movies) - hide_progress(id='wanted_movies_progress') logging.info('BAZARR Finished searching for missing Movies Subtitles. Check History for more information.') @@ -1559,12 +1533,6 @@ def upgrade_subtitles(): language_code, provider, score, subs_id, subs_path) send_notifications(episode['sonarrSeriesId'], episode['sonarrEpisodeId'], message) - show_progress(id='upgrade_episodes_progress', - header='Upgrading episodes subtitles...', - name='Completed successfully', - value=count_episode_to_upgrade, - count=count_episode_to_upgrade) - hide_progress(id='upgrade_episodes_progress') if settings.general.getboolean('use_radarr'): @@ -1632,12 +1600,6 @@ def upgrade_subtitles(): history_log_movie(3, movie['radarrId'], message, path, language_code, provider, score, subs_id, subs_path) send_notifications_movie(movie['radarrId'], message) - show_progress(id='upgrade_movies_progress', - header='Upgrading movies subtitles...', - name='Completed successfully', - value=count_movie_to_upgrade, - count=count_movie_to_upgrade) - hide_progress(id='upgrade_movies_progress') logging.info('BAZARR Finished searching for Subtitles to upgrade. Check History for more information.') diff --git a/bazarr/list_subtitles.py b/bazarr/list_subtitles.py index 1c09ee56b..7d4c31e81 100644 --- a/bazarr/list_subtitles.py +++ b/bazarr/list_subtitles.py @@ -458,12 +458,6 @@ def series_full_scan_subtitles(): count=count_episodes) store_subtitles(episode['path'], path_mappings.path_replace(episode['path'])) - show_progress(id='episodes_disk_scan', - header='Full disk scan...', - name='Completed successfully', - value=count_episodes, - count=count_episodes) - hide_progress(id='episodes_disk_scan') gc.collect() @@ -482,12 +476,6 @@ def movies_full_scan_subtitles(): count=count_movies) store_subtitles_movie(movie['path'], path_mappings.path_replace_movie(movie['path'])) - show_progress(id='movies_disk_scan', - header='Full disk scan...', - name='Completed successfully', - value=count_movies, - count=count_movies) - hide_progress(id='movies_disk_scan') gc.collect() diff --git a/frontend/src/@redux/actions/site.ts b/frontend/src/@redux/actions/site.ts index 1830db391..8fa4cd077 100644 --- a/frontend/src/@redux/actions/site.ts +++ b/frontend/src/@redux/actions/site.ts @@ -26,11 +26,12 @@ export const siteRemoveNotifications = createAction( "site/notifications/remove" ); -export const siteAddProgress = createAction( - "site/progress/add" -); +export const siteAddProgress = + createAction("site/progress/add"); -export const siteRemoveProgress = createAction("site/progress/remove"); +export const siteRemoveProgress = createAction( + "site/progress/remove" +); export const siteChangeSidebar = createAction("site/sidebar/update"); diff --git a/frontend/src/@redux/reducers/site.ts b/frontend/src/@redux/reducers/site.ts index a5dd99f53..54aedc3d0 100644 --- a/frontend/src/@redux/reducers/site.ts +++ b/frontend/src/@redux/reducers/site.ts @@ -1,5 +1,5 @@ import { createReducer } from "@reduxjs/toolkit"; -import { remove, uniqBy } from "lodash"; +import { pullAllWith, remove, uniqBy } from "lodash"; import apis from "../../apis"; import { siteAddNotifications, @@ -73,7 +73,7 @@ const reducer = createReducer(defaultSite, (builder) => { ); }) .addCase(siteRemoveProgress, (state, action) => { - remove(state.progress, (n) => n.id === action.payload); + pullAllWith(state.progress, action.payload, (l, r) => l.id === r); }) .addCase(siteChangeSidebar, (state, action) => { state.sidebar = action.payload; diff --git a/frontend/src/@socketio/reducer.ts b/frontend/src/@socketio/reducer.ts index a2519166d..8ed251a97 100644 --- a/frontend/src/@socketio/reducer.ts +++ b/frontend/src/@socketio/reducer.ts @@ -87,9 +87,7 @@ export function createDefaultReducer(): SocketIO.Reducer[] { update: bindReduxAction(siteAddProgress), delete: (ids) => { setTimeout(() => { - ids.forEach((id) => { - reduxStore.dispatch(siteRemoveProgress(id)); - }); + reduxStore.dispatch(siteRemoveProgress(ids)); }, 3 * 1000); }, }, diff --git a/frontend/src/App/Header.tsx b/frontend/src/App/Header.tsx index f0b1aacc8..06e50f9b7 100644 --- a/frontend/src/App/Header.tsx +++ b/frontend/src/App/Header.tsx @@ -25,6 +25,7 @@ import { SystemApi } from "../apis"; import { ActionButton, SearchBar, SearchResult } from "../components"; import { useGotoHomepage } from "../utilites"; import "./header.scss"; +import NotificationCenter from "./Notification"; async function SearchItem(text: string) { const results = await SystemApi.search(text); @@ -58,7 +59,7 @@ const Header: FunctionComponent = () => { const offline = useIsOffline(); - const dropdown = useMemo( + const serverActions = useMemo( () => ( @@ -117,6 +118,7 @@ const Header: FunctionComponent = () => { + - + @@ -133,7 +135,7 @@ const Header: FunctionComponent = () => { variant="warning" icon={faNetworkWired} > - Connecting... + {isMobile ? "" : "Connecting..."}
) : ( serverActions diff --git a/frontend/src/App/notification.scss b/frontend/src/App/notification.scss index 6b4b2135a..b0fa85bac 100644 --- a/frontend/src/App/notification.scss +++ b/frontend/src/App/notification.scss @@ -20,12 +20,11 @@ } .dropdown-menu { - max-width: 20rem; max-height: 85vh; overflow-y: auto; } - $content-width: 16rem; + $content-width: 14rem; .notification-center-progress { width: $content-width; diff --git a/frontend/src/utilites/hooks.ts b/frontend/src/utilites/hooks.ts index a9fe57df1..2b09c12f4 100644 --- a/frontend/src/utilites/hooks.ts +++ b/frontend/src/utilites/hooks.ts @@ -1,6 +1,6 @@ import { useCallback, useMemo, useState } from "react"; import { useHistory } from "react-router"; -import { useDidUpdate } from "rooks"; +import { useDidUpdate, useMediaMatch } from "rooks"; import { getBaseUrl } from "."; export function useBaseUrl(slash: boolean = false) { @@ -28,6 +28,10 @@ export function useHasUpdateInject() { } } +export function useIsMobile() { + return useMediaMatch("(max-width: 576px)"); +} + export function useIsArrayExtended(arr: any[]) { const [size, setSize] = useState(arr.length); const [isExtended, setExtended] = useState(arr.length !== 0); From 7fb5da96c0526c71d5fec028e82207291401fbd4 Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Mon, 16 Aug 2021 23:08:21 +0800 Subject: [PATCH 10/67] Fix for #1508 --- .../components/modals/SeriesUploadModal.tsx | 99 ++++++++++--------- 1 file changed, 50 insertions(+), 49 deletions(-) diff --git a/frontend/src/components/modals/SeriesUploadModal.tsx b/frontend/src/components/modals/SeriesUploadModal.tsx index a150a1f48..9a0c2aa4e 100644 --- a/frontend/src/components/modals/SeriesUploadModal.tsx +++ b/frontend/src/components/modals/SeriesUploadModal.tsx @@ -37,7 +37,7 @@ enum State { } interface PendingSubtitle { - form: FormType.UploadSubtitle; + file: File; didCheck: boolean; instance?: Item.Episode; } @@ -75,9 +75,17 @@ const SeriesUploadModal: FunctionComponent = ({ const profile = useProfileBy(series?.profileId); - const languages = useProfileItemsToLanguages(profile); + const avaliableLanguages = useProfileItemsToLanguages(profile); - const filelist = useMemo(() => pending.map((v) => v.form.file), [pending]); + const [language, setLanguage] = useState(null); + + useEffect(() => { + if (avaliableLanguages.length > 0) { + setLanguage(avaliableLanguages[0]); + } + }, [avaliableLanguages]); + + const filelist = useMemo(() => pending.map((v) => v.file), [pending]); // Vaildate useEffect(() => { @@ -87,7 +95,7 @@ const SeriesUploadModal: FunctionComponent = ({ infos: [], }; - const { form, instance } = info; + const { file, instance } = info; if (!info.didCheck) { subState.state = State.Update; @@ -96,7 +104,7 @@ const SeriesUploadModal: FunctionComponent = ({ subState.state = State.Error; } else { if ( - instance.subtitles.find((v) => v.code2 === form.language) !== + instance.subtitles.find((v) => v.code2 === language?.code2) !== undefined ) { subState.infos.push("Overwrite existing subtitle"); @@ -104,16 +112,16 @@ const SeriesUploadModal: FunctionComponent = ({ } } - prev[form.file.name] = subState; + prev[file.name] = subState; return prev; }, {}); setProcessState(states); - }, [pending]); + }, [pending, language?.code2]); const checkEpisodes = useCallback( async (list: PendingSubtitle[]) => { - const names = list.map((v) => v.form.file.name); + const names = list.map((v) => v.file.name); if (names.length > 0) { const results = await SubtitlesApi.info(names); @@ -132,7 +140,7 @@ const SeriesUploadModal: FunctionComponent = ({ pd.map((v) => ({ ...v, didCheck: true, - instance: episodeMap[v.form.file.name], + instance: episodeMap[v.file.name], })) ); } @@ -140,33 +148,12 @@ const SeriesUploadModal: FunctionComponent = ({ [episodes] ); - const updateLanguage = useCallback((lang: Nullable) => { - if (lang) { - const { code2, hi, forced } = lang; - setPending((pending) => { - return pending.map((v) => { - const newValue = { ...v }; - newValue.form.language = code2; - newValue.form.hi = hi ?? false; - newValue.form.forced = forced ?? false; - return newValue; - }); - }); - } - }, []); - const setFiles = useCallback( (files: File[]) => { // At lease 1 language is required - const lang = languages[0]; const list: PendingSubtitle[] = files.map((f) => { return { - form: { - file: f, - language: lang.code2, - hi: lang.hi ?? false, - forced: lang.forced ?? false, - }, + file: f, didCheck: false, }; }); @@ -182,7 +169,7 @@ const SeriesUploadModal: FunctionComponent = ({ setProcessState(states); checkEpisodes(list); }, - [languages, checkEpisodes] + [checkEpisodes] ); const uploadSubtitles = useCallback(async () => { @@ -193,7 +180,7 @@ const SeriesUploadModal: FunctionComponent = ({ const { sonarrSeriesId: seriesid } = series; let uploadStates = pending.reduce((prev, curr) => { - prev[curr.form.file.name] = { state: State.Update, infos: [] }; + prev[curr.file.name] = { state: State.Update, infos: [] }; return prev; }, {}); @@ -202,20 +189,29 @@ const SeriesUploadModal: FunctionComponent = ({ let exception = false; for (const info of pending) { - if (info.instance) { + if (info.instance && language) { const { sonarrEpisodeId: episodeid } = info.instance; + const { file } = info; + const { code2, hi, forced } = language; try { - await EpisodesApi.uploadSubtitles(seriesid, episodeid, info.form); + const form: FormType.UploadSubtitle = { + file, + language: code2, + hi: hi ?? false, + forced: forced ?? false, + }; + + await EpisodesApi.uploadSubtitles(seriesid, episodeid, form); uploadStates = { ...uploadStates, - [info.form.file.name]: { state: State.Valid, infos: [] }, + [info.file.name]: { state: State.Valid, infos: [] }, }; } catch (error) { uploadStates = { ...uploadStates, - [info.form.file.name]: { state: State.Error, infos: [] }, + [info.file.name]: { state: State.Error, infos: [] }, }; exception = true; } @@ -227,11 +223,14 @@ const SeriesUploadModal: FunctionComponent = ({ if (exception) { throw new Error("Error when uploading subtitles"); } - }, [series, pending]); + }, [series, pending, language]); const canUpload = useMemo( - () => pending.length > 0 && pending.every((v) => v.instance !== undefined), - [pending] + () => + pending.length > 0 && + pending.every((v) => v.instance !== undefined) && + language, + [pending, language] ); const tableShow = pending.length > 0; @@ -243,9 +242,7 @@ const SeriesUploadModal: FunctionComponent = ({ accessor: "instance", className: "text-center", Cell: ({ row, loose }) => { - const { - form: { file }, - } = row.original; + const { file } = row.original; const name = file.name; const states = loose![1] as ProcessState; @@ -291,7 +288,7 @@ const SeriesUploadModal: FunctionComponent = ({ }, { Header: "File", - accessor: (d) => d.form.file.name, + accessor: (d) => d.file.name, }, { Header: "Episode", @@ -330,7 +327,7 @@ const SeriesUploadModal: FunctionComponent = ({ }, }, { - accessor: "form", + accessor: "file", Cell: ({ row, externalUpdate, loose }) => { const [uploading] = loose!; return ( @@ -371,9 +368,13 @@ const SeriesUploadModal: FunctionComponent = ({
0 ? languages[0] : undefined} - onChange={updateLanguage} + options={avaliableLanguages} + value={language} + onChange={(l) => { + if (l) { + setLanguage(l); + } + }} >
@@ -414,7 +415,7 @@ const SeriesUploadModal: FunctionComponent = ({ Date: Tue, 17 Aug 2021 00:46:10 +0800 Subject: [PATCH 11/67] Add a error page when ui is crashed --- frontend/src/App/index.tsx | 12 ++++---- frontend/src/Movies/Detail/table.tsx | 2 +- .../components/modals/SeriesUploadModal.tsx | 4 +-- frontend/src/special-pages/ErrorBoundary.tsx | 29 +++++++++++++++++++ frontend/src/special-pages/UIError.tsx | 6 ++-- 5 files changed, 40 insertions(+), 13 deletions(-) create mode 100644 frontend/src/special-pages/ErrorBoundary.tsx diff --git a/frontend/src/App/index.tsx b/frontend/src/App/index.tsx index 52150109e..97c5e054c 100644 --- a/frontend/src/App/index.tsx +++ b/frontend/src/App/index.tsx @@ -18,8 +18,8 @@ import Socketio from "../@socketio"; import { LoadingIndicator, ModalProvider } from "../components"; import Sidebar from "../Sidebar"; import Auth from "../special-pages/AuthPage"; +import ErrorBoundary from "../special-pages/ErrorBoundary"; import LaunchError from "../special-pages/LaunchError"; -import UIError from "../special-pages/UIError"; import { useBaseUrl, useHasUpdateInject } from "../utilites"; import Header from "./Header"; import Router from "./Router"; @@ -62,8 +62,8 @@ const App: FunctionComponent = () => { } else if (typeof initialized === "string") { return {initialized}; } - try { - return ( + return ( +
@@ -75,10 +75,8 @@ const App: FunctionComponent = () => {
- ); - } catch (e) { - return ; - } +
+ ); }; const MainRouter: FunctionComponent = () => { diff --git a/frontend/src/Movies/Detail/table.tsx b/frontend/src/Movies/Detail/table.tsx index 621bfa231..021b1659e 100644 --- a/frontend/src/Movies/Detail/table.tsx +++ b/frontend/src/Movies/Detail/table.tsx @@ -104,7 +104,7 @@ const Table: FunctionComponent = ({ movie, profile }) => { const data: Subtitle[] = useMemo(() => { const missing = movie.missing_subtitles.map((item) => ({ ...item, - path: missingText + path: missingText, })); let raw_subtitles = movie.subtitles; diff --git a/frontend/src/components/modals/SeriesUploadModal.tsx b/frontend/src/components/modals/SeriesUploadModal.tsx index 9a0c2aa4e..0d04a8d6b 100644 --- a/frontend/src/components/modals/SeriesUploadModal.tsx +++ b/frontend/src/components/modals/SeriesUploadModal.tsx @@ -173,7 +173,7 @@ const SeriesUploadModal: FunctionComponent = ({ ); const uploadSubtitles = useCallback(async () => { - if (series === null) { + if (series === null || language === null) { return; } @@ -189,7 +189,7 @@ const SeriesUploadModal: FunctionComponent = ({ let exception = false; for (const info of pending) { - if (info.instance && language) { + if (info.instance) { const { sonarrEpisodeId: episodeid } = info.instance; const { file } = info; const { code2, hi, forced } = language; diff --git a/frontend/src/special-pages/ErrorBoundary.tsx b/frontend/src/special-pages/ErrorBoundary.tsx new file mode 100644 index 000000000..f777c5018 --- /dev/null +++ b/frontend/src/special-pages/ErrorBoundary.tsx @@ -0,0 +1,29 @@ +import React from "react"; +import UIError from "./UIError"; + +interface State { + error: Error | null; +} + +class ErrorBoundary extends React.Component<{}, State> { + constructor(props: {}) { + super(props); + this.state = { error: null }; + } + + componentDidCatch(error: Error) { + this.setState({ error }); + } + + render() { + const { children } = this.props; + const { error } = this.state; + if (error) { + return ; + } + + return children; + } +} + +export default ErrorBoundary; diff --git a/frontend/src/special-pages/UIError.tsx b/frontend/src/special-pages/UIError.tsx index 62558e84b..bb6f95b8a 100644 --- a/frontend/src/special-pages/UIError.tsx +++ b/frontend/src/special-pages/UIError.tsx @@ -1,4 +1,4 @@ -import { faSadCry as fasSadCry } from "@fortawesome/free-regular-svg-icons"; +import { faDizzy } from "@fortawesome/free-regular-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import React, { FunctionComponent } from "react"; import { Button, Container } from "react-bootstrap"; @@ -12,8 +12,8 @@ interface Props { const UIError: FunctionComponent = ({ error }) => (

- - Ouch! UI is crashed! + + Oops! UI is crashed!

{error.message}

From 82a687c8c8f68dea27181bc5edb1359c455d656d Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Tue, 17 Aug 2021 01:34:26 +0800 Subject: [PATCH 12/67] Rewrite modal system using stack, fix some visual bugs --- .../src/Settings/Notifications/components.tsx | 4 +- .../src/Settings/Providers/components.tsx | 4 +- frontend/src/components/modals/BaseModal.tsx | 29 ++-- .../src/components/modals/HistoryModal.tsx | 2 +- .../src/components/modals/ItemEditorModal.tsx | 2 +- .../components/modals/SubtitleToolModal.tsx | 8 +- frontend/src/components/modals/hooks.tsx | 76 +++++++++++ frontend/src/components/modals/index.ts | 3 +- frontend/src/components/modals/provider.tsx | 128 ++++++------------ 9 files changed, 144 insertions(+), 112 deletions(-) create mode 100644 frontend/src/components/modals/hooks.tsx diff --git a/frontend/src/Settings/Notifications/components.tsx b/frontend/src/Settings/Notifications/components.tsx index 81a8a578c..f16e0bf70 100644 --- a/frontend/src/Settings/Notifications/components.tsx +++ b/frontend/src/Settings/Notifications/components.tsx @@ -50,9 +50,7 @@ const NotificationModal: FunctionComponent = ({ payload ?? null ); - const onShow = useCallback(() => setCurrent(payload ?? null), [payload]); - - useOnModalShow(modal.modalKey, onShow); + useOnModalShow(() => setCurrent(payload ?? null), modal.modalKey); const updateUrl = useCallback( (s: string) => { diff --git a/frontend/src/Settings/Providers/components.tsx b/frontend/src/Settings/Providers/components.tsx index d740ec50a..3522ccab6 100644 --- a/frontend/src/Settings/Providers/components.tsx +++ b/frontend/src/Settings/Providers/components.tsx @@ -84,9 +84,7 @@ export const ProviderModal: FunctionComponent = () => { const [info, setInfo] = useState>(payload ?? null); - const onShow = useCallback(() => setInfo(payload ?? null), [payload]); - - useOnModalShow(ModalKey, onShow); + useOnModalShow(() => setInfo(payload ?? null), ModalKey); const providers = useLatest(ProviderKey, isArray); diff --git a/frontend/src/components/modals/BaseModal.tsx b/frontend/src/components/modals/BaseModal.tsx index ccb79f398..8a717699b 100644 --- a/frontend/src/components/modals/BaseModal.tsx +++ b/frontend/src/components/modals/BaseModal.tsx @@ -1,7 +1,7 @@ -import React, { FunctionComponent } from "react"; +import React, { FunctionComponent, useCallback, useState } from "react"; import { Modal } from "react-bootstrap"; import { useIsModalShow } from "."; -import { useCloseModal } from "./provider"; +import { useCloseModal } from "./hooks"; export interface BaseModalProps { modalKey: string; @@ -12,22 +12,33 @@ export interface BaseModalProps { } export const BaseModal: FunctionComponent = (props) => { - const { size, closeable, modalKey, title, children, footer } = props; + const { size, modalKey, title, children, footer } = props; + const [needExit, setExit] = useState(false); const show = useIsModalShow(modalKey); - const closeModal = useCloseModal(); + const close = useCloseModal(); - const canClose = closeable !== false; + const closeable = props.closeable !== false; + + const hide = useCallback(() => { + setExit(true); + }, []); + + const exit = useCallback(() => { + close(); + setExit(false); + }, [close]); return ( - {title} + {title} {children} diff --git a/frontend/src/components/modals/HistoryModal.tsx b/frontend/src/components/modals/HistoryModal.tsx index e842b5b8d..6172d7db7 100644 --- a/frontend/src/components/modals/HistoryModal.tsx +++ b/frontend/src/components/modals/HistoryModal.tsx @@ -6,7 +6,7 @@ import { EpisodesApi, MoviesApi, useAsyncRequest } from "../../apis"; import { BlacklistButton } from "../../generic/blacklist"; import { AsyncOverlay } from "../async"; import BaseModal, { BaseModalProps } from "./BaseModal"; -import { usePayload } from "./provider"; +import { usePayload } from "./hooks"; export const MovieHistoryModal: FunctionComponent = (props) => { const { ...modal } = props; diff --git a/frontend/src/components/modals/ItemEditorModal.tsx b/frontend/src/components/modals/ItemEditorModal.tsx index b1a73a4b9..04f5021dd 100644 --- a/frontend/src/components/modals/ItemEditorModal.tsx +++ b/frontend/src/components/modals/ItemEditorModal.tsx @@ -4,7 +4,7 @@ import { AsyncButton, Selector } from "../"; import { useLanguageProfiles } from "../../@redux/hooks"; import { GetItemId } from "../../utilites"; import BaseModal, { BaseModalProps } from "./BaseModal"; -import { useCloseModal, usePayload } from "./provider"; +import { useCloseModal, usePayload } from "./hooks"; interface Props { submit: (form: FormType.ModifyItem) => Promise; diff --git a/frontend/src/components/modals/SubtitleToolModal.tsx b/frontend/src/components/modals/SubtitleToolModal.tsx index a3d6b68c3..4b8dd9538 100644 --- a/frontend/src/components/modals/SubtitleToolModal.tsx +++ b/frontend/src/components/modals/SubtitleToolModal.tsx @@ -48,7 +48,7 @@ import { isMovie, submodProcessColor } from "../../utilites"; import { log } from "../../utilites/logger"; import { useCustomSelection } from "../tables/plugins"; import BaseModal, { BaseModalProps } from "./BaseModal"; -import { useCloseModalUntil } from "./provider"; +import { useCloseModalUntil } from "./hooks"; import { availableTranslation, colorOptions } from "./toolOptions"; type SupportType = Item.Episode | Item.Movie; @@ -337,12 +337,12 @@ const STM: FunctionComponent = ({ ...props }) => { const [processState, setProcessState] = useState({}); const [selections, setSelections] = useState([]); - const closeUntil = useCloseModalUntil(props.modalKey); + const closeUntil = useCloseModalUntil(); const process = useCallback( async (action: string, override?: Partial) => { log("info", "executing action", action); - closeUntil(); + closeUntil(props.modalKey); setUpdate(true); let states = selections.reduce( @@ -374,7 +374,7 @@ const STM: FunctionComponent = ({ ...props }) => { } setUpdate(false); }, - [closeUntil, selections] + [closeUntil, selections, props.modalKey] ); const showModal = useShowModal(); diff --git a/frontend/src/components/modals/hooks.tsx b/frontend/src/components/modals/hooks.tsx new file mode 100644 index 000000000..6208599bc --- /dev/null +++ b/frontend/src/components/modals/hooks.tsx @@ -0,0 +1,76 @@ +import { useCallback, useContext, useMemo } from "react"; +import { useDidUpdate } from "rooks"; +import { log } from "../../utilites/logger"; +import { ModalContext } from "./provider"; + +export function useShowModal() { + const { + control: { push }, + } = useContext(ModalContext); + + return useCallback( + (key: string, payload?: T) => { + log("info", `modal ${key} sending payload`, payload); + + push({ key, payload }); + }, + [push] + ); +} + +export function useCloseModal() { + const { + control: { pop }, + } = useContext(ModalContext); + return pop; +} + +export function useCloseModalUntil() { + const { + control: { pop, peek }, + } = useContext(ModalContext); + return useCallback( + (key: string) => { + let modal = peek(); + while (modal) { + if (modal.key === key) { + break; + } else { + modal = pop(); + } + } + }, + [pop, peek] + ); +} + +export function useIsModalShow(key: string) { + const { + control: { peek }, + } = useContext(ModalContext); + const modal = peek(); + return key === modal?.key; +} + +export function useOnModalShow(callback: () => void, key: string) { + const isShow = useIsModalShow(key); + useDidUpdate(() => { + if (isShow) { + callback(); + } + }, [isShow]); +} + +export function usePayload(key: string): T | null { + const { + control: { peek }, + } = useContext(ModalContext); + return useMemo(() => { + const modal = peek(); + if (modal && modal.key === key) { + return modal.payload as T; + } else { + return null; + } + }, [key, peek]); +} diff --git a/frontend/src/components/modals/index.ts b/frontend/src/components/modals/index.ts index 4b0a26888..3662bfe5a 100644 --- a/frontend/src/components/modals/index.ts +++ b/frontend/src/components/modals/index.ts @@ -1,7 +1,8 @@ export * from "./BaseModal"; export * from "./HistoryModal"; +export * from "./hooks"; export { default as ItemEditorModal } from "./ItemEditorModal"; export { default as MovieUploadModal } from "./MovieUploadModal"; -export * from "./provider"; +export { default as ModalProvider } from "./provider"; export { default as SeriesUploadModal } from "./SeriesUploadModal"; export { default as SubtitleToolModal } from "./SubtitleToolModal"; diff --git a/frontend/src/components/modals/provider.tsx b/frontend/src/components/modals/provider.tsx index 95ed0c6ff..2481b62bb 100644 --- a/frontend/src/components/modals/provider.tsx +++ b/frontend/src/components/modals/provider.tsx @@ -1,100 +1,48 @@ -import React, { - Dispatch, - FunctionComponent, - useCallback, - useContext, - useEffect, - useMemo, - useState, -} from "react"; -import { log } from "../../utilites/logger"; +import React, { FunctionComponent, useMemo } from "react"; +import { useStackState } from "rooks"; -const ModalContext = React.createContext<[string[], Dispatch]>([ - [], - (s) => {}, -]); +interface Modal { + key: string; + payload: any; +} -const PayloadContext = React.createContext<[any[], Dispatch]>([ - [], - (p) => {}, -]); +interface ModalControl { + push: (modal: Modal) => void; + peek: () => Modal | undefined; + pop: () => Modal | undefined; +} -// TODO: Performance -export function useShowModal() { - const [keys, setKeys] = useContext(ModalContext); - const [payloads, setPayloads] = useContext(PayloadContext); - return useCallback( - (key: string, payload?: T) => { - log("info", `modal ${key} sending payload`, payload); +interface ModalContextType { + modals: Modal[]; + control: ModalControl; +} - setKeys([...keys, key]); - setPayloads([...payloads, payload ?? null]); +export const ModalContext = React.createContext({ + modals: [], + control: { + push: () => { + throw new Error("Unimplemented"); }, - [keys, payloads, setKeys, setPayloads] + pop: () => { + throw new Error("Unimplemented"); + }, + peek: () => { + throw new Error("Unimplemented"); + }, + }, +}); + +const ModalProvider: FunctionComponent = ({ children }) => { + const [stack, { push, pop, peek }] = useStackState([]); + + const context = useMemo( + () => ({ modals: stack, control: { push, pop, peek } }), + [stack, push, pop, peek] ); -} - -export function useCloseModal() { - const [keys, setKeys] = useContext(ModalContext); - const [payloads, setPayloads] = useContext(PayloadContext); - return useCallback(() => { - const newKey = [...keys]; - newKey.pop(); - const newPayload = [...payloads]; - newPayload.pop(); - setKeys(newKey); - setPayloads(newPayload); - }, [keys, payloads, setKeys, setPayloads]); -} - -export function useCloseModalUntil(key: string) { - const [keys, setKeys] = useContext(ModalContext); - const [payloads, setPayloads] = useContext(PayloadContext); - return useCallback(() => { - const idx = keys.findIndex((v) => v === key); - if (idx !== -1) { - const newKey = keys.slice(0, idx + 1); - const newPayload = payloads.slice(0, idx + 1); - setKeys(newKey); - setPayloads(newPayload); - } else { - log("error", "Cannot close modal, key is unavailable"); - } - }, [keys, payloads, setKeys, setPayloads, key]); -} - -export function useIsModalShow(key: string) { - const keys = useContext(ModalContext)[0]; - return key === keys[keys.length - 1]; -} - -export function useOnModalShow(key: string, show: () => void) { - const isShow = useIsModalShow(key); - useEffect(() => { - if (isShow) { - show(); - } - }, [isShow, show]); -} - -export function usePayload(key: string): T | null { - const payloads = useContext(PayloadContext)[0]; - const keys = useContext(ModalContext)[0]; - return useMemo(() => { - const idx = keys.findIndex((v) => v === key); - return idx !== -1 ? payloads[idx] : null; - }, [keys, payloads, key]); -} - -export const ModalProvider: FunctionComponent = ({ children }) => { - const [key, setKey] = useState([]); - const [payload, setPayload] = useState([]); return ( - - - {children} - - + {children} ); }; + +export default ModalProvider; From c5fdea4a76593f66706eb145b06fb4f4d91fc607 Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Tue, 17 Aug 2021 02:28:18 +0800 Subject: [PATCH 13/67] no log: Fix issues on new modal system --- frontend/src/@redux/hooks/series.ts | 1 - frontend/src/Settings/Languages/modal.tsx | 8 +- .../src/Settings/Notifications/components.tsx | 39 +++++----- .../src/Settings/Providers/components.tsx | 11 +-- frontend/src/System/Logs/modal.tsx | 4 +- frontend/src/components/modals/BaseModal.tsx | 12 ++- .../src/components/modals/HistoryModal.tsx | 6 +- .../src/components/modals/ItemEditorModal.tsx | 24 +++--- .../components/modals/ManualSearchModal.tsx | 4 +- .../components/modals/MovieUploadModal.tsx | 25 +++--- .../components/modals/SeriesUploadModal.tsx | 17 ++--- .../components/modals/SubtitleToolModal.tsx | 16 ++-- frontend/src/components/modals/hooks.tsx | 76 +++++++++++++++---- 13 files changed, 138 insertions(+), 105 deletions(-) diff --git a/frontend/src/@redux/hooks/series.ts b/frontend/src/@redux/hooks/series.ts index 77bfb74f5..0de8df2cc 100644 --- a/frontend/src/@redux/hooks/series.ts +++ b/frontend/src/@redux/hooks/series.ts @@ -37,7 +37,6 @@ export function useSerieBy(id: number) { const serie = useEntityItemById(series, String(id)); const update = useCallback(() => { - console.log("try loading", id); if (!isNaN(id)) { action([id]); } diff --git a/frontend/src/Settings/Languages/modal.tsx b/frontend/src/Settings/Languages/modal.tsx index 4fe24a813..d5aaf1f34 100644 --- a/frontend/src/Settings/Languages/modal.tsx +++ b/frontend/src/Settings/Languages/modal.tsx @@ -16,8 +16,7 @@ import { LanguageSelector, Selector, SimpleTable, - useCloseModal, - usePayload, + useModalInformation, } from "../../components"; import { BuildKey } from "../../utilites"; import { Input, Message } from "../components"; @@ -40,9 +39,8 @@ const LanguagesProfileModal: FunctionComponent = ( ) => { const { update, ...modal } = props; - const profile = usePayload(modal.modalKey); - - const closeModal = useCloseModal(); + const { payload: profile, closeModal } = + useModalInformation(modal.modalKey); const languages = useEnabledLanguagesContext(); diff --git a/frontend/src/Settings/Notifications/components.tsx b/frontend/src/Settings/Notifications/components.tsx index f16e0bf70..c8db22159 100644 --- a/frontend/src/Settings/Notifications/components.tsx +++ b/frontend/src/Settings/Notifications/components.tsx @@ -11,9 +11,8 @@ import { BaseModal, BaseModalProps, Selector, - useCloseModal, + useModalInformation, useOnModalShow, - usePayload, useShowModal, } from "../../components"; import { BuildKey } from "../../utilites"; @@ -44,26 +43,29 @@ const NotificationModal: FunctionComponent = ({ "name" ); - const payload = usePayload(modal.modalKey); + const { payload, closeModal } = + useModalInformation(modal.modalKey); - const [current, setCurrent] = useState>( - payload ?? null + const [current, setCurrent] = + useState>(payload); + + useOnModalShow( + (p) => setCurrent(p), + modal.modalKey ); - useOnModalShow(() => setCurrent(payload ?? null), modal.modalKey); - - const updateUrl = useCallback( - (s: string) => { + const updateUrl = useCallback((url: string) => { + setCurrent((current) => { if (current) { - const newCurrent = { ...current }; - newCurrent.url = s; - setCurrent(newCurrent); + return { + ...current, + url, + }; + } else { + return current; } - }, - [current] - ); - - const closeModal = useCloseModal(); + }); + }, []); const canSave = current !== null && current?.url !== null && current?.url.length !== 0; @@ -102,8 +104,7 @@ const NotificationModal: FunctionComponent = ({ disabled={!canSave} onClick={() => { if (current) { - current.enabled = true; - update(current); + update({ ...current, enabled: true }); } closeModal(); }} diff --git a/frontend/src/Settings/Providers/components.tsx b/frontend/src/Settings/Providers/components.tsx index 3522ccab6..9d08aa6f3 100644 --- a/frontend/src/Settings/Providers/components.tsx +++ b/frontend/src/Settings/Providers/components.tsx @@ -11,9 +11,8 @@ import { SelectComponents } from "react-select/src/components"; import { BaseModal, Selector, - useCloseModal, + useModalInformation, useOnModalShow, - usePayload, useShowModal, } from "../../components"; import { BuildKey, isReactText } from "../../utilites"; @@ -78,18 +77,16 @@ export const ProviderView: FunctionComponent = () => { }; export const ProviderModal: FunctionComponent = () => { - const payload = usePayload(ModalKey); + const { payload, closeModal } = useModalInformation(ModalKey); const [staged, setChange] = useState({}); - const [info, setInfo] = useState>(payload ?? null); + const [info, setInfo] = useState>(payload); - useOnModalShow(() => setInfo(payload ?? null), ModalKey); + useOnModalShow((p) => setInfo(p), ModalKey); const providers = useLatest(ProviderKey, isArray); - const closeModal = useCloseModal(); - const updateGlobal = useMultiUpdate(); const deletePayload = useCallback(() => { diff --git a/frontend/src/System/Logs/modal.tsx b/frontend/src/System/Logs/modal.tsx index 86c479778..cce24cb46 100644 --- a/frontend/src/System/Logs/modal.tsx +++ b/frontend/src/System/Logs/modal.tsx @@ -1,10 +1,10 @@ import React, { FunctionComponent, useMemo } from "react"; -import { BaseModal, BaseModalProps, usePayload } from "../../components"; +import { BaseModal, BaseModalProps, useModalPayload } from "../../components"; interface Props extends BaseModalProps {} const SystemLogModal: FunctionComponent = ({ ...modal }) => { - const stack = usePayload(modal.modalKey); + const stack = useModalPayload(modal.modalKey); const result = useMemo( () => stack?.split("\\n").map((v, idx) => ( diff --git a/frontend/src/components/modals/BaseModal.tsx b/frontend/src/components/modals/BaseModal.tsx index 8a717699b..c80681ba2 100644 --- a/frontend/src/components/modals/BaseModal.tsx +++ b/frontend/src/components/modals/BaseModal.tsx @@ -1,7 +1,6 @@ import React, { FunctionComponent, useCallback, useState } from "react"; import { Modal } from "react-bootstrap"; -import { useIsModalShow } from "."; -import { useCloseModal } from "./hooks"; +import { useModalInformation } from "./hooks"; export interface BaseModalProps { modalKey: string; @@ -15,8 +14,7 @@ export const BaseModal: FunctionComponent = (props) => { const { size, modalKey, title, children, footer } = props; const [needExit, setExit] = useState(false); - const show = useIsModalShow(modalKey); - const close = useCloseModal(); + const { isShow, closeModal } = useModalInformation(modalKey); const closeable = props.closeable !== false; @@ -25,15 +23,15 @@ export const BaseModal: FunctionComponent = (props) => { }, []); const exit = useCallback(() => { - close(); + closeModal(modalKey); setExit(false); - }, [close]); + }, [closeModal, modalKey]); return ( = (props) => { const { ...modal } = props; - const movie = usePayload(modal.modalKey); + const movie = useModalPayload(modal.modalKey); const [history, updateHistory] = useAsyncRequest( MoviesApi.history.bind(MoviesApi), @@ -111,7 +111,7 @@ interface EpisodeHistoryProps {} export const EpisodeHistoryModal: FunctionComponent< BaseModalProps & EpisodeHistoryProps > = (props) => { - const episode = usePayload(props.modalKey); + const episode = useModalPayload(props.modalKey); const [history, updateHistory] = useAsyncRequest( EpisodesApi.history.bind(EpisodesApi), diff --git a/frontend/src/components/modals/ItemEditorModal.tsx b/frontend/src/components/modals/ItemEditorModal.tsx index 04f5021dd..c32c5e247 100644 --- a/frontend/src/components/modals/ItemEditorModal.tsx +++ b/frontend/src/components/modals/ItemEditorModal.tsx @@ -4,7 +4,7 @@ import { AsyncButton, Selector } from "../"; import { useLanguageProfiles } from "../../@redux/hooks"; import { GetItemId } from "../../utilites"; import BaseModal, { BaseModalProps } from "./BaseModal"; -import { useCloseModal, usePayload } from "./hooks"; +import { useModalInformation } from "./hooks"; interface Props { submit: (form: FormType.ModifyItem) => Promise; @@ -16,9 +16,9 @@ const Editor: FunctionComponent = (props) => { const profiles = useLanguageProfiles(); - const item = usePayload(modal.modalKey); - - const closeModal = useCloseModal(); + const { payload, closeModal } = useModalInformation( + modal.modalKey + ); const profileOptions = useMemo[]>( () => @@ -37,8 +37,8 @@ const Editor: FunctionComponent = (props) => { noReset onChange={setUpdating} promise={() => { - if (item) { - const itemId = GetItemId(item); + if (payload) { + const itemId = GetItemId(payload); return submit({ id: [itemId], profileid: [id], @@ -49,20 +49,20 @@ const Editor: FunctionComponent = (props) => { }} onSuccess={() => { closeModal(); - onSuccess && item && onSuccess(item); + onSuccess && payload && onSuccess(payload); }} > Save ), - [closeModal, id, item, onSuccess, submit] + [closeModal, id, payload, onSuccess, submit] ); return ( @@ -72,7 +72,9 @@ const Editor: FunctionComponent = (props) => { v.name).join(", ")} + defaultValue={payload?.audio_language + .map((v) => v.name) + .join(", ")} > @@ -80,7 +82,7 @@ const Editor: FunctionComponent = (props) => { setId(v === undefined ? null : v)} > diff --git a/frontend/src/components/modals/ManualSearchModal.tsx b/frontend/src/components/modals/ManualSearchModal.tsx index 31e116fd9..3c173a476 100644 --- a/frontend/src/components/modals/ManualSearchModal.tsx +++ b/frontend/src/components/modals/ManualSearchModal.tsx @@ -31,7 +31,7 @@ import { LanguageText, LoadingIndicator, PageTable, - usePayload, + useModalPayload, } from ".."; import { ProvidersApi } from "../../apis"; import { isMovie } from "../../utilites"; @@ -58,7 +58,7 @@ export const ManualSearchModal: FunctionComponent = ( const [result, setResult] = useState([]); const [searchState, setSearchState] = useState(SearchState.Ready); - const item = usePayload(modal.modalKey); + const item = useModalPayload(modal.modalKey); const search = useCallback(async () => { if (item) { diff --git a/frontend/src/components/modals/MovieUploadModal.tsx b/frontend/src/components/modals/MovieUploadModal.tsx index c247db567..1369c13c4 100644 --- a/frontend/src/components/modals/MovieUploadModal.tsx +++ b/frontend/src/components/modals/MovieUploadModal.tsx @@ -1,12 +1,6 @@ import React, { FunctionComponent, useEffect, useMemo, useState } from "react"; import { Container, Form } from "react-bootstrap"; -import { - AsyncButton, - FileForm, - LanguageSelector, - useCloseModal, - usePayload, -} from ".."; +import { AsyncButton, FileForm, LanguageSelector } from ".."; import { useEnabledLanguages, useLanguageBy, @@ -14,6 +8,7 @@ import { } from "../../@redux/hooks"; import { MoviesApi } from "../../apis"; import BaseModal, { BaseModalProps } from "./BaseModal"; +import { useModalInformation } from "./hooks"; interface MovieProps {} const MovieUploadModal: FunctionComponent = ( @@ -23,15 +18,15 @@ const MovieUploadModal: FunctionComponent = ( const availableLanguages = useEnabledLanguages(); - const movie = usePayload(modal.modalKey); - - const closeModal = useCloseModal(); + const { payload, closeModal } = useModalInformation( + modal.modalKey + ); const [uploading, setUpload] = useState(false); const [language, setLanguage] = useState>(null); - const profile = useProfileBy(movie?.profileId); + const profile = useProfileBy(payload?.profileId); const defaultLanguage = useLanguageBy(profile?.items[0]?.language); @@ -50,8 +45,8 @@ const MovieUploadModal: FunctionComponent = ( disabled={!canUpload} onChange={setUpload} promise={() => { - if (file && movie && language) { - return MoviesApi.uploadSubtitles(movie.radarrId, { + if (file && payload && language) { + return MoviesApi.uploadSubtitles(payload.radarrId, { file: file, forced, hi: false, @@ -61,7 +56,7 @@ const MovieUploadModal: FunctionComponent = ( return null; } }} - onSuccess={closeModal} + onSuccess={() => closeModal()} > Upload @@ -69,7 +64,7 @@ const MovieUploadModal: FunctionComponent = ( return ( = ({ episodes, ...modal }) => { - const series = usePayload(modal.modalKey); + const { payload, closeModal } = useModalInformation( + modal.modalKey + ); const [uploading, setUpload] = useState(false); - const closeModal = useCloseModal(); - const [pending, setPending] = useState([]); const [processState, setProcessState] = useState({}); - const profile = useProfileBy(series?.profileId); + const profile = useProfileBy(payload?.profileId); const avaliableLanguages = useProfileItemsToLanguages(profile); @@ -173,11 +172,11 @@ const SeriesUploadModal: FunctionComponent = ({ ); const uploadSubtitles = useCallback(async () => { - if (series === null || language === null) { + if (payload === null || language === null) { return; } - const { sonarrSeriesId: seriesid } = series; + const { sonarrSeriesId: seriesid } = payload; let uploadStates = pending.reduce((prev, curr) => { prev[curr.file.name] = { state: State.Update, infos: [] }; @@ -223,7 +222,7 @@ const SeriesUploadModal: FunctionComponent = ({ if (exception) { throw new Error("Error when uploading subtitles"); } - }, [series, pending, language]); + }, [payload, pending, language]); const canUpload = useMemo( () => diff --git a/frontend/src/components/modals/SubtitleToolModal.tsx b/frontend/src/components/modals/SubtitleToolModal.tsx index 4b8dd9538..aebd67e19 100644 --- a/frontend/src/components/modals/SubtitleToolModal.tsx +++ b/frontend/src/components/modals/SubtitleToolModal.tsx @@ -39,7 +39,8 @@ import { LanguageText, Selector, SimpleTable, - usePayload, + useCloseModalIfCovered, + useModalPayload, useShowModal, } from ".."; import { useEnabledLanguages } from "../../@redux/hooks"; @@ -48,7 +49,6 @@ import { isMovie, submodProcessColor } from "../../utilites"; import { log } from "../../utilites/logger"; import { useCustomSelection } from "../tables/plugins"; import BaseModal, { BaseModalProps } from "./BaseModal"; -import { useCloseModalUntil } from "./hooks"; import { availableTranslation, colorOptions } from "./toolOptions"; type SupportType = Item.Episode | Item.Movie; @@ -331,18 +331,18 @@ const TranslateModal: FunctionComponent = ({ interface STMProps {} const STM: FunctionComponent = ({ ...props }) => { - const items = usePayload(props.modalKey); + const payload = useModalPayload(props.modalKey); const [updating, setUpdate] = useState(false); const [processState, setProcessState] = useState({}); const [selections, setSelections] = useState([]); - const closeUntil = useCloseModalUntil(); + const closeModal = useCloseModalIfCovered(); const process = useCallback( async (action: string, override?: Partial) => { log("info", "executing action", action); - closeUntil(props.modalKey); + closeModal(props.modalKey); setUpdate(true); let states = selections.reduce( @@ -374,7 +374,7 @@ const STM: FunctionComponent = ({ ...props }) => { } setUpdate(false); }, - [closeUntil, selections, props.modalKey] + [closeModal, selections, props.modalKey] ); const showModal = useShowModal(); @@ -431,7 +431,7 @@ const STM: FunctionComponent = ({ ...props }) => { const data = useMemo( () => - items?.flatMap((item) => { + payload?.flatMap((item) => { const [id, type] = getIdAndType(item); return item.subtitles.flatMap((v) => { if (v.path !== null) { @@ -449,7 +449,7 @@ const STM: FunctionComponent = ({ ...props }) => { } }); }) ?? [], - [items] + [payload] ); const plugins = [useRowSelect, useCustomSelection]; diff --git a/frontend/src/components/modals/hooks.tsx b/frontend/src/components/modals/hooks.tsx index 6208599bc..ce2c3010b 100644 --- a/frontend/src/components/modals/hooks.tsx +++ b/frontend/src/components/modals/hooks.tsx @@ -3,6 +3,27 @@ import { useDidUpdate } from "rooks"; import { log } from "../../utilites/logger"; import { ModalContext } from "./provider"; +interface ModalInformation { + isShow: boolean; + payload: T | null; + closeModal: ReturnType; +} + +export function useModalInformation(key: string): ModalInformation { + const isShow = useIsModalShow(key); + const payload = useModalPayload(key); + const closeModal = useCloseModal(); + + return useMemo( + () => ({ + isShow, + payload, + closeModal, + }), + [isShow, payload, closeModal] + ); +} + export function useShowModal() { const { control: { push }, @@ -20,30 +41,46 @@ export function useShowModal() { export function useCloseModal() { const { - control: { pop }, + control: { pop, peek }, } = useContext(ModalContext); - return pop; + return useCallback( + (key?: string) => { + const modal = peek(); + if (key) { + if (modal?.key === key) { + pop(); + } + } else { + pop(); + } + }, + [pop, peek] + ); } -export function useCloseModalUntil() { +export function useCloseModalIfCovered() { const { control: { pop, peek }, } = useContext(ModalContext); return useCallback( (key: string) => { let modal = peek(); - while (modal) { - if (modal.key === key) { - break; - } else { - modal = pop(); - } + if (modal && modal.key !== key) { + pop(); } }, [pop, peek] ); } +export function useModalIsCovered(key: string) { + const { modals } = useContext(ModalContext); + return useMemo(() => { + const idx = modals.findIndex((v) => v.key === key); + return idx !== -1 && idx !== 0; + }, [modals, key]); +} + export function useIsModalShow(key: string) { const { control: { peek }, @@ -52,23 +89,30 @@ export function useIsModalShow(key: string) { return key === modal?.key; } -export function useOnModalShow(callback: () => void, key: string) { - const isShow = useIsModalShow(key); +export function useOnModalShow( + callback: (payload: T | null) => void, + key: string +) { + const { + modals, + control: { peek }, + } = useContext(ModalContext); useDidUpdate(() => { - if (isShow) { - callback(); + const modal = peek(); + if (modal && modal.key === key) { + callback(modal.payload ?? null); } - }, [isShow]); + }, [modals.length, key]); } -export function usePayload(key: string): T | null { +export function useModalPayload(key: string): T | null { const { control: { peek }, } = useContext(ModalContext); return useMemo(() => { const modal = peek(); if (modal && modal.key === key) { - return modal.payload as T; + return (modal.payload as T) ?? null; } else { return null; } From 156cf1882c0de7f7f2d990781a8b6d2c80bb1a6a Mon Sep 17 00:00:00 2001 From: morpheus65535 Date: Mon, 16 Aug 2021 14:32:58 -0400 Subject: [PATCH 14/67] Fixed live episode sync when added in Sonarr v3. --- bazarr/get_episodes.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/bazarr/get_episodes.py b/bazarr/get_episodes.py index 48d570a35..614bf135d 100644 --- a/bazarr/get_episodes.py +++ b/bazarr/get_episodes.py @@ -177,12 +177,10 @@ def sync_one_episode(episode_id): else: # For Sonarr v3, we need to update episodes to integrate the episodeFile API endpoint results - if not get_sonarr_info.is_legacy(): - episodeFile = get_episodesFiles_from_sonarr_api(url=url, apikey_sonarr=apikey_sonarr, - episode_file_id=existing_episode['episode_file_id']) - if episode_data['hasFile']: - episode_data['episodeFile'] = episodeFile - + if not get_sonarr_info.is_legacy() and existing_episode and episode_data['hasFile']: + episode_data['episodeFile'] = \ + get_episodesFiles_from_sonarr_api(url=url, apikey_sonarr=apikey_sonarr, + episode_file_id=existing_episode['episode_file_id']) episode = episodeParser(episode_data) except Exception: logging.debug('BAZARR cannot get episode returned by SignalR feed from Sonarr API.') From 8348118ff297f59a1d442828f5204ef1cdc1f386 Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Tue, 17 Aug 2021 22:27:33 +0800 Subject: [PATCH 15/67] Add pagination support to history page --- bazarr/api.py | 6 ++-- frontend/src/@redux/actions/movie.ts | 12 ++++--- frontend/src/@redux/actions/series.ts | 12 ++++--- frontend/src/@redux/hooks/movies.ts | 3 -- frontend/src/@redux/hooks/series.ts | 3 -- frontend/src/@redux/reducers/movie.ts | 10 +++--- frontend/src/@redux/reducers/series.ts | 10 +++--- frontend/src/@socketio/reducer.ts | 6 ++-- frontend/src/@types/api.d.ts | 1 + frontend/src/History/Movies/index.tsx | 6 +++- frontend/src/History/Series/index.tsx | 6 +++- frontend/src/History/generic/index.tsx | 34 +++++++++---------- frontend/src/apis/episodes.ts | 24 +++++++------ frontend/src/apis/movies.ts | 26 +++++++------- .../src/components/modals/HistoryModal.tsx | 12 +++---- 15 files changed, 92 insertions(+), 79 deletions(-) diff --git a/bazarr/api.py b/bazarr/api.py index 5e56f61f7..29a4c8486 100644 --- a/bazarr/api.py +++ b/bazarr/api.py @@ -1419,7 +1419,8 @@ class EpisodesHistory(Resource): if episodeid: query_conditions.append((TableEpisodes.sonarrEpisodeId == episodeid)) query_condition = reduce(operator.and_, query_conditions) - episode_history = TableHistory.select(TableShows.title.alias('seriesTitle'), + episode_history = TableHistory.select(TableHistory.id, + TableShows.title.alias('seriesTitle'), TableEpisodes.monitored, TableEpisodes.season.concat('x').concat(TableEpisodes.episode).alias('episode_number'), TableEpisodes.title.alias('episodeTitle'), @@ -1535,7 +1536,8 @@ class MoviesHistory(Resource): query_conditions.append((TableMovies.radarrId == radarrid)) query_condition = reduce(operator.and_, query_conditions) - movie_history = TableHistoryMovie.select(TableHistoryMovie.action, + movie_history = TableHistoryMovie.select(TableHistoryMovie.id, + TableHistoryMovie.action, TableMovies.title, TableHistoryMovie.timestamp, TableHistoryMovie.description, diff --git a/frontend/src/@redux/actions/movie.ts b/frontend/src/@redux/actions/movie.ts index 6deafc770..af9aa4c1b 100644 --- a/frontend/src/@redux/actions/movie.ts +++ b/frontend/src/@redux/actions/movie.ts @@ -55,15 +55,17 @@ export const movieUpdateWantedByRange = createAsyncThunk( } ); -export const movieUpdateHistory = createAsyncThunk( - "movies/history/update", - async () => { - const response = await MoviesApi.history(); +export const movieUpdateHistoryByRange = createAsyncThunk( + "movies/history/update/range", + async (params: Parameter.Range) => { + const response = await MoviesApi.history(params); return response; } ); -export const movieMarkHistoryDirty = createAction("movies/history/mark_dirty"); +export const movieMarkHistoryDirty = createAction( + "movies/history/mark_dirty" +); export const movieUpdateBlacklist = createAsyncThunk( "movies/blacklist/update", diff --git a/frontend/src/@redux/actions/series.ts b/frontend/src/@redux/actions/series.ts index 41e79408a..a9ab035a6 100644 --- a/frontend/src/@redux/actions/series.ts +++ b/frontend/src/@redux/actions/series.ts @@ -77,15 +77,17 @@ export const episodeUpdateById = createAsyncThunk( } ); -export const episodesUpdateHistory = createAsyncThunk( - "episodes/history/update", - async () => { - const response = await EpisodesApi.history(); +export const episodesUpdateHistoryByRange = createAsyncThunk( + "episodes/history/update/range", + async (param: Parameter.Range) => { + const response = await EpisodesApi.history(param); return response; } ); -export const episodesMarkHistoryDirty = createAction("episodes/history/update"); +export const episodesMarkHistoryDirty = createAction( + "episodes/history/update" +); export const episodesUpdateBlacklist = createAsyncThunk( "episodes/blacklist/update", diff --git a/frontend/src/@redux/hooks/movies.ts b/frontend/src/@redux/hooks/movies.ts index 0a027818e..df8a82272 100644 --- a/frontend/src/@redux/hooks/movies.ts +++ b/frontend/src/@redux/hooks/movies.ts @@ -3,7 +3,6 @@ import { useEntityItemById, useEntityToList } from "../../utilites"; import { movieUpdateBlacklist, movieUpdateById, - movieUpdateHistory, movieUpdateWantedById, } from "../actions"; import { useAutoDirtyUpdate, useAutoUpdate } from "./async"; @@ -62,9 +61,7 @@ export function useBlacklistMovies() { } export function useMoviesHistory() { - const update = useReduxAction(movieUpdateHistory); const items = useReduxStore((s) => s.movies.historyList); - useAutoUpdate(items, update); return items; } diff --git a/frontend/src/@redux/hooks/series.ts b/frontend/src/@redux/hooks/series.ts index 0de8df2cc..d37b7eb32 100644 --- a/frontend/src/@redux/hooks/series.ts +++ b/frontend/src/@redux/hooks/series.ts @@ -2,7 +2,6 @@ import { useCallback, useEffect, useMemo } from "react"; import { useEntityItemById, useEntityToList } from "../../utilites"; import { episodesUpdateBlacklist, - episodesUpdateHistory, episodeUpdateById, episodeUpdateBySeriesId, seriesUpdateById, @@ -94,9 +93,7 @@ export function useBlacklistSeries() { } export function useSeriesHistory() { - const update = useReduxAction(episodesUpdateHistory); const items = useReduxStore((s) => s.series.historyList); - useAutoUpdate(items, update); return items; } diff --git a/frontend/src/@redux/reducers/movie.ts b/frontend/src/@redux/reducers/movie.ts index 7de902801..78ad5e86c 100644 --- a/frontend/src/@redux/reducers/movie.ts +++ b/frontend/src/@redux/reducers/movie.ts @@ -10,7 +10,7 @@ import { movieUpdateBlacklist, movieUpdateById, movieUpdateByRange, - movieUpdateHistory, + movieUpdateHistoryByRange, movieUpdateWantedById, movieUpdateWantedByRange, } from "../actions"; @@ -23,14 +23,14 @@ import { interface Movie { movieList: Async.Entity; wantedMovieList: Async.Entity; - historyList: Async.Item; + historyList: Async.Entity; blacklist: Async.Item; } const defaultMovie: Movie = { movieList: AsyncUtility.getDefaultEntity("radarrId"), wantedMovieList: AsyncUtility.getDefaultEntity("radarrId"), - historyList: AsyncUtility.getDefaultItem(), + historyList: AsyncUtility.getDefaultEntity("id"), blacklist: AsyncUtility.getDefaultItem(), }; @@ -50,8 +50,8 @@ const reducer = createReducer(defaultMovie, (builder) => { dirty: movieMarkWantedDirtyById, }); - createAsyncItemReducer(builder, (s) => s.historyList, { - all: movieUpdateHistory, + createAsyncEntityReducer(builder, (s) => s.historyList, { + range: movieUpdateHistoryByRange, dirty: movieMarkHistoryDirty, }); diff --git a/frontend/src/@redux/reducers/series.ts b/frontend/src/@redux/reducers/series.ts index 1facde9f1..1ce6dbc25 100644 --- a/frontend/src/@redux/reducers/series.ts +++ b/frontend/src/@redux/reducers/series.ts @@ -5,7 +5,7 @@ import { episodesMarkHistoryDirty, episodesRemoveById, episodesUpdateBlacklist, - episodesUpdateHistory, + episodesUpdateHistoryByRange, episodeUpdateById, episodeUpdateBySeriesId, seriesMarkDirtyById, @@ -29,7 +29,7 @@ interface Series { seriesList: Async.Entity; wantedEpisodesList: Async.Entity; episodeList: Async.List; - historyList: Async.Item; + historyList: Async.Entity; blacklist: Async.Item; } @@ -37,7 +37,7 @@ const defaultSeries: Series = { seriesList: AsyncUtility.getDefaultEntity("sonarrSeriesId"), wantedEpisodesList: AsyncUtility.getDefaultEntity("sonarrEpisodeId"), episodeList: AsyncUtility.getDefaultList("sonarrEpisodeId"), - historyList: AsyncUtility.getDefaultItem(), + historyList: AsyncUtility.getDefaultEntity("id"), blacklist: AsyncUtility.getDefaultItem(), }; @@ -72,8 +72,8 @@ const reducer = createReducer(defaultSeries, (builder) => { dirty: seriesMarkWantedDirtyById, }); - createAsyncItemReducer(builder, (s) => s.historyList, { - all: episodesUpdateHistory, + createAsyncEntityReducer(builder, (s) => s.historyList, { + range: episodesUpdateHistoryByRange, dirty: episodesMarkHistoryDirty, }); diff --git a/frontend/src/@socketio/reducer.ts b/frontend/src/@socketio/reducer.ts index 8ed251a97..153915939 100644 --- a/frontend/src/@socketio/reducer.ts +++ b/frontend/src/@socketio/reducer.ts @@ -2,11 +2,9 @@ import { ActionCreator } from "@reduxjs/toolkit"; import { episodesMarkBlacklistDirty, episodesMarkDirtyById, - episodesMarkHistoryDirty, episodesRemoveById, movieMarkBlacklistDirty, movieMarkDirtyById, - movieMarkHistoryDirty, movieMarkWantedDirtyById, movieRemoveById, movieRemoveWantedById, @@ -130,7 +128,7 @@ export function createDefaultReducer(): SocketIO.Reducer[] { }, { key: "movie-history", - any: bindReduxAction(movieMarkHistoryDirty), + // any: bindReduxAction(movieMarkHistoryDirty), }, { key: "movie-blacklist", @@ -138,7 +136,7 @@ export function createDefaultReducer(): SocketIO.Reducer[] { }, { key: "episode-history", - any: bindReduxAction(episodesMarkHistoryDirty), + // any: bindReduxAction(episodesMarkHistoryDirty), }, { key: "episode-blacklist", diff --git a/frontend/src/@types/api.d.ts b/frontend/src/@types/api.d.ts index bcc5abed9..043753879 100644 --- a/frontend/src/@types/api.d.ts +++ b/frontend/src/@types/api.d.ts @@ -195,6 +195,7 @@ declare namespace History { TagType & MonitoredType & Partial & { + id: number; action: number; blacklisted: boolean; score?: string; diff --git a/frontend/src/History/Movies/index.tsx b/frontend/src/History/Movies/index.tsx index 7669bf30c..9a387ecae 100644 --- a/frontend/src/History/Movies/index.tsx +++ b/frontend/src/History/Movies/index.tsx @@ -4,7 +4,9 @@ import React, { FunctionComponent, useMemo } from "react"; import { Badge, OverlayTrigger, Popover } from "react-bootstrap"; import { Link } from "react-router-dom"; import { Column } from "react-table"; +import { movieUpdateHistoryByRange } from "../../@redux/actions"; import { useMoviesHistory } from "../../@redux/hooks"; +import { useReduxAction } from "../../@redux/hooks/base"; import { MoviesApi } from "../../apis"; import { HistoryIcon, LanguageText, TextPopover } from "../../components"; import { BlacklistButton } from "../../generic/blacklist"; @@ -14,6 +16,7 @@ interface Props {} const MoviesHistoryView: FunctionComponent = () => { const movies = useMoviesHistory(); + const loader = useReduxAction(movieUpdateHistoryByRange); const columns: Column[] = useMemo[]>( () => [ @@ -128,7 +131,8 @@ const MoviesHistoryView: FunctionComponent = () => { []} + loader={loader} + columns={columns} > ); }; diff --git a/frontend/src/History/Series/index.tsx b/frontend/src/History/Series/index.tsx index 6c82d84a1..e96c3e689 100644 --- a/frontend/src/History/Series/index.tsx +++ b/frontend/src/History/Series/index.tsx @@ -4,7 +4,9 @@ import React, { FunctionComponent, useMemo } from "react"; import { Badge, OverlayTrigger, Popover } from "react-bootstrap"; import { Link } from "react-router-dom"; import { Column } from "react-table"; +import { episodesUpdateHistoryByRange } from "../../@redux/actions"; import { useSeriesHistory } from "../../@redux/hooks"; +import { useReduxAction } from "../../@redux/hooks/base"; import { EpisodesApi } from "../../apis"; import { HistoryIcon, LanguageText, TextPopover } from "../../components"; import { BlacklistButton } from "../../generic/blacklist"; @@ -14,6 +16,7 @@ interface Props {} const SeriesHistoryView: FunctionComponent = () => { const series = useSeriesHistory(); + const loader = useReduxAction(episodesUpdateHistoryByRange); const columns: Column[] = useMemo[]>( () => [ @@ -137,7 +140,8 @@ const SeriesHistoryView: FunctionComponent = () => { []} + loader={loader} + columns={columns} > ); }; diff --git a/frontend/src/History/generic/index.tsx b/frontend/src/History/generic/index.tsx index 58dbe5acd..0775c6fae 100644 --- a/frontend/src/History/generic/index.tsx +++ b/frontend/src/History/generic/index.tsx @@ -1,21 +1,23 @@ import { capitalize } from "lodash"; -import React, { FunctionComponent } from "react"; +import React from "react"; import { Container, Row } from "react-bootstrap"; import { Helmet } from "react-helmet"; import { Column } from "react-table"; -import { AsyncOverlay, PageTable } from "../../components"; +import { AsyncPageTable } from "../../components"; -interface Props { +interface Props { type: "movies" | "series"; - state: Readonly>; - columns: Column[]; + state: Readonly>; + loader: (param: Parameter.Range) => void; + columns: Column[]; } -const HistoryGenericView: FunctionComponent = ({ +function HistoryGenericView({ state, + loader, columns, type, -}) => { +}: Props) { const typeName = capitalize(type); return ( @@ -23,18 +25,16 @@ const HistoryGenericView: FunctionComponent = ({ {typeName} History - Bazarr - - {({ content }) => ( - - )} - + ); -}; +} export default HistoryGenericView; diff --git a/frontend/src/apis/episodes.ts b/frontend/src/apis/episodes.ts index 4b8eefa0e..e369918d5 100644 --- a/frontend/src/apis/episodes.ts +++ b/frontend/src/apis/episodes.ts @@ -53,16 +53,20 @@ class EpisodeApi extends BaseApi { }); } - async history(episodeid?: number): Promise { - return new Promise((resolve, reject) => { - this.get>("/history", { episodeid }) - .then((result) => { - resolve(result.data.data); - }) - .catch((reason) => { - reject(reason); - }); - }); + async history(params: Parameter.Range) { + const response = await this.get>( + "/history", + params + ); + return response.data; + } + + async historyBy(episodeid: number) { + const response = await this.get>( + "/history", + { episodeid } + ); + return response.data; } async downloadSubtitles( diff --git a/frontend/src/apis/movies.ts b/frontend/src/apis/movies.ts index ac6bad5ae..aa978a77e 100644 --- a/frontend/src/apis/movies.ts +++ b/frontend/src/apis/movies.ts @@ -93,18 +93,20 @@ class MovieApi extends BaseApi { }); } - async history(id?: number): Promise { - return new Promise((resolve, reject) => { - this.get>("/history", { - radarrid: id, - }) - .then((result) => { - resolve(result.data.data); - }) - .catch((reason) => { - reject(reason); - }); - }); + async history(params: Parameter.Range) { + const response = await this.get>( + "/history", + params + ); + return response.data; + } + + async historyBy(radarrid: number) { + const response = await this.get>( + "/history", + { radarrid } + ); + return response.data; } async action(action: FormType.MoviesAction) { diff --git a/frontend/src/components/modals/HistoryModal.tsx b/frontend/src/components/modals/HistoryModal.tsx index 79f14b9ff..9e19d8295 100644 --- a/frontend/src/components/modals/HistoryModal.tsx +++ b/frontend/src/components/modals/HistoryModal.tsx @@ -14,8 +14,8 @@ export const MovieHistoryModal: FunctionComponent = (props) => { const movie = useModalPayload(modal.modalKey); const [history, updateHistory] = useAsyncRequest( - MoviesApi.history.bind(MoviesApi), - [] + MoviesApi.historyBy.bind(MoviesApi), + { data: [], total: 0 } ); const update = useCallback(() => { @@ -98,7 +98,7 @@ export const MovieHistoryModal: FunctionComponent = (props) => { )} @@ -114,8 +114,8 @@ export const EpisodeHistoryModal: FunctionComponent< const episode = useModalPayload(props.modalKey); const [history, updateHistory] = useAsyncRequest( - EpisodesApi.history.bind(EpisodesApi), - [] + EpisodesApi.historyBy.bind(EpisodesApi), + { data: [], total: 0 } ); const update = useCallback(() => { @@ -199,7 +199,7 @@ export const EpisodeHistoryModal: FunctionComponent< )} From d689b6e58c22ddbf5fb3804e8dbe3fc5ea0bf288 Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Tue, 17 Aug 2021 22:52:50 +0800 Subject: [PATCH 16/67] Cleanup API Endpoints --- frontend/src/apis/badges.ts | 20 ++--- frontend/src/apis/base.ts | 11 +-- frontend/src/apis/episodes.ts | 114 +++++++++------------------- frontend/src/apis/files.ts | 15 ++-- frontend/src/apis/history.ts | 17 ++--- frontend/src/apis/movies.ts | 128 ++++++++------------------------ frontend/src/apis/providers.ts | 53 +++++-------- frontend/src/apis/series.ts | 34 ++------- frontend/src/apis/subtitles.ts | 15 +--- frontend/src/apis/system.ts | 131 +++++++-------------------------- frontend/src/apis/utils.ts | 6 +- 11 files changed, 151 insertions(+), 393 deletions(-) diff --git a/frontend/src/apis/badges.ts b/frontend/src/apis/badges.ts index 4bec3bd74..0021dede6 100644 --- a/frontend/src/apis/badges.ts +++ b/frontend/src/apis/badges.ts @@ -1,19 +1,13 @@ -import { AxiosResponse } from "axios"; -import apis from "."; +import BaseApi from "./base"; -class BadgesApi { - get(path: string, params?: any): Promise> { - return apis.axios.get(`/badges${path}`, { params }); +class BadgesApi extends BaseApi { + constructor() { + super("/badges"); } - async all(): Promise { - return new Promise((resolve, reject) => { - this.get("") - .then((result) => { - resolve(result.data); - }) - .catch(reject); - }); + async all() { + const response = await this.get(""); + return response; } } diff --git a/frontend/src/apis/base.ts b/frontend/src/apis/base.ts index 1da7685c5..3a0ab4bb9 100644 --- a/frontend/src/apis/base.ts +++ b/frontend/src/apis/base.ts @@ -30,11 +30,12 @@ class BaseApi { } } - protected get(path: string, params?: any): Promise> { - return apis.axios.get(this.prefix + path, { params }); + protected async get(path: string, params?: any) { + const response = await apis.axios.get(this.prefix + path, { params }); + return response.data; } - protected post( + protected post( path: string, formdata?: LooseObject, params?: any @@ -43,7 +44,7 @@ class BaseApi { return apis.axios.post(this.prefix + path, form, { params }); } - protected patch( + protected patch( path: string, formdata?: LooseObject, params?: any @@ -52,7 +53,7 @@ class BaseApi { return apis.axios.patch(this.prefix + path, form, { params }); } - protected delete( + protected delete( path: string, formdata?: any, params?: any diff --git a/frontend/src/apis/episodes.ts b/frontend/src/apis/episodes.ts index e369918d5..345954b32 100644 --- a/frontend/src/apis/episodes.ts +++ b/frontend/src/apis/episodes.ts @@ -5,52 +5,34 @@ class EpisodeApi extends BaseApi { super("/episodes"); } - async bySeriesId(seriesid: number[]): Promise { - return new Promise((resolve, reject) => { - this.get>("", { seriesid }) - .then((result) => { - resolve(result.data.data); - }) - .catch((reason) => { - reject(reason); - }); + async bySeriesId(seriesid: number[]) { + const response = await this.get>("", { + seriesid, }); + return response.data; } - async byEpisodeId(episodeid: number[]): Promise { - return new Promise((resolve, reject) => { - this.get>("", { episodeid }) - .then((result) => { - resolve(result.data.data); - }) - .catch((reason) => { - reject(reason); - }); + async byEpisodeId(episodeid: number[]) { + const response = await this.get>("", { + episodeid, }); + return response.data; } async wanted(params: Parameter.Range) { - return new Promise>((resolve, reject) => { - this.get>("/wanted", params) - .then((result) => { - resolve(result.data); - }) - .catch((reason) => { - reject(reason); - }); - }); + const response = await this.get>( + "/wanted", + params + ); + return response; } async wantedBy(episodeid: number[]) { - return new Promise>((resolve, reject) => { - this.get>("/wanted", { episodeid }) - .then((result) => { - resolve(result.data); - }) - .catch((reason) => { - reject(reason); - }); - }); + const response = await this.get>( + "/wanted", + { episodeid } + ); + return response; } async history(params: Parameter.Range) { @@ -58,7 +40,7 @@ class EpisodeApi extends BaseApi { "/history", params ); - return response.data; + return response; } async historyBy(episodeid: number) { @@ -66,76 +48,50 @@ class EpisodeApi extends BaseApi { "/history", { episodeid } ); - return response.data; + return response; } async downloadSubtitles( seriesid: number, episodeid: number, form: FormType.Subtitle - ): Promise { - return new Promise((resolve, reject) => { - this.patch("/subtitles", form, { seriesid, episodeid }) - .then(() => resolve()) - .catch(reject); - }); + ) { + await this.patch("/subtitles", form, { seriesid, episodeid }); } async uploadSubtitles( seriesid: number, episodeid: number, form: FormType.UploadSubtitle - ): Promise { - return new Promise((resolve, reject) => { - this.post("/subtitles", form, { seriesid, episodeid }) - .then(() => resolve()) - .catch(reject); - }); + ) { + await this.post("/subtitles", form, { seriesid, episodeid }); } async deleteSubtitles( seriesid: number, episodeid: number, form: FormType.DeleteSubtitle - ): Promise { - return new Promise((resolve, reject) => { - this.delete("/subtitles", form, { seriesid, episodeid }) - .then(() => resolve()) - .catch(reject); - }); + ) { + await this.delete("/subtitles", form, { seriesid, episodeid }); } - async blacklist(): Promise { - return new Promise((resolve, reject) => { - this.get>("/blacklist") - .then((res) => { - resolve(res.data.data); - }) - .catch(reject); - }); + async blacklist() { + const response = await this.get>( + "/blacklist" + ); + return response.data; } async addBlacklist( seriesid: number, episodeid: number, form: FormType.AddBlacklist - ): Promise { - return new Promise((resolve, reject) => { - this.post("/blacklist", form, { seriesid, episodeid }) - .then(() => resolve()) - .catch(reject); - }); + ) { + await this.post("/blacklist", form, { seriesid, episodeid }); } - async deleteBlacklist( - all?: boolean, - form?: FormType.DeleteBlacklist - ): Promise { - return new Promise((resolve, reject) => { - this.delete("/blacklist", form, { all }) - .then(() => resolve()) - .catch(reject); - }); + async deleteBlacklist(all?: boolean, form?: FormType.DeleteBlacklist) { + await this.delete("/blacklist", form, { all }); } } diff --git a/frontend/src/apis/files.ts b/frontend/src/apis/files.ts index 9b42d0705..88913ac08 100644 --- a/frontend/src/apis/files.ts +++ b/frontend/src/apis/files.ts @@ -5,23 +5,20 @@ class FilesApi extends BaseApi { super("/files"); } - async browse(name: string, path?: string): Promise { - return new Promise((resolve, reject) => { - this.get(name, { path }) - .then((res) => resolve(res.data)) - .catch(reject); - }); + async browse(name: string, path?: string) { + const response = await this.get(name, { path }); + return response; } - async bazarr(path?: string): Promise { + async bazarr(path?: string) { return this.browse("", path); } - async sonarr(path?: string): Promise { + async sonarr(path?: string) { return this.browse("/sonarr", path); } - async radarr(path?: string): Promise { + async radarr(path?: string) { return this.browse("/radarr", path); } } diff --git a/frontend/src/apis/history.ts b/frontend/src/apis/history.ts index 375aafff8..d26d89d8b 100644 --- a/frontend/src/apis/history.ts +++ b/frontend/src/apis/history.ts @@ -10,17 +10,14 @@ class HistoryApi extends BaseApi { action?: History.ActionOptions, provider?: string, language?: Language.CodeType - ): Promise { - return new Promise((resolve, reject) => { - this.get("/stats", { - timeframe, - action, - provider, - language, - }) - .then((res) => resolve(res.data)) - .catch(reject); + ) { + const response = await this.get("/stats", { + timeframe, + action, + provider, + language, }); + return response; } } diff --git a/frontend/src/apis/movies.ts b/frontend/src/apis/movies.ts index aa978a77e..8e94712cb 100644 --- a/frontend/src/apis/movies.ts +++ b/frontend/src/apis/movies.ts @@ -5,92 +5,50 @@ class MovieApi extends BaseApi { super("/movies"); } - async blacklist(): Promise { - return new Promise((resolve, reject) => { - this.get>("/blacklist") - .then((res) => { - resolve(res.data.data); - }) - .catch(reject); - }); + async blacklist() { + const response = await this.get>( + "/blacklist" + ); + return response.data; } - async addBlacklist( - radarrid: number, - form: FormType.AddBlacklist - ): Promise { - return new Promise((resolve, reject) => { - this.post("/blacklist", form, { radarrid }) - .then(() => resolve()) - .catch(reject); - }); + async addBlacklist(radarrid: number, form: FormType.AddBlacklist) { + await this.post("/blacklist", form, { radarrid }); } - async deleteBlacklist( - all?: boolean, - form?: FormType.DeleteBlacklist - ): Promise { - return new Promise((resolve, reject) => { - this.delete("/blacklist", form, { all }) - .then(() => resolve()) - .catch(reject); - }); + async deleteBlacklist(all?: boolean, form?: FormType.DeleteBlacklist) { + await this.delete("/blacklist", form, { all }); } async movies(radarrid?: number[]) { - return new Promise>((resolve, reject) => { - this.get>("", { radarrid }) - .then((result) => { - resolve(result.data); - }) - .catch((reason) => { - reject(reason); - }); + const response = await this.get>("", { + radarrid, }); + return response; } async moviesBy(params: Parameter.Range) { - return new Promise>((resolve, reject) => { - this.get>("", params) - .then((result) => { - resolve(result.data); - }) - .catch((reason) => { - reject(reason); - }); - }); + const response = await this.get>("", params); + return response; } async modify(form: FormType.ModifyItem) { - return new Promise((resolve, reject) => { - this.post("", { radarrid: form.id, profileid: form.profileid }) - .then(() => resolve()) - .catch((err) => reject(err)); - }); + await this.post("", { radarrid: form.id, profileid: form.profileid }); } async wanted(params: Parameter.Range) { - return new Promise>((resolve, reject) => { - this.get>("/wanted", params) - .then((result) => { - resolve(result.data); - }) - .catch((reason) => { - reject(reason); - }); - }); + const response = await this.get>( + "/wanted", + params + ); + return response; } async wantedBy(radarrid: number[]) { - return new Promise>((resolve, reject) => { - this.get>("/wanted", { radarrid }) - .then((result) => { - resolve(result.data); - }) - .catch((reason) => { - reject(reason); - }); + const response = await this.get>("/wanted", { + radarrid, }); + return response; } async history(params: Parameter.Range) { @@ -98,7 +56,7 @@ class MovieApi extends BaseApi { "/history", params ); - return response.data; + return response; } async historyBy(radarrid: number) { @@ -106,45 +64,23 @@ class MovieApi extends BaseApi { "/history", { radarrid } ); - return response.data; + return response; } async action(action: FormType.MoviesAction) { - return new Promise((resolve, reject) => { - this.patch("", action) - .then(() => resolve()) - .catch(reject); - }); + await this.patch("", action); } - async downloadSubtitles(id: number, form: FormType.Subtitle): Promise { - return new Promise((resolve, reject) => { - this.patch("/subtitles", form, { radarrid: id }) - .then(() => resolve()) - .catch(reject); - }); + async downloadSubtitles(radarrid: number, form: FormType.Subtitle) { + await this.patch("/subtitles", form, { radarrid }); } - async uploadSubtitles( - id: number, - form: FormType.UploadSubtitle - ): Promise { - return new Promise((resolve, reject) => { - this.post("/subtitles", form, { radarrid: id }) - .then(() => resolve()) - .catch(reject); - }); + async uploadSubtitles(radarrid: number, form: FormType.UploadSubtitle) { + await this.post("/subtitles", form, { radarrid }); } - async deleteSubtitles( - id: number, - form: FormType.DeleteSubtitle - ): Promise { - return new Promise((resolve, reject) => { - this.delete("/subtitles", form, { radarrid: id }) - .then(() => resolve()) - .catch(reject); - }); + async deleteSubtitles(radarrid: number, form: FormType.DeleteSubtitle) { + await this.delete("/subtitles", form, { radarrid }); } } diff --git a/frontend/src/apis/providers.ts b/frontend/src/apis/providers.ts index 5e1239092..cfbb2dbc5 100644 --- a/frontend/src/apis/providers.ts +++ b/frontend/src/apis/providers.ts @@ -6,47 +6,36 @@ class ProviderApi extends BaseApi { } async providers(history: boolean = false) { - return new Promise((resolve, reject) => { - this.get>("", { history }) - .then((result) => { - resolve(result.data.data); - }) - .catch(reject); + const response = await this.get>("", { + history, }); + return response.data; } async reset() { - return new Promise((resolve, reject) => { - this.post("", { action: "reset" }) - .then(() => resolve()) - .catch(reject); - }); + await this.post("", { action: "reset" }); } async movies(id: number) { - return new Promise((resolve, reject) => { - this.get>("/movies", { radarrid: id }) - .then((result) => resolve(result.data.data)) - .catch(reject); - }); + const response = await this.get>( + "/movies", + { radarrid: id } + ); + return response.data; } async downloadMovieSubtitle(radarrid: number, form: FormType.ManualDownload) { - return new Promise((resolve, reject) => { - this.post("/movies", form, { radarrid }) - .then(() => resolve()) - .catch(reject); - }); + await this.post("/movies", form, { radarrid }); } - async episodes(id: number) { - return new Promise((resolve, reject) => { - this.get>("/episodes", { - episodeid: id, - }) - .then((result) => resolve(result.data.data)) - .catch(reject); - }); + async episodes(episodeid: number) { + const response = await this.get>( + "/episodes", + { + episodeid, + } + ); + return response.data; } async downloadEpisodeSubtitle( @@ -54,11 +43,7 @@ class ProviderApi extends BaseApi { episodeid: number, form: FormType.ManualDownload ) { - return new Promise((resolve, reject) => { - this.post("/episodes", form, { seriesid, episodeid }) - .then(() => resolve()) - .catch(reject); - }); + await this.post("/episodes", form, { seriesid, episodeid }); } } diff --git a/frontend/src/apis/series.ts b/frontend/src/apis/series.ts index d5349723d..976104003 100644 --- a/frontend/src/apis/series.ts +++ b/frontend/src/apis/series.ts @@ -6,43 +6,23 @@ class SeriesApi extends BaseApi { } async series(seriesid?: number[]) { - return new Promise>((resolve, reject) => { - this.get>("", { seriesid }) - .then((result) => { - resolve(result.data); - }) - .catch((reason) => { - reject(reason); - }); + const response = await this.get>("", { + seriesid, }); + return response; } async seriesBy(params: Parameter.Range) { - return new Promise>((resolve, reject) => { - this.get>("", params) - .then((result) => { - resolve(result.data); - }) - .catch((reason) => { - reject(reason); - }); - }); + const response = await this.get>("", params); + return response; } async modify(form: FormType.ModifyItem) { - return new Promise((resolve, reject) => { - this.post("", { seriesid: form.id, profileid: form.profileid }) - .then(() => resolve()) - .catch((err) => reject(err)); - }); + await this.post("", { seriesid: form.id, profileid: form.profileid }); } async action(form: FormType.SeriesAction) { - return new Promise((resolve, reject) => { - this.patch("", form) - .then(() => resolve()) - .catch(reject); - }); + await this.patch("", form); } } diff --git a/frontend/src/apis/subtitles.ts b/frontend/src/apis/subtitles.ts index 55b7646fc..abfe96ba6 100644 --- a/frontend/src/apis/subtitles.ts +++ b/frontend/src/apis/subtitles.ts @@ -6,21 +6,14 @@ class SubtitlesApi extends BaseApi { } async info(names: string[]) { - return new Promise((resolve, reject) => { - this.get>(`/info`, { - filenames: names, - }) - .then((result) => resolve(result.data.data)) - .catch(reject); + const response = await this.get>(`/info`, { + filenames: names, }); + return response.data; } async modify(action: string, form: FormType.ModifySubtitle) { - return new Promise((resolve, reject) => { - this.patch("", form, { action }) - .then(() => resolve()) - .catch(reject); - }); + await this.patch("", form, { action }); } } diff --git a/frontend/src/apis/system.ts b/frontend/src/apis/system.ts index f9bbbeab5..d21200c28 100644 --- a/frontend/src/apis/system.ts +++ b/frontend/src/apis/system.ts @@ -6,27 +6,15 @@ class SystemApi extends BaseApi { } private async performAction(action: string) { - return new Promise((resolve, reject) => { - this.post("", undefined, { action }) - .then(resolve) - .catch(reject); - }); + await this.post("", undefined, { action }); } async login(username: string, password: string) { - return new Promise((resolve, reject) => { - this.post("/account", { username, password }, { action: "login" }) - .then(resolve) - .catch(reject); - }); + await this.post("/account", { username, password }, { action: "login" }); } async logout() { - return new Promise((resolve, reject) => { - this.post("/account", undefined, { action: "logout" }) - .then(resolve) - .catch(reject); - }); + await this.post("/account", undefined, { action: "logout" }); } async shutdown() { @@ -38,131 +26,66 @@ class SystemApi extends BaseApi { } async settings() { - return new Promise((resolve, reject) => { - this.get("/settings") - .then((result) => { - resolve(result.data); - }) - .catch(reject); - }); + const response = await this.get("/settings"); + return response; } async setSettings(data: object) { - return new Promise((resolve, reject) => { - this.post("/settings", data) - .then((res) => { - resolve(); - }) - .catch(reject); - }); + await this.post("/settings", data); } async languages(history: boolean = false) { - return new Promise((resolve, reject) => { - this.get("/languages", { history }) - .then((result) => { - resolve(result.data); - }) - .catch((reason) => { - reject(reason); - }); + const response = await this.get("/languages", { + history, }); + return response; } async languagesProfileList() { - return new Promise((resolve, reject) => { - this.get("/languages/profiles") - .then((result) => resolve(result.data)) - .catch(reject); - }); + const response = await this.get("/languages/profiles"); + return response; } async status() { - return new Promise((resolve, reject) => { - this.get>("/status") - .then((result) => { - resolve(result.data.data); - }) - .catch((reason) => { - reject(reason); - }); - }); + const response = await this.get>("/status"); + return response.data; } async health() { - return new Promise((resolve, reject) => { - this.get>("/health") - .then((result) => { - resolve(result.data.data); - }) - .catch((reason) => { - reject(reason); - }); - }); + const response = await this.get>("/health"); + return response.data; } async logs() { - return new Promise((resolve, reject) => { - this.get>("/logs") - .then((result) => resolve(result.data.data)) - .catch((err) => reject(err)); - }); + const response = await this.get>("/logs"); + return response.data; } async releases() { - return new Promise((resolve, reject) => { - this.get>("/releases") - .then((result) => resolve(result.data.data)) - .catch(reject); - }); + const response = await this.get>("/releases"); + return response.data; } async deleteLogs() { - return new Promise((resolve, reject) => { - this.delete("/logs") - .then(() => resolve()) - .catch((err) => reject(err)); - }); + await this.delete("/logs"); } async tasks() { - return new Promise((resolve, reject) => { - this.get>("/tasks") - .then((result) => { - resolve(result.data.data); - }) - .catch((reason) => { - reject(reason); - }); - }); + const response = await this.get>("/tasks"); + return response.data; } - async runTask(id: string) { - return new Promise((resolve, reject) => { - this.post("/tasks", { taskid: id }) - .then(() => { - resolve(); - }) - .catch((reason) => { - reject(reason); - }); - }); + async runTask(taskid: string) { + await this.post("/tasks", { taskid }); } async testNotification(url: string) { - return new Promise((resolve, reject) => { - this.patch("/notifications", { url }) - .then(() => resolve()) - .catch(reject); - }); + await this.patch("/notifications", { url }); } async search(query: string) { - return new Promise((resolve, reject) => { - this.get("/searches", { query }) - .then((res) => resolve(res.data)) - .catch(reject); - }); + const response = await this.get("/searches", { query }); + return response; } } diff --git a/frontend/src/apis/utils.ts b/frontend/src/apis/utils.ts index f45b53150..d2adddb26 100644 --- a/frontend/src/apis/utils.ts +++ b/frontend/src/apis/utils.ts @@ -11,11 +11,7 @@ type UrlTestResponse = }; class RequestUtils { - async urlTest( - protocol: string, - url: string, - params?: any - ): Promise { + async urlTest(protocol: string, url: string, params?: any) { try { const result = await apis.axios.get( `../test/${protocol}/${url}api/system/status`, From a2816f37613991b53a82b199dd10fabe3a913b8f Mon Sep 17 00:00:00 2001 From: morpheus65535 Date: Tue, 17 Aug 2021 13:10:27 -0400 Subject: [PATCH 17/67] Fixed an issue with ffprobe caching. Could be fixing a small part of the issue in #1502. --- bazarr/embedded_subs_reader.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/bazarr/embedded_subs_reader.py b/bazarr/embedded_subs_reader.py index 77c682f27..c0f99ae0c 100644 --- a/bazarr/embedded_subs_reader.py +++ b/bazarr/embedded_subs_reader.py @@ -9,6 +9,7 @@ from enzyme.exceptions import MalformedMKVError from enzyme.exceptions import MalformedMKVError from custom_lang import CustomLanguage from database import TableEpisodes, TableMovies +from helper import path_mappings logger = logging.getLogger(__name__) @@ -77,14 +78,12 @@ def parse_video_metadata(file, file_size, episode_file_id=None, movie_file_id=No # Get the actual cache value form database if episode_file_id: cache_key = TableEpisodes.select(TableEpisodes.ffprobe_cache)\ - .where((TableEpisodes.episode_file_id == episode_file_id) and - (TableEpisodes.file_size == file_size))\ + .where(TableEpisodes.path == path_mappings.path_replace_reverse(file))\ .dicts()\ .get() elif movie_file_id: cache_key = TableMovies.select(TableMovies.ffprobe_cache)\ - .where(TableMovies.movie_file_id == movie_file_id and - TableMovies.file_size == file_size)\ + .where(TableMovies.path == path_mappings.path_replace_reverse_movie(file))\ .dicts()\ .get() else: @@ -110,7 +109,7 @@ def parse_video_metadata(file, file_size, episode_file_id=None, movie_file_id=No if ffprobe_path: api.initialize({"provider": "ffmpeg", "ffmpeg": ffprobe_path}) data["ffprobe"] = api.know(file) - # if nto, we use enzyme for mkv files + # if not, we use enzyme for mkv files else: if os.path.splitext(file)[1] == ".mkv": with open(file, "rb") as f: @@ -127,10 +126,10 @@ def parse_video_metadata(file, file_size, episode_file_id=None, movie_file_id=No # we write to db the result and return the newly cached ffprobe dict if episode_file_id: TableEpisodes.update({TableEpisodes.ffprobe_cache: pickle.dumps(data, pickle.HIGHEST_PROTOCOL)})\ - .where(TableEpisodes.episode_file_id == episode_file_id)\ + .where(TableEpisodes.path == path_mappings.path_replace_reverse(file))\ .execute() elif movie_file_id: TableMovies.update({TableEpisodes.ffprobe_cache: pickle.dumps(data, pickle.HIGHEST_PROTOCOL)})\ - .where(TableMovies.movie_file_id == movie_file_id)\ + .where(TableMovies.path == path_mappings.path_replace_reverse_movie(file))\ .execute() return data From 2762fc4a6a4c3276faab78c1263523ab63054685 Mon Sep 17 00:00:00 2001 From: morpheus65535 Date: Tue, 17 Aug 2021 14:35:01 -0400 Subject: [PATCH 18/67] Added a settings to ignore ffprobe cache on scheduled disk scan. --- bazarr/config.py | 6 ++++-- bazarr/list_subtitles.py | 9 +++++++-- frontend/src/Settings/Scheduler/index.tsx | 22 ++++++++++++++++++++++ 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/bazarr/config.py b/bazarr/config.py index 1b2a3c655..bbc795a02 100644 --- a/bazarr/config.py +++ b/bazarr/config.py @@ -91,7 +91,8 @@ defaults = { 'series_sync': '60', 'episodes_sync': '60', 'excluded_tags': '[]', - 'excluded_series_types': '[]' + 'excluded_series_types': '[]', + 'use_ffprobe_cache': 'True' }, 'radarr': { 'ip': '127.0.0.1', @@ -104,7 +105,8 @@ defaults = { 'full_update_hour': '5', 'only_monitored': 'False', 'movies_sync': '60', - 'excluded_tags': '[]' + 'excluded_tags': '[]', + 'use_ffprobe_cache': 'True' }, 'proxy': { 'type': 'None', diff --git a/bazarr/list_subtitles.py b/bazarr/list_subtitles.py index 7d4c31e81..2248f904d 100644 --- a/bazarr/list_subtitles.py +++ b/bazarr/list_subtitles.py @@ -446,6 +446,8 @@ def list_missing_subtitles_movies(no=None, send_event=True): def series_full_scan_subtitles(): + use_ffprobe_cache = settings.sonarr.getboolean('use_ffprobe_cache') + episodes = TableEpisodes.select(TableEpisodes.path).dicts() count_episodes = len(episodes) @@ -456,7 +458,7 @@ def series_full_scan_subtitles(): name='Episodes subtitles', value=i, count=count_episodes) - store_subtitles(episode['path'], path_mappings.path_replace(episode['path'])) + store_subtitles(episode['path'], path_mappings.path_replace(episode['path']), use_cache=use_ffprobe_cache) hide_progress(id='episodes_disk_scan') @@ -464,6 +466,8 @@ def series_full_scan_subtitles(): def movies_full_scan_subtitles(): + use_ffprobe_cache = settings.radarr.getboolean('use_ffprobe_cache') + movies = TableMovies.select(TableMovies.path).dicts() count_movies = len(movies) @@ -474,7 +478,8 @@ def movies_full_scan_subtitles(): name='Movies subtitles', value=i, count=count_movies) - store_subtitles_movie(movie['path'], path_mappings.path_replace_movie(movie['path'])) + store_subtitles_movie(movie['path'], path_mappings.path_replace_movie(movie['path']), + use_cache=use_ffprobe_cache) hide_progress(id='movies_disk_scan') diff --git a/frontend/src/Settings/Scheduler/index.tsx b/frontend/src/Settings/Scheduler/index.tsx index b56dfc492..728727fbd 100644 --- a/frontend/src/Settings/Scheduler/index.tsx +++ b/frontend/src/Settings/Scheduler/index.tsx @@ -1,8 +1,10 @@ import React, { FunctionComponent, useMemo } from "react"; import { + Check, CollapseBox, Group, Input, + Message, Selector, SettingsProvider, } from "../components"; @@ -73,6 +75,16 @@ const SettingsSchedulerView: FunctionComponent = () => { > + + + + If disabled, Bazarr will use ffprobe to index video file + properties on each run. This will result in higher disk I/O. + + @@ -99,6 +111,16 @@ const SettingsSchedulerView: FunctionComponent = () => { > + + + + If disabled, Bazarr will use ffprobe to index video file + properties on each run. This will result in higher disk I/O. + + From 2f6206f3a66ea2c424cfc39ca2100d95bd4b062d Mon Sep 17 00:00:00 2001 From: morpheus65535 Date: Tue, 17 Aug 2021 15:34:20 -0400 Subject: [PATCH 19/67] Fixed Bazarr not starting if Sonarr or Radarr is unavailable #1506. --- bazarr/main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/bazarr/main.py b/bazarr/main.py index c579c4979..92b077817 100644 --- a/bazarr/main.py +++ b/bazarr/main.py @@ -207,7 +207,6 @@ if settings.general.getboolean('use_sonarr'): greenlets.append(Greenlet.spawn(sonarr_signalr_client.start)) if settings.general.getboolean('use_radarr'): greenlets.append(Greenlet.spawn(radarr_signalr_client.start)) -joinall(greenlets) if __name__ == "__main__": From 70cb16f0a284c36dcb8cfbaf3bc467d426fbcfe3 Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Wed, 18 Aug 2021 08:26:52 +0800 Subject: [PATCH 20/67] Fix some visual bugs of the notification center --- frontend/src/@redux/actions/site.ts | 9 +++++-- frontend/src/@redux/reducers/site.ts | 36 +++++++++++++++++++++------- frontend/src/@socketio/reducer.ts | 6 +---- frontend/src/App/Notification.tsx | 2 +- frontend/src/apis/index.ts | 6 +++-- frontend/src/utilites/async.ts | 6 +++++ 6 files changed, 46 insertions(+), 19 deletions(-) diff --git a/frontend/src/@redux/actions/site.ts b/frontend/src/@redux/actions/site.ts index 8fa4cd077..89f89c0c7 100644 --- a/frontend/src/@redux/actions/site.ts +++ b/frontend/src/@redux/actions/site.ts @@ -1,5 +1,6 @@ import { createAction, createAsyncThunk } from "@reduxjs/toolkit"; import { BadgesApi } from "../../apis"; +import { waitFor } from "../../utilites"; import { systemUpdateAllSettings } from "./system"; export const siteBootstrap = createAsyncThunk( @@ -29,8 +30,12 @@ export const siteRemoveNotifications = createAction( export const siteAddProgress = createAction("site/progress/add"); -export const siteRemoveProgress = createAction( - "site/progress/remove" +export const siteRemoveProgress = createAsyncThunk( + "site/progress/remove", + async (ids: string[]) => { + await waitFor(3 * 1000); + return ids; + } ); export const siteChangeSidebar = createAction("site/sidebar/update"); diff --git a/frontend/src/@redux/reducers/site.ts b/frontend/src/@redux/reducers/site.ts index 54aedc3d0..2cf860674 100644 --- a/frontend/src/@redux/reducers/site.ts +++ b/frontend/src/@redux/reducers/site.ts @@ -1,5 +1,5 @@ import { createReducer } from "@reduxjs/toolkit"; -import { pullAllWith, remove, uniqBy } from "lodash"; +import { intersectionWith, pullAllWith, remove, sortBy, uniqBy } from "lodash"; import apis from "../../apis"; import { siteAddNotifications, @@ -50,31 +50,49 @@ const reducer = createReducer(defaultSite, (builder) => { }) .addCase(siteRedirectToAuth, (state) => { if (process.env.NODE_ENV !== "production") { - apis.danger_resetApi("NEED_AUTH"); + apis._resetApi("NEED_AUTH"); } state.auth = false; }) .addCase(siteUpdateInitialization, (state, action) => { state.initialized = action.payload; - }) + }); + + builder .addCase(siteAddNotifications, (state, action) => { state.notifications = uniqBy( - [...action.payload.reverse(), ...state.notifications], - (n) => n.id + [...action.payload, ...state.notifications], + (v) => v.id ); + state.notifications = sortBy(state.notifications, (v) => v.id); }) .addCase(siteRemoveNotifications, (state, action) => { remove(state.notifications, (n) => n.id === action.payload); - }) + }); + + builder .addCase(siteAddProgress, (state, action) => { state.progress = uniqBy( - [...action.payload.reverse(), ...state.progress], + [...action.payload, ...state.progress], (n) => n.id ); + state.progress = sortBy(state.progress, (v) => v.id); }) - .addCase(siteRemoveProgress, (state, action) => { + .addCase(siteRemoveProgress.pending, (state, action) => { + // Mark completed + intersectionWith( + state.progress, + action.meta.arg, + (l, r) => l.id === r + ).forEach((v) => { + v.value = v.count + 1; + }); + }) + .addCase(siteRemoveProgress.fulfilled, (state, action) => { pullAllWith(state.progress, action.payload, (l, r) => l.id === r); - }) + }); + + builder .addCase(siteChangeSidebar, (state, action) => { state.sidebar = action.payload; }) diff --git a/frontend/src/@socketio/reducer.ts b/frontend/src/@socketio/reducer.ts index 153915939..b13112abf 100644 --- a/frontend/src/@socketio/reducer.ts +++ b/frontend/src/@socketio/reducer.ts @@ -83,11 +83,7 @@ export function createDefaultReducer(): SocketIO.Reducer[] { { key: "progress", update: bindReduxAction(siteAddProgress), - delete: (ids) => { - setTimeout(() => { - reduxStore.dispatch(siteRemoveProgress(ids)); - }, 3 * 1000); - }, + delete: bindReduxAction(siteRemoveProgress), }, { key: "series", diff --git a/frontend/src/App/Notification.tsx b/frontend/src/App/Notification.tsx index 6c1727c60..8c62caa37 100644 --- a/frontend/src/App/Notification.tsx +++ b/frontend/src/App/Notification.tsx @@ -202,7 +202,7 @@ const Progress: FunctionComponent = ({ count, header, }) => { - const isCompleted = value / count >= 1; + const isCompleted = value / count > 1; return (

diff --git a/frontend/src/apis/index.ts b/frontend/src/apis/index.ts index eb91fe87c..9c66aa4ab 100644 --- a/frontend/src/apis/index.ts +++ b/frontend/src/apis/index.ts @@ -52,8 +52,10 @@ class Api { ); } - danger_resetApi(apikey: string) { - this.axios.defaults.headers.common["X-API-KEY"] = apikey; + _resetApi(apikey: string) { + if (process.env.NODE_ENV !== "production") { + this.axios.defaults.headers.common["X-API-KEY"] = apikey; + } } handleError(code: number) { diff --git a/frontend/src/utilites/async.ts b/frontend/src/utilites/async.ts index 97eaeb42a..de363de32 100644 --- a/frontend/src/utilites/async.ts +++ b/frontend/src/utilites/async.ts @@ -3,6 +3,12 @@ import { useEffect, useMemo, useState } from "react"; import { useEffectOnceWhen } from "rooks"; import { useEntityIdByRange, useEntityToItem } from "./entity"; +export async function waitFor(time: number) { + return new Promise((resolved) => { + setTimeout(resolved, time); + }); +} + export function useNewEntityIds(entity: Async.Entity) { return useMemo(() => { const dirtyEntities = entity.dirtyEntities; From 79621a08716d64dff3a80b00ef15acd605068387 Mon Sep 17 00:00:00 2001 From: morpheus65535 Date: Wed, 18 Aug 2021 07:18:05 -0400 Subject: [PATCH 21/67] Fixed debug logging when no episode are returned from database for a specific series because they are ignored. #1507 --- bazarr/get_subtitle.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bazarr/get_subtitle.py b/bazarr/get_subtitle.py index ceac880b6..cf25a0fb8 100644 --- a/bazarr/get_subtitle.py +++ b/bazarr/get_subtitle.py @@ -729,7 +729,8 @@ def series_download_subtitles(no): .where(reduce(operator.and_, conditions))\ .dicts() if not episodes_details: - logging.debug("BAZARR no episode for that sonarrSeriesId can be found in database:", str(no)) + logging.debug("BAZARR no episode for that sonarrSeriesId have been found in database or they have all been " + "ignored because of monitored status, series type or series tags: {}".format(no)) return providers_list = get_providers() From 34b1782e6a1304bd3a4da9c6e9b8b540358888e0 Mon Sep 17 00:00:00 2001 From: vitiko98 Date: Thu, 19 Aug 2021 03:44:23 -0400 Subject: [PATCH 22/67] Update merged source formats --- libs/subliminal_patch/subtitle.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/subliminal_patch/subtitle.py b/libs/subliminal_patch/subtitle.py index 7223a7824..78c291670 100644 --- a/libs/subliminal_patch/subtitle.py +++ b/libs/subliminal_patch/subtitle.py @@ -402,9 +402,9 @@ class ModifiedSubtitle(Subtitle): MERGED_FORMATS = { - "TV": ("HDTV", "SDTV", "AHDTV", "UHDTV"), - "Air": ("SATRip", "DVB", "PPV"), - "Disk-HD": ("HD-DVD", "Blu-ray"), + "TV": ("HDTV", "SDTV", "AHDTV", "Ultra HDTV"), + "Air": ("SATRip", "DVB", "PPV", "Digital TV"), + "Disk-HD": ("HD-DVD", "Blu-ray", "Ultra HD Blu-ray"), "Disk-SD": ("DVD", "VHS"), "Web": ("Web",), } From 18f59cf0f93412a94e8ec901d34d31eab6d55f9c Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Sat, 21 Aug 2021 22:50:48 +0800 Subject: [PATCH 23/67] Add support of theme-color in Safari 15 --- frontend/public/index.html | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/public/index.html b/frontend/public/index.html index 14d20c9f3..c88185a04 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -17,6 +17,7 @@ name="description" content="Bazarr is a companion application to Sonarr and Radarr. It manages and downloads subtitles based on your requirements. You define your preferences by TV show or movie and Bazarr takes care of everything for you." /> + From eb47356d1017b5fc329cc85cbab06de069a43823 Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Sat, 21 Aug 2021 22:58:47 +0800 Subject: [PATCH 24/67] no log: Move Socket.IO to @modules/socketio --- frontend/src/{@socketio => @modules/socketio}/hooks.ts | 2 +- frontend/src/{@socketio => @modules/socketio}/index.ts | 4 ++-- frontend/src/{@socketio => @modules/socketio}/reducer.ts | 4 ++-- frontend/src/App/index.tsx | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) rename frontend/src/{@socketio => @modules/socketio}/hooks.ts (87%) rename frontend/src/{@socketio => @modules/socketio}/index.ts (96%) rename frontend/src/{@socketio => @modules/socketio}/reducer.ts (97%) diff --git a/frontend/src/@socketio/hooks.ts b/frontend/src/@modules/socketio/hooks.ts similarity index 87% rename from frontend/src/@socketio/hooks.ts rename to frontend/src/@modules/socketio/hooks.ts index 62f6ef1b3..ca550b5dc 100644 --- a/frontend/src/@socketio/hooks.ts +++ b/frontend/src/@modules/socketio/hooks.ts @@ -1,6 +1,6 @@ import { useEffect } from "react"; import Socketio from "."; -import { log } from "../utilites/logger"; +import { log } from "../../utilites/logger"; export function useSocketIOReducer(reducer: SocketIO.Reducer) { useEffect(() => { diff --git a/frontend/src/@socketio/index.ts b/frontend/src/@modules/socketio/index.ts similarity index 96% rename from frontend/src/@socketio/index.ts rename to frontend/src/@modules/socketio/index.ts index e0a6bec3b..fd571b7eb 100644 --- a/frontend/src/@socketio/index.ts +++ b/frontend/src/@modules/socketio/index.ts @@ -1,7 +1,7 @@ import { debounce, forIn, remove, uniq } from "lodash"; import { io, Socket } from "socket.io-client"; -import { getBaseUrl } from "../utilites"; -import { conditionalLog, log } from "../utilites/logger"; +import { getBaseUrl } from "../../utilites"; +import { conditionalLog, log } from "../../utilites/logger"; import { createDefaultReducer } from "./reducer"; class SocketIOClient { diff --git a/frontend/src/@socketio/reducer.ts b/frontend/src/@modules/socketio/reducer.ts similarity index 97% rename from frontend/src/@socketio/reducer.ts rename to frontend/src/@modules/socketio/reducer.ts index b13112abf..6aa684285 100644 --- a/frontend/src/@socketio/reducer.ts +++ b/frontend/src/@modules/socketio/reducer.ts @@ -22,8 +22,8 @@ import { systemMarkTasksDirty, systemUpdateAllSettings, systemUpdateLanguages, -} from "../@redux/actions"; -import reduxStore from "../@redux/store"; +} from "../../@redux/actions"; +import reduxStore from "../../@redux/store"; function bindReduxAction>(action: T) { return (...args: Parameters) => { diff --git a/frontend/src/App/index.tsx b/frontend/src/App/index.tsx index 97c5e054c..3cadff45c 100644 --- a/frontend/src/App/index.tsx +++ b/frontend/src/App/index.tsx @@ -10,11 +10,11 @@ import { Provider } from "react-redux"; import { Route, Switch } from "react-router"; import { BrowserRouter, Redirect } from "react-router-dom"; import { useEffectOnceWhen } from "rooks"; +import Socketio from "../@modules/socketio"; import { useReduxStore } from "../@redux/hooks/base"; import { useNotification } from "../@redux/hooks/site"; import store from "../@redux/store"; import "../@scss/index.scss"; -import Socketio from "../@socketio"; import { LoadingIndicator, ModalProvider } from "../components"; import Sidebar from "../Sidebar"; import Auth from "../special-pages/AuthPage"; From 9c8119df3b0781119592f06da76fe4a37f739989 Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Sun, 22 Aug 2021 00:44:52 +0800 Subject: [PATCH 25/67] Add background task support for UI. Let subtitle modification runs in background --- .../{@types => @modules/socketio}/socket.d.ts | 2 +- frontend/src/@modules/task/hooks.ts | 13 ++ frontend/src/@modules/task/index.ts | 62 +++++++++ frontend/src/@modules/task/task.d.ts | 14 ++ frontend/src/@modules/task/utilites.ts | 13 ++ frontend/src/@redux/actions/site.ts | 2 +- frontend/src/@redux/reducers/site.ts | 2 +- .../src/@types/{server.d.ts => site.d.ts} | 2 + frontend/src/App/Notification.tsx | 11 +- frontend/src/components/modals/BaseModal.tsx | 6 +- .../components/modals/SubtitleToolModal.tsx | 126 ++++-------------- frontend/src/components/modals/hooks.tsx | 36 +---- frontend/src/components/modals/provider.tsx | 44 +++++- 13 files changed, 189 insertions(+), 144 deletions(-) rename frontend/src/{@types => @modules/socketio}/socket.d.ts (97%) create mode 100644 frontend/src/@modules/task/hooks.ts create mode 100644 frontend/src/@modules/task/index.ts create mode 100644 frontend/src/@modules/task/task.d.ts create mode 100644 frontend/src/@modules/task/utilites.ts rename frontend/src/@types/{server.d.ts => site.d.ts} (91%) diff --git a/frontend/src/@types/socket.d.ts b/frontend/src/@modules/socketio/socket.d.ts similarity index 97% rename from frontend/src/@types/socket.d.ts rename to frontend/src/@modules/socketio/socket.d.ts index 10224bde3..77a1179cd 100644 --- a/frontend/src/@types/socket.d.ts +++ b/frontend/src/@modules/socketio/socket.d.ts @@ -57,6 +57,6 @@ declare namespace SocketIO { }; namespace CustomEvent { - type Progress = Server.Progress; + type Progress = Site.Progress; } } diff --git a/frontend/src/@modules/task/hooks.ts b/frontend/src/@modules/task/hooks.ts new file mode 100644 index 000000000..14fea2288 --- /dev/null +++ b/frontend/src/@modules/task/hooks.ts @@ -0,0 +1,13 @@ +import BGT from "./"; + +export function useIsAnyTaskRunning() { + return BGT.isRunning(); +} + +export function useIsGroupTaskRunning(groupName: string) { + return BGT.has(groupName); +} + +export function useIsIdRunning(groupName: string, id: number) { + return BGT.find(groupName, id); +} diff --git a/frontend/src/@modules/task/index.ts b/frontend/src/@modules/task/index.ts new file mode 100644 index 000000000..3df9c627d --- /dev/null +++ b/frontend/src/@modules/task/index.ts @@ -0,0 +1,62 @@ +import { keys } from "lodash"; +import { siteAddProgress, siteRemoveProgress } from "../../@redux/actions"; +import store from "../../@redux/store"; + +// A background task manager, use for dispatching task one by one +class BackgroundTask { + private groups: Task.Group; + constructor() { + this.groups = {}; + } + + dispatch(groupName: string, tasks: Task.Task[]) { + if (groupName in this.groups) { + return false; + } + + this.groups[groupName] = tasks; + setTimeout(async () => { + const dispatch = store.dispatch; + + for (let index = 0; index < tasks.length; index++) { + const task = tasks[index]; + + dispatch( + siteAddProgress([ + { + id: groupName, + header: groupName, + name: task.name, + value: index, + count: tasks.length, + }, + ]) + ); + try { + await task.callable(...task.parameters); + } catch (error) {} + } + delete this.groups[groupName]; + dispatch(siteRemoveProgress([groupName])); + }); + + return true; + } + + find(groupName: string, id: number) { + if (groupName in this.groups) { + return this.groups[groupName].find((v) => v.id === id) !== undefined; + } + return false; + } + + has(groupName: string) { + return groupName in this.groups; + } + + isRunning() { + return keys(this.groups).length > 0; + } +} + +export default new BackgroundTask(); diff --git a/frontend/src/@modules/task/task.d.ts b/frontend/src/@modules/task/task.d.ts new file mode 100644 index 000000000..a04061915 --- /dev/null +++ b/frontend/src/@modules/task/task.d.ts @@ -0,0 +1,14 @@ +declare namespace Task { + type Callable = (...args: any[]) => Promise; + + interface Task { + name: string; + id?: number; + callable: FN; + parameters: Parameters; + } + + type Group = { + [category: string]: Task.Task[]; + }; +} diff --git a/frontend/src/@modules/task/utilites.ts b/frontend/src/@modules/task/utilites.ts new file mode 100644 index 000000000..2898467c2 --- /dev/null +++ b/frontend/src/@modules/task/utilites.ts @@ -0,0 +1,13 @@ +export function createTask( + name: string, + id: number | undefined, + callable: T, + ...parameters: Parameters +): Task.Task { + return { + name, + id, + callable, + parameters, + }; +} diff --git a/frontend/src/@redux/actions/site.ts b/frontend/src/@redux/actions/site.ts index 89f89c0c7..ff2303ed0 100644 --- a/frontend/src/@redux/actions/site.ts +++ b/frontend/src/@redux/actions/site.ts @@ -28,7 +28,7 @@ export const siteRemoveNotifications = createAction( ); export const siteAddProgress = - createAction("site/progress/add"); + createAction("site/progress/add"); export const siteRemoveProgress = createAsyncThunk( "site/progress/remove", diff --git a/frontend/src/@redux/reducers/site.ts b/frontend/src/@redux/reducers/site.ts index 2cf860674..2388910e2 100644 --- a/frontend/src/@redux/reducers/site.ts +++ b/frontend/src/@redux/reducers/site.ts @@ -18,7 +18,7 @@ interface Site { // Initialization state or error message initialized: boolean | string; auth: boolean; - progress: Server.Progress[]; + progress: Site.Progress[]; notifications: Server.Notification[]; sidebar: string; badges: Badge; diff --git a/frontend/src/@types/server.d.ts b/frontend/src/@types/site.d.ts similarity index 91% rename from frontend/src/@types/server.d.ts rename to frontend/src/@types/site.d.ts index e2db5b185..a2182c8cd 100644 --- a/frontend/src/@types/server.d.ts +++ b/frontend/src/@types/site.d.ts @@ -5,7 +5,9 @@ declare namespace Server { message: string; timeout: number; } +} +declare namespace Site { interface Progress { id: string; header: string; diff --git a/frontend/src/App/Notification.tsx b/frontend/src/App/Notification.tsx index 8c62caa37..5a6745ce4 100644 --- a/frontend/src/App/Notification.tsx +++ b/frontend/src/App/Notification.tsx @@ -36,7 +36,7 @@ enum State { Failed, } -function useTotalProgress(progress: Server.Progress[]) { +function useTotalProgress(progress: Site.Progress[]) { return useMemo(() => { const { value, count } = progress.reduce( (prev, { value, count }) => { @@ -50,7 +50,7 @@ function useTotalProgress(progress: Server.Progress[]) { if (count === 0) { return 0; } else { - return value / count; + return (value + 0.001) / count; } }, [progress]); } @@ -196,13 +196,14 @@ const Notification: FunctionComponent = ({ ); }; -const Progress: FunctionComponent = ({ +const Progress: FunctionComponent = ({ name, value, count, header, }) => { const isCompleted = value / count > 1; + const displayValue = Math.min(count, value + 1); return (

@@ -214,9 +215,9 @@ const Progress: FunctionComponent = ({

); diff --git a/frontend/src/components/modals/BaseModal.tsx b/frontend/src/components/modals/BaseModal.tsx index c80681ba2..89021effb 100644 --- a/frontend/src/components/modals/BaseModal.tsx +++ b/frontend/src/components/modals/BaseModal.tsx @@ -23,9 +23,11 @@ export const BaseModal: FunctionComponent = (props) => { }, []); const exit = useCallback(() => { - closeModal(modalKey); + if (isShow) { + closeModal(modalKey); + } setExit(false); - }, [closeModal, modalKey]); + }, [closeModal, modalKey, isShow]); return ( ; - -// TODO: Extract this -interface StateIconProps { - state: State; -} - -const StateIcon: FunctionComponent = ({ state }) => { - let icon = faQuestionCircle; - switch (state) { - case State.Pending: - icon = faClock; - break; - case State.Processing: - icon = faCircleNotch; - break; - case State.Done: - icon = faCheck; - break; - } - return ( - - ); -}; - function getIdAndType(item: SupportType): [number, "episode" | "movie"] { if (isMovie(item)) { return [item.radarrId, "movie"]; @@ -328,51 +294,39 @@ const TranslateModal: FunctionComponent = ({ ); }; -interface STMProps {} +const TaskGroupName = "Modifying Subtitles"; -const STM: FunctionComponent = ({ ...props }) => { +const STM: FunctionComponent = ({ ...props }) => { const payload = useModalPayload(props.modalKey); - - const [updating, setUpdate] = useState(false); - const [processState, setProcessState] = useState({}); const [selections, setSelections] = useState([]); - const closeModal = useCloseModalIfCovered(); + const hasTask = useIsGroupTaskRunning(TaskGroupName); + + const closeModal = useCloseModal(); const process = useCallback( - async (action: string, override?: Partial) => { + (action: string, override?: Partial) => { log("info", "executing action", action); closeModal(props.modalKey); - setUpdate(true); - let states = selections.reduce( - (v, curr) => ({ [curr.path]: State.Pending, ...v }), - {} - ); - setProcessState(states); - - for (const raw of selections) { - states = { - ...states, - [raw.path]: State.Processing, - }; - setProcessState(states); + const tasks = selections.map((s) => { const form: FormType.ModifySubtitle = { - id: raw.id, - type: raw.type, - language: raw.language, - path: raw.path, + id: s.id, + type: s.type, + language: s.language, + path: s.path, ...override, }; - await SubtitlesApi.modify(action, form); + return createTask( + s.path, + s.id, + SubtitlesApi.modify.bind(SubtitlesApi), + action, + form + ); + }); - states = { - ...states, - [raw.path]: State.Done, - }; - setProcessState(states); - } - setUpdate(false); + BackgroundTask.dispatch(TaskGroupName, tasks); }, [closeModal, selections, props.modalKey] ); @@ -381,21 +335,6 @@ const STM: FunctionComponent = ({ ...props }) => { const columns: Column[] = useMemo[]>( () => [ - { - id: "state", - accessor: "path", - selectHide: true, - Cell: ({ value, loose }) => { - if (loose) { - const stateList = loose[0] as ProcessState; - if (value in stateList) { - const state = stateList[value]; - return ; - } - } - return null; - }, - }, { Header: "Language", accessor: "_language", @@ -459,15 +398,14 @@ const STM: FunctionComponent = ({ ...props }) => { k && process(k)}> process("sync")} > Sync = ({ ...props }) => { ), - [showModal, updating, selections.length, process] + [showModal, selections.length, process, hasTask] ); return ( - + diff --git a/frontend/src/components/modals/hooks.tsx b/frontend/src/components/modals/hooks.tsx index ce2c3010b..8cb762c9a 100644 --- a/frontend/src/components/modals/hooks.tsx +++ b/frontend/src/components/modals/hooks.tsx @@ -41,46 +41,16 @@ export function useShowModal() { export function useCloseModal() { const { - control: { pop, peek }, + control: { pop }, } = useContext(ModalContext); return useCallback( (key?: string) => { - const modal = peek(); - if (key) { - if (modal?.key === key) { - pop(); - } - } else { - pop(); - } + pop(key); }, - [pop, peek] + [pop] ); } -export function useCloseModalIfCovered() { - const { - control: { pop, peek }, - } = useContext(ModalContext); - return useCallback( - (key: string) => { - let modal = peek(); - if (modal && modal.key !== key) { - pop(); - } - }, - [pop, peek] - ); -} - -export function useModalIsCovered(key: string) { - const { modals } = useContext(ModalContext); - return useMemo(() => { - const idx = modals.findIndex((v) => v.key === key); - return idx !== -1 && idx !== 0; - }, [modals, key]); -} - export function useIsModalShow(key: string) { const { control: { peek }, diff --git a/frontend/src/components/modals/provider.tsx b/frontend/src/components/modals/provider.tsx index 2481b62bb..0681537da 100644 --- a/frontend/src/components/modals/provider.tsx +++ b/frontend/src/components/modals/provider.tsx @@ -1,5 +1,9 @@ -import React, { FunctionComponent, useMemo } from "react"; -import { useStackState } from "rooks"; +import React, { + FunctionComponent, + useCallback, + useMemo, + useState, +} from "react"; interface Modal { key: string; @@ -9,7 +13,7 @@ interface Modal { interface ModalControl { push: (modal: Modal) => void; peek: () => Modal | undefined; - pop: () => Modal | undefined; + pop: (key: string | undefined) => void; } interface ModalContextType { @@ -33,7 +37,39 @@ export const ModalContext = React.createContext({ }); const ModalProvider: FunctionComponent = ({ children }) => { - const [stack, { push, pop, peek }] = useStackState([]); + const [stack, setStack] = useState([]); + + const push = useCallback((model) => { + setStack((old) => { + return [...old, model]; + }); + }, []); + + const pop = useCallback((key) => { + setStack((old) => { + if (old.length === 0) { + return []; + } + + if (key === undefined) { + const newOld = old; + newOld.pop(); + return newOld; + } + + // find key + const index = old.findIndex((v) => v.key === key); + if (index !== -1) { + return old.slice(0, index); + } else { + return old; + } + }); + }, []); + + const peek = useCallback(() => { + return stack.length > 0 ? stack[stack.length - 1] : undefined; + }, [stack]); const context = useMemo( () => ({ modals: stack, control: { push, pop, peek } }), From 87123ab4c7874e218db9273ac2bcef8bfa26e3f6 Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Sun, 22 Aug 2021 01:08:39 +0800 Subject: [PATCH 26/67] Upload movie subtitles in background --- frontend/src/@modules/task/hooks.ts | 6 +- frontend/src/@modules/task/index.ts | 10 +++ frontend/src/Movies/Detail/index.tsx | 13 +++- frontend/src/Movies/index.tsx | 14 +++-- .../src/components/modals/ItemEditorModal.tsx | 53 ++++++++-------- .../components/modals/MovieUploadModal.tsx | 61 ++++++++++--------- 6 files changed, 92 insertions(+), 65 deletions(-) diff --git a/frontend/src/@modules/task/hooks.ts b/frontend/src/@modules/task/hooks.ts index 14fea2288..e2caf269c 100644 --- a/frontend/src/@modules/task/hooks.ts +++ b/frontend/src/@modules/task/hooks.ts @@ -4,10 +4,14 @@ export function useIsAnyTaskRunning() { return BGT.isRunning(); } +export function useIsAnyTaskRunningWithId(id: number) { + return BGT.hasId(id); +} + export function useIsGroupTaskRunning(groupName: string) { return BGT.has(groupName); } -export function useIsIdRunning(groupName: string, id: number) { +export function useIsGroupTaskRunningWithId(groupName: string, id: number) { return BGT.find(groupName, id); } diff --git a/frontend/src/@modules/task/index.ts b/frontend/src/@modules/task/index.ts index 3df9c627d..c58c66614 100644 --- a/frontend/src/@modules/task/index.ts +++ b/frontend/src/@modules/task/index.ts @@ -54,6 +54,16 @@ class BackgroundTask { return groupName in this.groups; } + hasId(id: number) { + for (const key in this.groups) { + const tasks = this.groups[key]; + if (tasks.find((v) => v.id === id) !== undefined) { + return true; + } + } + return false; + } + isRunning() { return keys(this.groups).length > 0; } diff --git a/frontend/src/Movies/Detail/index.tsx b/frontend/src/Movies/Detail/index.tsx index 5adf6265f..2ae3dc37f 100644 --- a/frontend/src/Movies/Detail/index.tsx +++ b/frontend/src/Movies/Detail/index.tsx @@ -11,6 +11,7 @@ import React, { FunctionComponent, useState } from "react"; import { Container, Row } from "react-bootstrap"; import { Helmet } from "react-helmet"; import { Redirect, RouteComponentProps, withRouter } from "react-router-dom"; +import { useIsGroupTaskRunningWithId } from "../../@modules/task/hooks"; import { useMovieBy, useProfileBy } from "../../@redux/hooks"; import { MoviesApi, ProvidersApi } from "../../apis"; import { @@ -23,6 +24,7 @@ import { useShowModal, } from "../../components"; import { ManualSearchModal } from "../../components/modals/ManualSearchModal"; +import { TaskGroupName } from "../../components/modals/MovieUploadModal"; import ItemOverview from "../../generic/ItemOverview"; import { RouterEmptyPath } from "../../special-pages/404"; import { useOnLoadedOnce } from "../../utilites"; @@ -57,6 +59,8 @@ const MovieDetailView: FunctionComponent = ({ match }) => { const [valid, setValid] = useState(true); + const hasTask = useIsGroupTaskRunningWithId(TaskGroupName, id); + useOnLoadedOnce(() => { if (movie.content === null) { setValid(false); @@ -82,6 +86,7 @@ const MovieDetailView: FunctionComponent = ({ match }) => { MoviesApi.action({ action: "scan-disk", radarrid: item.radarrId }) } @@ -90,7 +95,7 @@ const MovieDetailView: FunctionComponent = ({ match }) => { MoviesApi.action({ action: "search-missing", @@ -102,7 +107,7 @@ const MovieDetailView: FunctionComponent = ({ match }) => { showModal("manual-search", item)} > Manual @@ -115,6 +120,7 @@ const MovieDetailView: FunctionComponent = ({ match }) => { showModal("tools", [item])} > Tools @@ -123,7 +129,7 @@ const MovieDetailView: FunctionComponent = ({ match }) => { showModal("upload", item)} > @@ -131,6 +137,7 @@ const MovieDetailView: FunctionComponent = ({ match }) => { showModal("edit", item)} > Edit Movie diff --git a/frontend/src/Movies/index.tsx b/frontend/src/Movies/index.tsx index b6415e6e8..9b274b376 100644 --- a/frontend/src/Movies/index.tsx +++ b/frontend/src/Movies/index.tsx @@ -97,12 +97,14 @@ const MovieView: FunctionComponent = () => { { accessor: "radarrId", selectHide: true, - Cell: ({ row, externalUpdate }) => ( - externalUpdate && externalUpdate(row, "edit")} - > - ), + Cell: ({ row, value, externalUpdate }) => { + return ( + externalUpdate && externalUpdate(row, "edit")} + > + ); + }, }, ], [] diff --git a/frontend/src/components/modals/ItemEditorModal.tsx b/frontend/src/components/modals/ItemEditorModal.tsx index c32c5e247..eea6d7e1e 100644 --- a/frontend/src/components/modals/ItemEditorModal.tsx +++ b/frontend/src/components/modals/ItemEditorModal.tsx @@ -1,6 +1,7 @@ import React, { FunctionComponent, useMemo, useState } from "react"; import { Container, Form } from "react-bootstrap"; import { AsyncButton, Selector } from "../"; +import { useIsAnyTaskRunningWithId } from "../../@modules/task/hooks"; import { useLanguageProfiles } from "../../@redux/hooks"; import { GetItemId } from "../../utilites"; import BaseModal, { BaseModalProps } from "./BaseModal"; @@ -20,6 +21,9 @@ const Editor: FunctionComponent = (props) => { modal.modalKey ); + // TODO: Separate movies and series + const hasTask = useIsAnyTaskRunningWithId(payload ? GetItemId(payload) : -1); + const profileOptions = useMemo[]>( () => profiles?.map((v) => { @@ -31,31 +35,29 @@ const Editor: FunctionComponent = (props) => { const [updating, setUpdating] = useState(false); - const footer = useMemo( - () => ( - { - if (payload) { - const itemId = GetItemId(payload); - return submit({ - id: [itemId], - profileid: [id], - }); - } else { - return null; - } - }} - onSuccess={() => { - closeModal(); - onSuccess && payload && onSuccess(payload); - }} - > - Save - - ), - [closeModal, id, payload, onSuccess, submit] + const footer = ( + { + if (payload) { + const itemId = GetItemId(payload); + return submit({ + id: [itemId], + profileid: [id], + }); + } else { + return null; + } + }} + onSuccess={() => { + closeModal(); + onSuccess && payload && onSuccess(payload); + }} + > + Save + ); return ( @@ -81,6 +83,7 @@ const Editor: FunctionComponent = (props) => { Languages Profiles setId(v === undefined ? null : v)} diff --git a/frontend/src/components/modals/MovieUploadModal.tsx b/frontend/src/components/modals/MovieUploadModal.tsx index 1369c13c4..cebb7b925 100644 --- a/frontend/src/components/modals/MovieUploadModal.tsx +++ b/frontend/src/components/modals/MovieUploadModal.tsx @@ -1,6 +1,9 @@ import React, { FunctionComponent, useEffect, useMemo, useState } from "react"; -import { Container, Form } from "react-bootstrap"; -import { AsyncButton, FileForm, LanguageSelector } from ".."; +import { Button, Container, Form } from "react-bootstrap"; +import { FileForm, LanguageSelector } from ".."; +import BackgroundTask from "../../@modules/task"; +import { useIsGroupTaskRunning } from "../../@modules/task/hooks"; +import { createTask } from "../../@modules/task/utilites"; import { useEnabledLanguages, useLanguageBy, @@ -9,11 +12,10 @@ import { import { MoviesApi } from "../../apis"; import BaseModal, { BaseModalProps } from "./BaseModal"; import { useModalInformation } from "./hooks"; -interface MovieProps {} -const MovieUploadModal: FunctionComponent = ( - props -) => { +export const TaskGroupName = "Uploading Movie Subtitles..."; + +const MovieUploadModal: FunctionComponent = (props) => { const modal = props; const availableLanguages = useEnabledLanguages(); @@ -22,8 +24,6 @@ const MovieUploadModal: FunctionComponent = ( modal.modalKey ); - const [uploading, setUpload] = useState(false); - const [language, setLanguage] = useState>(null); const profile = useProfileBy(payload?.profileId); @@ -35,40 +35,41 @@ const MovieUploadModal: FunctionComponent = ( const [file, setFile] = useState>(null); const [forced, setForced] = useState(false); + const hasTask = useIsGroupTaskRunning(TaskGroupName); + const canUpload = useMemo(() => { - return file !== null && language?.code2; - }, [language, file]); + return file !== null && language?.code2 && !hasTask; + }, [language, file, hasTask]); const footer = ( - { + onClick={() => { if (file && payload && language) { - return MoviesApi.uploadSubtitles(payload.radarrId, { - file: file, - forced, - hi: false, - language: language.code2, - }); - } else { - return null; + const id = payload.radarrId; + const task = createTask( + file.name, + id, + MoviesApi.uploadSubtitles.bind(MoviesApi), + id, + { + file: file, + forced, + hi: false, + language: language.code2, + } + ); + BackgroundTask.dispatch(TaskGroupName, [task]); + closeModal(props.modalKey); } }} - onSuccess={() => closeModal()} > Upload - + ); return ( - +
From 1e50c515d81762bcd52e567900ad8ff6bc1a6f24 Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Sun, 22 Aug 2021 01:30:25 +0800 Subject: [PATCH 27/67] no log: Make background tasks can be extended dynamically --- frontend/src/@modules/task/index.ts | 23 ++++++++++++------- frontend/src/@redux/actions/site.ts | 5 ++++ frontend/src/@redux/reducers/site.ts | 8 +++++++ frontend/src/Movies/Detail/index.tsx | 12 +++++++++- .../components/modals/MovieUploadModal.tsx | 7 ++---- .../components/modals/SubtitleToolModal.tsx | 9 +++----- 6 files changed, 44 insertions(+), 20 deletions(-) diff --git a/frontend/src/@modules/task/index.ts b/frontend/src/@modules/task/index.ts index c58c66614..da27b412f 100644 --- a/frontend/src/@modules/task/index.ts +++ b/frontend/src/@modules/task/index.ts @@ -1,5 +1,9 @@ import { keys } from "lodash"; -import { siteAddProgress, siteRemoveProgress } from "../../@redux/actions"; +import { + siteAddProgress, + siteRemoveProgress, + siteUpdateProgressCount, +} from "../../@redux/actions"; import store from "../../@redux/store"; // A background task manager, use for dispatching task one by one @@ -11,17 +15,22 @@ class BackgroundTask { dispatch(groupName: string, tasks: Task.Task[]) { if (groupName in this.groups) { - return false; + this.groups[groupName].push(...tasks); + store.dispatch( + siteUpdateProgressCount({ + id: groupName, + count: this.groups[groupName].length, + }) + ); + return; } this.groups[groupName] = tasks; setTimeout(async () => { - const dispatch = store.dispatch; - for (let index = 0; index < tasks.length; index++) { const task = tasks[index]; - dispatch( + store.dispatch( siteAddProgress([ { id: groupName, @@ -37,10 +46,8 @@ class BackgroundTask { } catch (error) {} } delete this.groups[groupName]; - dispatch(siteRemoveProgress([groupName])); + store.dispatch(siteRemoveProgress([groupName])); }); - - return true; } find(groupName: string, id: number) { diff --git a/frontend/src/@redux/actions/site.ts b/frontend/src/@redux/actions/site.ts index ff2303ed0..52af91c3e 100644 --- a/frontend/src/@redux/actions/site.ts +++ b/frontend/src/@redux/actions/site.ts @@ -30,6 +30,11 @@ export const siteRemoveNotifications = createAction( export const siteAddProgress = createAction("site/progress/add"); +export const siteUpdateProgressCount = createAction<{ + id: string; + count: number; +}>("site/progress/update_count"); + export const siteRemoveProgress = createAsyncThunk( "site/progress/remove", async (ids: string[]) => { diff --git a/frontend/src/@redux/reducers/site.ts b/frontend/src/@redux/reducers/site.ts index 2388910e2..4c01a15f7 100644 --- a/frontend/src/@redux/reducers/site.ts +++ b/frontend/src/@redux/reducers/site.ts @@ -12,6 +12,7 @@ import { siteUpdateBadges, siteUpdateInitialization, siteUpdateOffline, + siteUpdateProgressCount, } from "../actions/site"; interface Site { @@ -90,6 +91,13 @@ const reducer = createReducer(defaultSite, (builder) => { }) .addCase(siteRemoveProgress.fulfilled, (state, action) => { pullAllWith(state.progress, action.payload, (l, r) => l.id === r); + }) + .addCase(siteUpdateProgressCount, (state, action) => { + const { id, count } = action.payload; + const progress = state.progress.find((v) => v.id === id); + if (progress) { + progress.count = count; + } }); builder diff --git a/frontend/src/Movies/Detail/index.tsx b/frontend/src/Movies/Detail/index.tsx index 2ae3dc37f..29774d95e 100644 --- a/frontend/src/Movies/Detail/index.tsx +++ b/frontend/src/Movies/Detail/index.tsx @@ -8,7 +8,7 @@ import { faWrench, } from "@fortawesome/free-solid-svg-icons"; import React, { FunctionComponent, useState } from "react"; -import { Container, Row } from "react-bootstrap"; +import { Alert, Container, Row } from "react-bootstrap"; import { Helmet } from "react-helmet"; import { Redirect, RouteComponentProps, withRouter } from "react-router-dom"; import { useIsGroupTaskRunningWithId } from "../../@modules/task/hooks"; @@ -144,6 +144,16 @@ const MovieDetailView: FunctionComponent = ({ match }) => { + + + A background task is running for this movie, actions are unavailable + + diff --git a/frontend/src/components/modals/MovieUploadModal.tsx b/frontend/src/components/modals/MovieUploadModal.tsx index cebb7b925..75cac7475 100644 --- a/frontend/src/components/modals/MovieUploadModal.tsx +++ b/frontend/src/components/modals/MovieUploadModal.tsx @@ -2,7 +2,6 @@ import React, { FunctionComponent, useEffect, useMemo, useState } from "react"; import { Button, Container, Form } from "react-bootstrap"; import { FileForm, LanguageSelector } from ".."; import BackgroundTask from "../../@modules/task"; -import { useIsGroupTaskRunning } from "../../@modules/task/hooks"; import { createTask } from "../../@modules/task/utilites"; import { useEnabledLanguages, @@ -35,11 +34,9 @@ const MovieUploadModal: FunctionComponent = (props) => { const [file, setFile] = useState>(null); const [forced, setForced] = useState(false); - const hasTask = useIsGroupTaskRunning(TaskGroupName); - const canUpload = useMemo(() => { - return file !== null && language?.code2 && !hasTask; - }, [language, file, hasTask]); + return file !== null && language?.code2; + }, [language, file]); const footer = ( ); }, }, ], - [onSelect, item] + [download, item] ); const content = useMemo(() => { @@ -225,12 +234,11 @@ export const ManualSearchModal: FunctionComponent = ( emptyText="No Result" columns={columns} data={result} - externalUpdate={onDownload} >
); } - }, [searchState, columns, result, search, item?.path, onDownload]); + }, [searchState, columns, result, search, item?.path]); const footer = useMemo( () => ( @@ -271,7 +279,7 @@ export const ManualSearchModal: FunctionComponent = ( {content} ); -}; +} const StateIcon: FunctionComponent<{ matches: string[]; dont: string[] }> = ({ matches, diff --git a/frontend/src/utilites/index.ts b/frontend/src/utilites/index.ts index 3689bdfc1..ddd009684 100644 --- a/frontend/src/utilites/index.ts +++ b/frontend/src/utilites/index.ts @@ -40,7 +40,7 @@ export function submodProcessColor(s: string) { return `color(name=${s})`; } -export function GetItemId(item: any): number { +export function GetItemId(item: T): number { if (isMovie(item)) { return item.radarrId; } else if (isEpisode(item)) { From 877368a4afb73578b91b29867cfb2599f8fdc21e Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Sun, 22 Aug 2021 18:32:11 +0800 Subject: [PATCH 34/67] no log: Group Series and Movies page to the same folder --- frontend/src/App/Router.tsx | 16 ++----- .../Episodes/components.tsx | 0 .../Episodes/index.tsx | 2 +- .../Episodes/table.tsx | 0 .../MovieDetail}/index.tsx | 2 +- .../MovieDetail}/table.tsx | 0 .../src/{ => DisplayItem}/Movies/index.tsx | 12 ++--- frontend/src/DisplayItem/Router.tsx | 45 +++++++++++++++++++ .../src/{ => DisplayItem}/Series/index.tsx | 12 ++--- .../generic/BaseItemView/index.tsx | 10 ++--- .../generic/BaseItemView/table.tsx | 10 ++--- .../generic/ItemOverview.tsx | 6 +-- .../{ => DisplayItem}/generic/blacklist.tsx | 2 +- frontend/src/History/Movies/index.tsx | 2 +- frontend/src/History/Series/index.tsx | 2 +- frontend/src/Movies/Router.tsx | 21 --------- frontend/src/Series/Router.tsx | 21 --------- .../src/components/modals/HistoryModal.tsx | 2 +- .../src/components/modals/ItemEditorModal.tsx | 4 +- 19 files changed, 81 insertions(+), 88 deletions(-) rename frontend/src/{Series => DisplayItem}/Episodes/components.tsx (100%) rename frontend/src/{Series => DisplayItem}/Episodes/index.tsx (98%) rename frontend/src/{Series => DisplayItem}/Episodes/table.tsx (100%) rename frontend/src/{Movies/Detail => DisplayItem/MovieDetail}/index.tsx (99%) rename frontend/src/{Movies/Detail => DisplayItem/MovieDetail}/table.tsx (100%) rename frontend/src/{ => DisplayItem}/Movies/index.tsx (90%) create mode 100644 frontend/src/DisplayItem/Router.tsx rename frontend/src/{ => DisplayItem}/Series/index.tsx (91%) rename frontend/src/{ => DisplayItem}/generic/BaseItemView/index.tsx (94%) rename frontend/src/{ => DisplayItem}/generic/BaseItemView/table.tsx (85%) rename frontend/src/{ => DisplayItem}/generic/ItemOverview.tsx (96%) rename frontend/src/{ => DisplayItem}/generic/blacklist.tsx (95%) delete mode 100644 frontend/src/Movies/Router.tsx delete mode 100644 frontend/src/Series/Router.tsx diff --git a/frontend/src/App/Router.tsx b/frontend/src/App/Router.tsx index 772311da2..ee520445a 100644 --- a/frontend/src/App/Router.tsx +++ b/frontend/src/App/Router.tsx @@ -3,9 +3,8 @@ import { Redirect, Route, Switch, useHistory } from "react-router-dom"; import { useDidMount } from "rooks"; import { useIsRadarrEnabled, useIsSonarrEnabled } from "../@redux/hooks/site"; import BlacklistRouter from "../Blacklist/Router"; +import DisplayItemRouter from "../DisplayItem/Router"; import HistoryRouter from "../History/Router"; -import MovieRouter from "../Movies/Router"; -import SeriesRouter from "../Series/Router"; import SettingRouter from "../Settings/Router"; import EmptyPage, { RouterEmptyPath } from "../special-pages/404"; import SystemRouter from "../System/Router"; @@ -40,16 +39,9 @@ const Router: FunctionComponent<{ className?: string }> = ({ className }) => { - {sonarr && ( - - - - )} - {radarr && ( - - - - )} + + + diff --git a/frontend/src/Series/Episodes/components.tsx b/frontend/src/DisplayItem/Episodes/components.tsx similarity index 100% rename from frontend/src/Series/Episodes/components.tsx rename to frontend/src/DisplayItem/Episodes/components.tsx diff --git a/frontend/src/Series/Episodes/index.tsx b/frontend/src/DisplayItem/Episodes/index.tsx similarity index 98% rename from frontend/src/Series/Episodes/index.tsx rename to frontend/src/DisplayItem/Episodes/index.tsx index 3e9ae4bfa..2938fa7a8 100644 --- a/frontend/src/Series/Episodes/index.tsx +++ b/frontend/src/DisplayItem/Episodes/index.tsx @@ -23,9 +23,9 @@ import { SeriesUploadModal, useShowModal, } from "../../components"; -import ItemOverview from "../../generic/ItemOverview"; import { RouterEmptyPath } from "../../special-pages/404"; import { useOnLoadedOnce } from "../../utilites"; +import ItemOverview from "../generic/ItemOverview"; import Table from "./table"; interface Params { diff --git a/frontend/src/Series/Episodes/table.tsx b/frontend/src/DisplayItem/Episodes/table.tsx similarity index 100% rename from frontend/src/Series/Episodes/table.tsx rename to frontend/src/DisplayItem/Episodes/table.tsx diff --git a/frontend/src/Movies/Detail/index.tsx b/frontend/src/DisplayItem/MovieDetail/index.tsx similarity index 99% rename from frontend/src/Movies/Detail/index.tsx rename to frontend/src/DisplayItem/MovieDetail/index.tsx index 9c6ff0445..a375953e7 100644 --- a/frontend/src/Movies/Detail/index.tsx +++ b/frontend/src/DisplayItem/MovieDetail/index.tsx @@ -26,9 +26,9 @@ import { useShowModal, } from "../../components"; import { ManualSearchModal } from "../../components/modals/ManualSearchModal"; -import ItemOverview from "../../generic/ItemOverview"; import { RouterEmptyPath } from "../../special-pages/404"; import { useOnLoadedOnce } from "../../utilites"; +import ItemOverview from "../generic/ItemOverview"; import Table from "./table"; const download = (item: Item.Movie, result: SearchResultType) => { diff --git a/frontend/src/Movies/Detail/table.tsx b/frontend/src/DisplayItem/MovieDetail/table.tsx similarity index 100% rename from frontend/src/Movies/Detail/table.tsx rename to frontend/src/DisplayItem/MovieDetail/table.tsx diff --git a/frontend/src/Movies/index.tsx b/frontend/src/DisplayItem/Movies/index.tsx similarity index 90% rename from frontend/src/Movies/index.tsx rename to frontend/src/DisplayItem/Movies/index.tsx index 9b274b376..d9c2fbe1f 100644 --- a/frontend/src/Movies/index.tsx +++ b/frontend/src/DisplayItem/Movies/index.tsx @@ -5,13 +5,13 @@ import React, { FunctionComponent, useMemo } from "react"; import { Badge } from "react-bootstrap"; import { Link } from "react-router-dom"; import { Column } from "react-table"; -import { movieUpdateAll, movieUpdateByRange } from "../@redux/actions"; -import { useMovieEntities } from "../@redux/hooks"; -import { useReduxAction } from "../@redux/hooks/base"; -import { MoviesApi } from "../apis"; -import { ActionBadge, LanguageText, TextPopover } from "../components"; +import { movieUpdateAll, movieUpdateByRange } from "../../@redux/actions"; +import { useMovieEntities } from "../../@redux/hooks"; +import { useReduxAction } from "../../@redux/hooks/base"; +import { MoviesApi } from "../../apis"; +import { ActionBadge, LanguageText, TextPopover } from "../../components"; +import { BuildKey } from "../../utilites"; import BaseItemView from "../generic/BaseItemView"; -import { BuildKey } from "../utilites"; interface Props {} diff --git a/frontend/src/DisplayItem/Router.tsx b/frontend/src/DisplayItem/Router.tsx new file mode 100644 index 000000000..1ab2c4f8a --- /dev/null +++ b/frontend/src/DisplayItem/Router.tsx @@ -0,0 +1,45 @@ +import React, { FunctionComponent } from "react"; +import { Redirect, Route, Switch } from "react-router-dom"; +import { useIsRadarrEnabled, useIsSonarrEnabled } from "../@redux/hooks"; +import { RouterEmptyPath } from "../special-pages/404"; +import Episodes from "./Episodes"; +import MovieDetail from "./MovieDetail"; +import Movies from "./Movies"; +import Series from "./Series"; + +interface Props {} + +const Router: FunctionComponent = () => { + const radarr = useIsRadarrEnabled(); + const sonarr = useIsSonarrEnabled(); + + return ( + + {radarr && ( + + + + )} + {radarr && ( + + + + )} + {sonarr && ( + + + + )} + {sonarr && ( + + + + )} + + + + + ); +}; + +export default Router; diff --git a/frontend/src/Series/index.tsx b/frontend/src/DisplayItem/Series/index.tsx similarity index 91% rename from frontend/src/Series/index.tsx rename to frontend/src/DisplayItem/Series/index.tsx index 4be74bc5a..81f37c021 100644 --- a/frontend/src/Series/index.tsx +++ b/frontend/src/DisplayItem/Series/index.tsx @@ -3,13 +3,13 @@ import React, { FunctionComponent, useMemo } from "react"; import { Badge, ProgressBar } from "react-bootstrap"; import { Link } from "react-router-dom"; import { Column } from "react-table"; -import { seriesUpdateAll, seriesUpdateByRange } from "../@redux/actions"; -import { useSerieEntities } from "../@redux/hooks"; -import { useReduxAction } from "../@redux/hooks/base"; -import { SeriesApi } from "../apis"; -import { ActionBadge } from "../components"; +import { seriesUpdateAll, seriesUpdateByRange } from "../../@redux/actions"; +import { useSerieEntities } from "../../@redux/hooks"; +import { useReduxAction } from "../../@redux/hooks/base"; +import { SeriesApi } from "../../apis"; +import { ActionBadge } from "../../components"; +import { BuildKey } from "../../utilites"; import BaseItemView from "../generic/BaseItemView"; -import { BuildKey } from "../utilites"; interface Props {} diff --git a/frontend/src/generic/BaseItemView/index.tsx b/frontend/src/DisplayItem/generic/BaseItemView/index.tsx similarity index 94% rename from frontend/src/generic/BaseItemView/index.tsx rename to frontend/src/DisplayItem/generic/BaseItemView/index.tsx index cc060d4a8..4925089a6 100644 --- a/frontend/src/generic/BaseItemView/index.tsx +++ b/frontend/src/DisplayItem/generic/BaseItemView/index.tsx @@ -5,11 +5,11 @@ import React, { useCallback, useMemo, useState } from "react"; import { Container, Dropdown, Row } from "react-bootstrap"; import { Helmet } from "react-helmet"; import { Column } from "react-table"; -import { useIsAnyTaskRunning } from "../../@modules/task/hooks"; -import { useLanguageProfiles } from "../../@redux/hooks"; -import { useAppDispatch } from "../../@redux/hooks/base"; -import { ContentHeader } from "../../components"; -import { GetItemId, isNonNullable } from "../../utilites"; +import { useIsAnyTaskRunning } from "../../../@modules/task/hooks"; +import { useLanguageProfiles } from "../../../@redux/hooks"; +import { useAppDispatch } from "../../../@redux/hooks/base"; +import { ContentHeader } from "../../../components"; +import { GetItemId, isNonNullable } from "../../../utilites"; import Table from "./table"; export interface SharedProps { diff --git a/frontend/src/generic/BaseItemView/table.tsx b/frontend/src/DisplayItem/generic/BaseItemView/table.tsx similarity index 85% rename from frontend/src/generic/BaseItemView/table.tsx rename to frontend/src/DisplayItem/generic/BaseItemView/table.tsx index 708515bdc..72c9f234b 100644 --- a/frontend/src/generic/BaseItemView/table.tsx +++ b/frontend/src/DisplayItem/generic/BaseItemView/table.tsx @@ -2,16 +2,16 @@ import { uniqBy } from "lodash"; import React, { useCallback, useMemo } from "react"; import { TableOptions, TableUpdater, useRowSelect } from "react-table"; import { SharedProps } from "."; -import { useLanguageProfiles } from "../../@redux/hooks"; +import { useLanguageProfiles } from "../../../@redux/hooks"; import { AsyncPageTable, ItemEditorModal, SimpleTable, useShowModal, -} from "../../components"; -import { TableStyleProps } from "../../components/tables/BaseTable"; -import { useCustomSelection } from "../../components/tables/plugins"; -import { GetItemId, useEntityToList } from "../../utilites"; +} from "../../../components"; +import { TableStyleProps } from "../../../components/tables/BaseTable"; +import { useCustomSelection } from "../../../components/tables/plugins"; +import { GetItemId, useEntityToList } from "../../../utilites"; interface Props extends SharedProps { dirtyItems: readonly T[]; diff --git a/frontend/src/generic/ItemOverview.tsx b/frontend/src/DisplayItem/generic/ItemOverview.tsx similarity index 96% rename from frontend/src/generic/ItemOverview.tsx rename to frontend/src/DisplayItem/generic/ItemOverview.tsx index 17d779c28..17c9db188 100644 --- a/frontend/src/generic/ItemOverview.tsx +++ b/frontend/src/DisplayItem/generic/ItemOverview.tsx @@ -22,9 +22,9 @@ import { Popover, Row, } from "react-bootstrap"; -import { useProfileBy, useProfileItemsToLanguages } from "../@redux/hooks"; -import { LanguageText } from "../components"; -import { BuildKey, isMovie } from "../utilites"; +import { useProfileBy, useProfileItemsToLanguages } from "../../@redux/hooks"; +import { LanguageText } from "../../components"; +import { BuildKey, isMovie } from "../../utilites"; interface Props { item: Item.Base; diff --git a/frontend/src/generic/blacklist.tsx b/frontend/src/DisplayItem/generic/blacklist.tsx similarity index 95% rename from frontend/src/generic/blacklist.tsx rename to frontend/src/DisplayItem/generic/blacklist.tsx index df33e3efe..6d39f55ae 100644 --- a/frontend/src/generic/blacklist.tsx +++ b/frontend/src/DisplayItem/generic/blacklist.tsx @@ -1,7 +1,7 @@ import { faFileExcel } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import React, { FunctionComponent } from "react"; -import { AsyncButton } from "../components"; +import { AsyncButton } from "../../components"; interface Props { history: History.Base; diff --git a/frontend/src/History/Movies/index.tsx b/frontend/src/History/Movies/index.tsx index 9a387ecae..6523e5f1c 100644 --- a/frontend/src/History/Movies/index.tsx +++ b/frontend/src/History/Movies/index.tsx @@ -9,7 +9,7 @@ import { useMoviesHistory } from "../../@redux/hooks"; import { useReduxAction } from "../../@redux/hooks/base"; import { MoviesApi } from "../../apis"; import { HistoryIcon, LanguageText, TextPopover } from "../../components"; -import { BlacklistButton } from "../../generic/blacklist"; +import { BlacklistButton } from "../../DisplayItem/generic/blacklist"; import HistoryGenericView from "../generic"; interface Props {} diff --git a/frontend/src/History/Series/index.tsx b/frontend/src/History/Series/index.tsx index e96c3e689..ab051fc2b 100644 --- a/frontend/src/History/Series/index.tsx +++ b/frontend/src/History/Series/index.tsx @@ -9,7 +9,7 @@ import { useSeriesHistory } from "../../@redux/hooks"; import { useReduxAction } from "../../@redux/hooks/base"; import { EpisodesApi } from "../../apis"; import { HistoryIcon, LanguageText, TextPopover } from "../../components"; -import { BlacklistButton } from "../../generic/blacklist"; +import { BlacklistButton } from "../../DisplayItem/generic/blacklist"; import HistoryGenericView from "../generic"; interface Props {} diff --git a/frontend/src/Movies/Router.tsx b/frontend/src/Movies/Router.tsx deleted file mode 100644 index 7ef168ea3..000000000 --- a/frontend/src/Movies/Router.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import React, { FunctionComponent } from "react"; -import { Route, Switch } from "react-router-dom"; -import Movie from "."; -import MovieDetail from "./Detail"; - -interface Props {} - -const Router: FunctionComponent = () => { - return ( - - - - - - - - - ); -}; - -export default Router; diff --git a/frontend/src/Series/Router.tsx b/frontend/src/Series/Router.tsx deleted file mode 100644 index bde7b89f7..000000000 --- a/frontend/src/Series/Router.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import React, { FunctionComponent } from "react"; -import { Route, Switch } from "react-router-dom"; -import Series from "."; -import Episodes from "./Episodes"; - -interface Props {} - -const Router: FunctionComponent = () => { - return ( - - - - - - - - - ); -}; - -export default Router; diff --git a/frontend/src/components/modals/HistoryModal.tsx b/frontend/src/components/modals/HistoryModal.tsx index 9e19d8295..04a35b980 100644 --- a/frontend/src/components/modals/HistoryModal.tsx +++ b/frontend/src/components/modals/HistoryModal.tsx @@ -3,7 +3,7 @@ import { Column } from "react-table"; import { useDidUpdate } from "rooks"; import { HistoryIcon, LanguageText, PageTable, TextPopover } from ".."; import { EpisodesApi, MoviesApi, useAsyncRequest } from "../../apis"; -import { BlacklistButton } from "../../generic/blacklist"; +import { BlacklistButton } from "../../DisplayItem/generic/blacklist"; import { AsyncOverlay } from "../async"; import BaseModal, { BaseModalProps } from "./BaseModal"; import { useModalPayload } from "./hooks"; diff --git a/frontend/src/components/modals/ItemEditorModal.tsx b/frontend/src/components/modals/ItemEditorModal.tsx index fddfac439..f178cf138 100644 --- a/frontend/src/components/modals/ItemEditorModal.tsx +++ b/frontend/src/components/modals/ItemEditorModal.tsx @@ -22,9 +22,7 @@ const Editor: FunctionComponent = (props) => { ); // TODO: Separate movies and series - const hasTask = useIsAnyTaskRunningWithId([ - payload ? GetItemId(payload) : -1, - ]); + const hasTask = useIsAnyTaskRunningWithId([GetItemId(payload ?? {})]); const profileOptions = useMemo[]>( () => From ea23c6acc906d3263562d4126a24ee5e3dbc4e73 Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Sun, 22 Aug 2021 19:51:48 +0800 Subject: [PATCH 35/67] no log: Fix a issue that cause notifier not update properly --- frontend/src/@redux/reducers/site.ts | 4 ++-- frontend/src/App/Notification.tsx | 4 ++-- frontend/src/DisplayItem/Episodes/index.tsx | 7 ++++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/frontend/src/@redux/reducers/site.ts b/frontend/src/@redux/reducers/site.ts index bf6bed9fb..8999f973d 100644 --- a/frontend/src/@redux/reducers/site.ts +++ b/frontend/src/@redux/reducers/site.ts @@ -37,7 +37,7 @@ const defaultSite: Site = { progress: [], notifier: { content: null, - timestamp: String(Date.now), + timestamp: String(Date.now()), }, notifications: [], sidebar: "", @@ -111,7 +111,7 @@ const reducer = createReducer(defaultSite, (builder) => { builder.addCase(siteUpdateNotifier, (state, action) => { state.notifier.content = action.payload; - state.notifier.timestamp = String(Date.now); + state.notifier.timestamp = String(Date.now()); }); builder diff --git a/frontend/src/App/Notification.tsx b/frontend/src/App/Notification.tsx index 9b9feabc5..8930a64f2 100644 --- a/frontend/src/App/Notification.tsx +++ b/frontend/src/App/Notification.tsx @@ -84,9 +84,9 @@ const NotificationCenter: FunctionComponent = () => { useEffect(() => { if (hasError) { setBtnState(State.Failed); - } else if (totalProgress > 0) { + } else if (totalProgress > 0 && totalProgress < 1.0) { setBtnState(State.Working); - } else if (totalProgress <= 0) { + } else { setBtnState(State.Idle); } }, [totalProgress, hasError]); diff --git a/frontend/src/DisplayItem/Episodes/index.tsx b/frontend/src/DisplayItem/Episodes/index.tsx index 2938fa7a8..8ac31e6c2 100644 --- a/frontend/src/DisplayItem/Episodes/index.tsx +++ b/frontend/src/DisplayItem/Episodes/index.tsx @@ -69,9 +69,10 @@ const SeriesEpisodesView: FunctionComponent = (props) => { const profile = useProfileBy(series.content?.profileId); - const hasTask = useIsAnyTaskRunningWithId( - episodes.content.map((v) => v.sonarrEpisodeId) - ); + const hasTask = useIsAnyTaskRunningWithId([ + ...episodes.content.map((v) => v.sonarrEpisodeId), + id, + ]); if (isNaN(id) || !valid) { return ; From f05daa8223d7b95e2f1c95d11a88558111ff512b Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Sun, 22 Aug 2021 20:03:36 +0800 Subject: [PATCH 36/67] no log: Remove loose object from all tables --- frontend/src/@types/react-table.d.ts | 3 +- frontend/src/DisplayItem/Episodes/table.tsx | 10 +++---- frontend/src/DisplayItem/Movies/index.tsx | 20 +++++-------- frontend/src/DisplayItem/Series/index.tsx | 19 +++++------- .../generic/BaseItemView/table.tsx | 6 +--- frontend/src/Settings/Languages/modal.tsx | 22 +++++++------- frontend/src/Settings/Languages/table.tsx | 8 ++--- .../src/Settings/components/pathMapper.tsx | 14 ++++----- frontend/src/System/Logs/table.tsx | 10 ++----- frontend/src/Wanted/Movies/index.tsx | 4 +-- frontend/src/Wanted/Series/index.tsx | 2 +- .../components/modals/SeriesUploadModal.tsx | 29 +++++++------------ 12 files changed, 61 insertions(+), 86 deletions(-) diff --git a/frontend/src/@types/react-table.d.ts b/frontend/src/@types/react-table.d.ts index 05bb31cf3..272639da3 100644 --- a/frontend/src/@types/react-table.d.ts +++ b/frontend/src/@types/react-table.d.ts @@ -51,8 +51,7 @@ declare module "react-table" { interface CustomTableProps> extends useSelectionProps { - externalUpdate?: TableUpdater; - loose?: any[]; + update?: TableUpdater; } interface CustomTableState> diff --git a/frontend/src/DisplayItem/Episodes/table.tsx b/frontend/src/DisplayItem/Episodes/table.tsx index a7dc02036..a10bc7084 100644 --- a/frontend/src/DisplayItem/Episodes/table.tsx +++ b/frontend/src/DisplayItem/Episodes/table.tsx @@ -147,28 +147,28 @@ const Table: FunctionComponent = ({ { Header: "Actions", accessor: "sonarrEpisodeId", - Cell: ({ row, externalUpdate }) => { + Cell: ({ row, update }) => { return ( { - externalUpdate && externalUpdate(row, "manual-search"); + update && update(row, "manual-search"); }} > { - externalUpdate && externalUpdate(row, "history"); + update && update(row, "history"); }} > { - externalUpdate && externalUpdate(row, "tools"); + update && update(row, "tools"); }} > @@ -206,7 +206,7 @@ const Table: FunctionComponent = ({ = () => { const movies = useMovieEntities(); const loader = useReduxAction(movieUpdateByRange); + const profiles = useLanguageProfiles(); + const columns: Column[] = useMemo[]>( () => [ { @@ -67,14 +69,8 @@ const MovieView: FunctionComponent = () => { { Header: "Languages Profile", accessor: "profileId", - Cell: ({ value, loose }) => { - if (loose) { - // Define in generic/BaseItemView/table.tsx - const profiles = loose[0] as Language.Profile[]; - return profiles.find((v) => v.profileId === value)?.name ?? null; - } else { - return null; - } + Cell: ({ value }) => { + return profiles?.find((v) => v.profileId === value)?.name ?? null; }, }, { @@ -97,17 +93,17 @@ const MovieView: FunctionComponent = () => { { accessor: "radarrId", selectHide: true, - Cell: ({ row, value, externalUpdate }) => { + Cell: ({ row, update }) => { return ( externalUpdate && externalUpdate(row, "edit")} + onClick={() => update && update(row, "edit")} > ); }, }, ], - [] + [profiles] ); return ( diff --git a/frontend/src/DisplayItem/Series/index.tsx b/frontend/src/DisplayItem/Series/index.tsx index 81f37c021..53d0da7e3 100644 --- a/frontend/src/DisplayItem/Series/index.tsx +++ b/frontend/src/DisplayItem/Series/index.tsx @@ -4,7 +4,7 @@ import { Badge, ProgressBar } from "react-bootstrap"; import { Link } from "react-router-dom"; import { Column } from "react-table"; import { seriesUpdateAll, seriesUpdateByRange } from "../../@redux/actions"; -import { useSerieEntities } from "../../@redux/hooks"; +import { useLanguageProfiles, useSerieEntities } from "../../@redux/hooks"; import { useReduxAction } from "../../@redux/hooks/base"; import { SeriesApi } from "../../apis"; import { ActionBadge } from "../../components"; @@ -16,6 +16,7 @@ interface Props {} const SeriesView: FunctionComponent = () => { const series = useSerieEntities(); const loader = useReduxAction(seriesUpdateByRange); + const profiles = useLanguageProfiles(); const columns: Column[] = useMemo[]>( () => [ { @@ -53,14 +54,8 @@ const SeriesView: FunctionComponent = () => { { Header: "Languages Profile", accessor: "profileId", - Cell: ({ value, loose }) => { - if (loose) { - // Define in generic/BaseItemView/table.tsx - const profiles = loose[0] as Language.Profile[]; - return profiles.find((v) => v.profileId === value)?.name ?? null; - } else { - return null; - } + Cell: ({ value }) => { + return profiles?.find((v) => v.profileId === value)?.name ?? null; }, }, { @@ -98,17 +93,17 @@ const SeriesView: FunctionComponent = () => { { accessor: "sonarrSeriesId", selectHide: true, - Cell: ({ row, externalUpdate }) => ( + Cell: ({ row, update }) => ( { - externalUpdate && externalUpdate(row, "edit"); + update && update(row, "edit"); }} > ), }, ], - [] + [profiles] ); return ( diff --git a/frontend/src/DisplayItem/generic/BaseItemView/table.tsx b/frontend/src/DisplayItem/generic/BaseItemView/table.tsx index 72c9f234b..a06b66a54 100644 --- a/frontend/src/DisplayItem/generic/BaseItemView/table.tsx +++ b/frontend/src/DisplayItem/generic/BaseItemView/table.tsx @@ -2,7 +2,6 @@ import { uniqBy } from "lodash"; import React, { useCallback, useMemo } from "react"; import { TableOptions, TableUpdater, useRowSelect } from "react-table"; import { SharedProps } from "."; -import { useLanguageProfiles } from "../../../@redux/hooks"; import { AsyncPageTable, ItemEditorModal, @@ -45,12 +44,9 @@ function Table({ [dirtyItems, orderList] ); - const profiles = useLanguageProfiles(); - const options: Partial & TableStyleProps> = { - loose: [profiles], emptyText: `No ${name} Found`, - externalUpdate: updateRow, + update: updateRow, }; return ( diff --git a/frontend/src/Settings/Languages/modal.tsx b/frontend/src/Settings/Languages/modal.tsx index d5aaf1f34..92854ef22 100644 --- a/frontend/src/Settings/Languages/modal.tsx +++ b/frontend/src/Settings/Languages/modal.tsx @@ -135,7 +135,7 @@ const LanguagesProfileModal: FunctionComponent = ( { Header: "Language", accessor: "language", - Cell: ({ value, row, externalUpdate }) => { + Cell: ({ value, row, update }) => { const code = value; const item = row.original; const lang = useMemo( @@ -150,7 +150,7 @@ const LanguagesProfileModal: FunctionComponent = ( onChange={(l) => { if (l) { item.language = l.code2; - externalUpdate && externalUpdate(row, item); + update && update(row, item); } }} > @@ -161,7 +161,7 @@ const LanguagesProfileModal: FunctionComponent = ( { Header: "Forced", accessor: "forced", - Cell: ({ row, value, externalUpdate }) => { + Cell: ({ row, value, update }) => { const item = row.original; return ( = ( checked={value === "True"} onChange={(v) => { item.forced = v.target.checked ? "True" : "False"; - externalUpdate && externalUpdate(row, item); + update && update(row, item); }} > ); @@ -179,7 +179,7 @@ const LanguagesProfileModal: FunctionComponent = ( { Header: "HI", accessor: "hi", - Cell: ({ row, value, externalUpdate }) => { + Cell: ({ row, value, update }) => { const item = row.original; return ( = ( checked={value === "True"} onChange={(v) => { item.hi = v.target.checked ? "True" : "False"; - externalUpdate && externalUpdate(row, item); + update && update(row, item); }} > ); @@ -197,7 +197,7 @@ const LanguagesProfileModal: FunctionComponent = ( { Header: "Exclude Audio", accessor: "audio_exclude", - Cell: ({ row, value, externalUpdate }) => { + Cell: ({ row, value, update }) => { const item = row.original; return ( = ( checked={value === "True"} onChange={(v) => { item.audio_exclude = v.target.checked ? "True" : "False"; - externalUpdate && externalUpdate(row, item); + update && update(row, item); }} > ); @@ -215,11 +215,11 @@ const LanguagesProfileModal: FunctionComponent = ( { id: "action", accessor: "id", - Cell: ({ row, externalUpdate }) => { + Cell: ({ row, update }) => { return ( externalUpdate && externalUpdate(row)} + onClick={() => update && update(row)} > ); }, @@ -245,7 +245,7 @@ const LanguagesProfileModal: FunctionComponent = ( responsive={false} columns={columns} data={current.items} - externalUpdate={updateRow} + update={updateRow} >
From a5ecd84605cd46e2feab87b6275879a3962d76fb Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Sun, 22 Aug 2021 21:59:48 +0800 Subject: [PATCH 37/67] Add support of uploading multiple movie subtitles at the same time --- .../components/modals/MovieUploadModal.tsx | 226 +++++++++++++----- .../components/modals/SeriesUploadModal.tsx | 42 +--- 2 files changed, 169 insertions(+), 99 deletions(-) diff --git a/frontend/src/components/modals/MovieUploadModal.tsx b/frontend/src/components/modals/MovieUploadModal.tsx index f93465836..37785aada 100644 --- a/frontend/src/components/modals/MovieUploadModal.tsx +++ b/frontend/src/components/modals/MovieUploadModal.tsx @@ -1,105 +1,199 @@ -import React, { FunctionComponent, useEffect, useMemo, useState } from "react"; +import { faTrash } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import React, { + FunctionComponent, + useCallback, + useMemo, + useState, +} from "react"; import { Button, Container, Form } from "react-bootstrap"; -import { FileForm, LanguageSelector } from ".."; +import { Column, Row } from "react-table"; import { dispatchTask } from "../../@modules/task"; import { createTask } from "../../@modules/task/utilites"; -import { - useEnabledLanguages, - useLanguageBy, - useProfileBy, -} from "../../@redux/hooks"; +import { useProfileBy, useProfileItemsToLanguages } from "../../@redux/hooks"; import { MoviesApi } from "../../apis"; +import { BuildKey } from "../../utilites"; +import { FileForm } from "../inputs"; +import { LanguageSelector } from "../LanguageSelector"; +import { SimpleTable } from "../tables"; import BaseModal, { BaseModalProps } from "./BaseModal"; import { useModalInformation } from "./hooks"; +interface PendingSubtitle { + file: File; + language: Language.Info; + forced: boolean; +} + export const TaskGroupName = "Uploading Subtitles..."; const MovieUploadModal: FunctionComponent = (props) => { const modal = props; - const availableLanguages = useEnabledLanguages(); - const { payload, closeModal } = useModalInformation( modal.modalKey ); - const [language, setLanguage] = useState>(null); - const profile = useProfileBy(payload?.profileId); - const defaultLanguage = useLanguageBy(profile?.items[0]?.language); + const availableLanguages = useProfileItemsToLanguages(profile); - useEffect(() => setLanguage(defaultLanguage ?? null), [defaultLanguage]); + const [pending, setPending] = useState([]); - const [file, setFile] = useState>(null); - const [forced, setForced] = useState(false); + const filelist = useMemo(() => pending.map((v) => v.file), [pending]); - const canUpload = useMemo(() => { - return file !== null && language?.code2; - }, [language, file]); + const setFiles = useCallback( + (files: File[]) => { + const list: PendingSubtitle[] = files.map((v) => ({ + file: v, + forced: availableLanguages[0].forced ?? false, + language: availableLanguages[0], + })); + setPending(list); + }, + [availableLanguages] + ); + + const upload = useCallback(() => { + if (payload === null || pending.length === 0) { + return; + } + + const { radarrId } = payload; + + const tasks = pending.map((v) => { + const { file, language, forced } = v; + + return createTask( + file.name, + radarrId, + MoviesApi.uploadSubtitles.bind(MoviesApi), + radarrId, + { + file: file, + forced, + hi: false, + language: language.code2, + } + ); + }); + + dispatchTask(TaskGroupName, tasks, "Uploading..."); + setFiles([]); + closeModal(); + }, [payload, closeModal, pending, setFiles]); + + const modify = useCallback( + (row: Row, info?: PendingSubtitle) => { + setPending((pd) => { + const newPending = [...pd]; + if (info) { + newPending[row.index] = info; + } else { + newPending.splice(row.index, 1); + } + return newPending; + }); + }, + [] + ); + + const columns = useMemo[]>( + () => [ + { + id: "name", + Header: "File", + accessor: (d) => d.file.name, + }, + { + Header: "Forced", + accessor: "forced", + Cell: ({ row, value, update }) => { + const { original, index } = row; + return ( + { + const newInfo = { ...row.original }; + newInfo.forced = v.target.checked; + update && update(row, newInfo); + }} + > + ); + }, + }, + { + Header: "Language", + accessor: "language", + className: "w-25", + Cell: ({ row, update, value }) => { + return ( + { + if (lang && update) { + const newInfo = { ...row.original }; + newInfo.language = lang; + update(row, newInfo); + } + }} + > + ); + }, + }, + { + accessor: "file", + Cell: ({ row, update }) => { + return ( + + ); + }, + }, + ], + [availableLanguages] + ); + + const canUpload = pending.length > 0; const footer = ( - ); return ( - +
- Language - { - if (lang) { - setLanguage(lang); - } - }} - > - - - Subtitle File { - setFile(list[0]); - }} + disabled={canUpload || availableLanguages.length === 0} + multiple + value={filelist} + onChange={setFiles} > - - setForced(e.target.checked)} - label="Forced" - > -
+
); diff --git a/frontend/src/components/modals/SeriesUploadModal.tsx b/frontend/src/components/modals/SeriesUploadModal.tsx index 7de4545fc..f0efa5a50 100644 --- a/frontend/src/components/modals/SeriesUploadModal.tsx +++ b/frontend/src/components/modals/SeriesUploadModal.tsx @@ -14,13 +14,7 @@ import React, { } from "react"; import { Button, Container, Form } from "react-bootstrap"; import { Column, TableUpdater } from "react-table"; -import { - AsyncButton, - FileForm, - LanguageSelector, - MessageIcon, - SimpleTable, -} from ".."; +import { FileForm, LanguageSelector, MessageIcon, SimpleTable } from ".."; import { dispatchTask } from "../../@modules/task"; import { createTask } from "../../@modules/task/utilites"; import { useProfileBy, useProfileItemsToLanguages } from "../../@redux/hooks"; @@ -53,8 +47,6 @@ const SeriesUploadModal: FunctionComponent = ({ modal.modalKey ); - const [uploading, setUpload] = useState(false); - const [pending, setPending] = useState([]); const profile = useProfileBy(payload?.profileId); @@ -119,7 +111,7 @@ const SeriesUploadModal: FunctionComponent = ({ [checkEpisodes] ); - const uploadSubtitles = useCallback(async () => { + const upload = useCallback(() => { if (payload === null || language === null) { return; } @@ -150,7 +142,9 @@ const SeriesUploadModal: FunctionComponent = ({ }); dispatchTask(TaskGroupName, tasks, "Uploading subtitles..."); - }, [payload, pending, language]); + setFiles([]); + closeModal(); + }, [payload, pending, language, closeModal, setFiles]); const canUpload = useMemo( () => @@ -234,7 +228,6 @@ const SeriesUploadModal: FunctionComponent = ({ return ( = ({ - { - closeModal(); - setFiles([]); - }} - > +
); return ( - +
From 8ae5e5483ec8c9a36d92bb08522a469cdc741da0 Mon Sep 17 00:00:00 2001 From: morpheus65535 Date: Sun, 22 Aug 2021 17:24:10 -0400 Subject: [PATCH 38/67] Improved Subscene provider with single season series. #1510 --- libs/subliminal_patch/providers/subscene.py | 47 +++++++-------------- 1 file changed, 15 insertions(+), 32 deletions(-) diff --git a/libs/subliminal_patch/providers/subscene.py b/libs/subliminal_patch/providers/subscene.py index 705df5fc9..ad3e3b748 100644 --- a/libs/subliminal_patch/providers/subscene.py +++ b/libs/subliminal_patch/providers/subscene.py @@ -29,7 +29,7 @@ from subliminal_patch.providers import Provider from subliminal_patch.providers.mixins import ProviderSubtitleArchiveMixin from subliminal_patch.subtitle import Subtitle, guess_matches from subliminal_patch.converters.subscene import language_ids, supported_languages -from subscene_api.subscene import search, Subtitle as APISubtitle, SITE_DOMAIN +from subscene_api.subscene import search, SearchTypes, Subtitle as APISubtitle, SITE_DOMAIN from subzero.language import Language p = inflect.engine() @@ -90,6 +90,10 @@ class SubsceneSubtitle(Subtitle): logger.debug("%r is a pack", self) self.is_pack = True + if "title" in guess and "year" in matches: + if video.series in guess['title']: + matches.add("series") + # movie else: guess = guessit(self.release_info, {'type': 'movie'}) @@ -312,47 +316,26 @@ class SubsceneProvider(Provider, ProviderSubtitleArchiveMixin): region.delete("subscene_cookies2") def query(self, video): - # vfn = get_video_filename(video) subtitles = [] - # logger.debug(u"Searching for: %s", vfn) - # film = search(vfn, session=self.session) - # - # if film and film.subtitles: - # logger.debug('Release results found: %s', len(film.subtitles)) - # subtitles = self.parse_results(video, film) - # else: - # logger.debug('No release results found') - - # time.sleep(self.search_throttle) - - # re-search for episodes without explicit release name if isinstance(video, Episode): titles = list(set([video.series] + video.alternative_series[:1])) - # term = u"%s S%02iE%02i" % (video.series, video.season, video.episode) more_than_one = len(titles) > 1 for series in titles: term = u"%s - %s Season" % (series, p.number_to_words("%sth" % video.season).capitalize()) - logger.debug('Searching for alternative results: %s', term) - film = self.do_search(term, session=self.session, release=False, throttle=self.search_throttle) + logger.debug('Searching with series and season: %s', term) + film = self.do_search(term, session=self.session, release=False, throttle=self.search_throttle, + limit_to=SearchTypes.TvSerie) + if not film and video.season == 1: + logger.debug('Searching with series name: %s', series) + film = self.do_search(series, session=self.session, release=False, throttle=self.search_throttle, + limit_to=SearchTypes.TvSerie) + if film and film.subtitles: - logger.debug('Alternative results found: %s', len(film.subtitles)) + logger.debug('Searching found: %s', len(film.subtitles)) subtitles += self.parse_results(video, film) else: - logger.debug('No alternative results found') + logger.debug('No results found') - # packs - # if video.season_fully_aired: - # term = u"%s S%02i" % (series, video.season) - # logger.debug('Searching for packs: %s', term) - # time.sleep(self.search_throttle) - # film = search(term, session=self.session, throttle=self.search_throttle) - # if film and film.subtitles: - # logger.debug('Pack results found: %s', len(film.subtitles)) - # subtitles += self.parse_results(video, film) - # else: - # logger.debug('No pack results found') - # else: - # logger.debug("Not searching for packs, because the season hasn't fully aired") if more_than_one: time.sleep(self.search_throttle) else: From 5ceb876171e14f8d5b9d85a21a394710f81fc76d Mon Sep 17 00:00:00 2001 From: morpheus65535 Date: Sun, 22 Aug 2021 22:43:38 -0400 Subject: [PATCH 39/67] Fixed Hebrew language translation issue. #1513 --- bazarr/utils.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/bazarr/utils.py b/bazarr/utils.py index 0a66b5a0c..a0f68bcff 100644 --- a/bazarr/utils.py +++ b/bazarr/utils.py @@ -429,6 +429,10 @@ def subtitles_apply_mods(language, subtitle_path, mods): def translate_subtitles_file(video_path, source_srt_file, to_lang, forced, hi): + language_code_convert_dict = { + 'he': 'iw', + } + to_lang = alpha3_from_alpha2(to_lang) lang_obj = Language(to_lang) if forced: @@ -464,7 +468,9 @@ def translate_subtitles_file(video_path, source_srt_file, to_lang, forced, hi): for block_str in lines_block_list: try: translated_partial_srt_text = GoogleTranslator(source='auto', - target=lang_obj.basename).translate(text=block_str) + target=language_code_convert_dict.get(lang_obj.basename, + lang_obj.basename) + ).translate(text=block_str) except: return False else: From 1f3e499f3db42d15436be604934770ed21e62548 Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Mon, 23 Aug 2021 11:35:04 +0800 Subject: [PATCH 40/67] Improve performance of Web UI --- frontend/src/@modules/task/index.ts | 4 +- frontend/src/DisplayItem/Episodes/index.tsx | 3 +- .../src/DisplayItem/MovieDetail/index.tsx | 2 +- .../generic/BaseItemView/index.tsx | 11 ++--- frontend/src/History/Statistics/index.tsx | 45 ++++++++++--------- frontend/src/apis/hooks.ts | 19 ++++---- .../src/components/ContentHeader/Button.tsx | 10 +++-- frontend/src/components/async.tsx | 8 ++-- frontend/src/components/inputs/Chips.tsx | 33 ++++++++------ .../src/components/modals/HistoryModal.tsx | 10 ++--- 10 files changed, 80 insertions(+), 65 deletions(-) diff --git a/frontend/src/@modules/task/index.ts b/frontend/src/@modules/task/index.ts index 72c0ec8e0..aee555b0d 100644 --- a/frontend/src/@modules/task/index.ts +++ b/frontend/src/@modules/task/index.ts @@ -44,7 +44,9 @@ class BackgroundTask { ); try { await task.callable(...task.parameters); - } catch (error) {} + } catch (error) { + // TODO + } } delete this.groups[groupName]; store.dispatch(siteRemoveProgress([groupName])); diff --git a/frontend/src/DisplayItem/Episodes/index.tsx b/frontend/src/DisplayItem/Episodes/index.tsx index 8ac31e6c2..bda4f7cdc 100644 --- a/frontend/src/DisplayItem/Episodes/index.tsx +++ b/frontend/src/DisplayItem/Episodes/index.tsx @@ -124,8 +124,7 @@ const SeriesEpisodesView: FunctionComponent = (props) => { disabled={ serie.episodeFileCount === 0 || serie.profileId === null || - !available || - hasTask + !available } > Search diff --git a/frontend/src/DisplayItem/MovieDetail/index.tsx b/frontend/src/DisplayItem/MovieDetail/index.tsx index a375953e7..9faff4fa3 100644 --- a/frontend/src/DisplayItem/MovieDetail/index.tsx +++ b/frontend/src/DisplayItem/MovieDetail/index.tsx @@ -101,7 +101,7 @@ const MovieDetailView: FunctionComponent = ({ match }) => { { const task = createTask( item.title, diff --git a/frontend/src/DisplayItem/generic/BaseItemView/index.tsx b/frontend/src/DisplayItem/generic/BaseItemView/index.tsx index 4925089a6..330295cc5 100644 --- a/frontend/src/DisplayItem/generic/BaseItemView/index.tsx +++ b/frontend/src/DisplayItem/generic/BaseItemView/index.tsx @@ -77,10 +77,11 @@ function BaseItemView({ item.profileId = id; return item; }); - const newDirty = uniqBy([...newItems, ...dirtyItems], GetItemId); - setDirty(newDirty); + setDirty((dirty) => { + return uniqBy([...newItems, ...dirty], GetItemId); + }); }, - [selections, dirtyItems] + [selections] ); const startEdit = useCallback(() => { @@ -99,7 +100,7 @@ function BaseItemView({ setSelections([]); }, []); - const saveItems = useCallback(() => { + const save = useCallback(() => { const form: FormType.ModifyItem = { id: [], profileid: [], @@ -140,7 +141,7 @@ function BaseItemView({ Save diff --git a/frontend/src/History/Statistics/index.tsx b/frontend/src/History/Statistics/index.tsx index f3444f6cd..a8474ad6b 100644 --- a/frontend/src/History/Statistics/index.tsx +++ b/frontend/src/History/Statistics/index.tsx @@ -1,5 +1,10 @@ import { merge } from "lodash"; -import React, { FunctionComponent, useCallback, useState } from "react"; +import React, { + FunctionComponent, + useCallback, + useEffect, + useState, +} from "react"; import { Col, Container } from "react-bootstrap"; import { Helmet } from "react-helmet"; import { @@ -20,10 +25,10 @@ import { useAsyncRequest, } from "../../apis"; import { + AsyncOverlay, AsyncSelector, ContentHeader, LanguageSelector, - PromiseOverlay, Selector, } from "../../components"; import { actionOptions, timeframeOptions } from "./options"; @@ -51,17 +56,16 @@ const SelectorContainer: FunctionComponent = ({ children }) => ( const HistoryStats: FunctionComponent = () => { const [languages, updateLanguages] = useAsyncRequest( - SystemApi.languages.bind(SystemApi), - [] + SystemApi.languages.bind(SystemApi) ); const [providerList, updateProviderParam] = useAsyncRequest( - ProvidersApi.providers.bind(ProvidersApi), - [] + ProvidersApi.providers.bind(ProvidersApi) ); - const updateProvider = useCallback(() => updateProviderParam(true), [ - updateProviderParam, - ]); + const updateProvider = useCallback( + () => updateProviderParam(true), + [updateProviderParam] + ); useDidMount(() => { updateLanguages(true); @@ -72,14 +76,11 @@ const HistoryStats: FunctionComponent = () => { const [lang, setLanguage] = useState>(null); const [provider, setProvider] = useState>(null); - const promise = useCallback(() => { - return HistoryApi.stats( - timeframe, - action ?? undefined, - provider?.name, - lang?.code2 - ); - }, [timeframe, lang?.code2, action, provider]); + const [stats, update] = useAsyncRequest(HistoryApi.stats.bind(HistoryApi)); + + useEffect(() => { + update(timeframe, action ?? undefined, provider?.name, lang?.code2); + }, [timeframe, action, provider?.name, lang?.code2, update]); return ( // TODO: Responsive @@ -87,8 +88,8 @@ const HistoryStats: FunctionComponent = () => { History Statistics - Bazarr - - {(data) => ( + + {({ content }) => ( @@ -121,14 +122,14 @@ const HistoryStats: FunctionComponent = () => { - + @@ -140,7 +141,7 @@ const HistoryStats: FunctionComponent = () => { )} - + ); }; diff --git a/frontend/src/apis/hooks.ts b/frontend/src/apis/hooks.ts index 8b6a17788..084efb63f 100644 --- a/frontend/src/apis/hooks.ts +++ b/frontend/src/apis/hooks.ts @@ -1,27 +1,30 @@ -import { useCallback, useState } from "react"; +import { useCallback, useRef, useState } from "react"; type Request = (...args: any[]) => Promise; type Return = PromiseType>; export function useAsyncRequest( - request: F, - initial: Return -): [Async.Base>, (...args: Parameters) => void] { - const [state, setState] = useState>>({ + request: F +): [Async.Item>, (...args: Parameters) => void] { + const [state, setState] = useState>>({ state: "uninitialized", - content: initial, + content: null, error: null, }); + + const requestRef = useRef(request); + const update = useCallback( (...args: Parameters) => { setState((s) => ({ ...s, state: "loading" })); - request(...args) + requestRef + .current(...args) .then((res) => setState({ state: "succeeded", content: res, error: null }) ) .catch((error) => setState((s) => ({ ...s, state: "failed", error }))); }, - [request] + [requestRef] ); return [state, update]; diff --git a/frontend/src/components/ContentHeader/Button.tsx b/frontend/src/components/ContentHeader/Button.tsx index fa0480689..7036de021 100644 --- a/frontend/src/components/ContentHeader/Button.tsx +++ b/frontend/src/components/ContentHeader/Button.tsx @@ -6,6 +6,7 @@ import React, { MouseEvent, PropsWithChildren, useCallback, + useRef, useState, } from "react"; import { Button } from "react-bootstrap"; @@ -58,13 +59,16 @@ export function ContentHeaderAsyncButton Promise>( const [updating, setUpdate] = useState(false); + const promiseRef = useRef(promise); + const successRef = useRef(onSuccess); + const click = useCallback(() => { setUpdate(true); - promise().then((val) => { + promiseRef.current().then((val) => { setUpdate(false); - onSuccess && onSuccess(val); + successRef.current && successRef.current(val); }); - }, [onSuccess, promise]); + }, [successRef, promiseRef]); return ( ({ promise, children }: PromiseProps) { } } -type AsyncSelectorProps> = { +type AsyncSelectorProps> = { state: T; update: () => void; label: (item: V) => string; @@ -71,17 +71,17 @@ type RemovedSelectorProps = Omit< export function AsyncSelector< V, - T extends Async.Base, + T extends Async.Item, M extends boolean = false >(props: Override, RemovedSelectorProps>) { const { label, state, update, ...selector } = props; const options = useMemo[]>( () => - state.content.map((v) => ({ + state.content?.map((v) => ({ label: label(v), value: v, - })), + })) ?? [], [state, label] ); diff --git a/frontend/src/components/inputs/Chips.tsx b/frontend/src/components/inputs/Chips.tsx index fc9231f7a..862d020c4 100644 --- a/frontend/src/components/inputs/Chips.tsx +++ b/frontend/src/components/inputs/Chips.tsx @@ -26,27 +26,34 @@ export const Chips: FunctionComponent = ({ const input = useRef(null); + const changeRef = useRef(onChange); + const addChip = useCallback( (value: string) => { - const newChips = [...chips]; - newChips.push(value); - setChips(newChips); - onChange && onChange(newChips); + setChips((cp) => { + const newChips = [...cp, value]; + changeRef.current && changeRef.current(newChips); + return newChips; + }); }, - [chips, onChange] + [changeRef] ); const removeChip = useCallback( (idx?: number) => { - idx = idx ?? chips.length - 1; - if (idx !== -1) { - const newChips = [...chips]; - newChips.splice(idx, 1); - setChips(newChips); - onChange && onChange(newChips); - } + setChips((cp) => { + const index = idx ?? cp.length - 1; + if (index !== -1) { + const newChips = [...cp]; + newChips.splice(index, 1); + changeRef.current && changeRef.current(newChips); + return newChips; + } else { + return cp; + } + }); }, - [chips, onChange] + [changeRef] ); const clearInput = useCallback(() => { diff --git a/frontend/src/components/modals/HistoryModal.tsx b/frontend/src/components/modals/HistoryModal.tsx index 04a35b980..6a95547f3 100644 --- a/frontend/src/components/modals/HistoryModal.tsx +++ b/frontend/src/components/modals/HistoryModal.tsx @@ -14,8 +14,7 @@ export const MovieHistoryModal: FunctionComponent = (props) => { const movie = useModalPayload(modal.modalKey); const [history, updateHistory] = useAsyncRequest( - MoviesApi.historyBy.bind(MoviesApi), - { data: [], total: 0 } + MoviesApi.historyBy.bind(MoviesApi) ); const update = useCallback(() => { @@ -98,7 +97,7 @@ export const MovieHistoryModal: FunctionComponent = (props) => { )} @@ -114,8 +113,7 @@ export const EpisodeHistoryModal: FunctionComponent< const episode = useModalPayload(props.modalKey); const [history, updateHistory] = useAsyncRequest( - EpisodesApi.historyBy.bind(EpisodesApi), - { data: [], total: 0 } + EpisodesApi.historyBy.bind(EpisodesApi) ); const update = useCallback(() => { @@ -199,7 +197,7 @@ export const EpisodeHistoryModal: FunctionComponent< )} From e940fbb16ddc9089c754a113989c1ac0ec466e4f Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Mon, 23 Aug 2021 11:40:19 +0800 Subject: [PATCH 41/67] no log: Fix issues --- frontend/src/DisplayItem/MovieDetail/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/DisplayItem/MovieDetail/index.tsx b/frontend/src/DisplayItem/MovieDetail/index.tsx index 9faff4fa3..86dd7b44f 100644 --- a/frontend/src/DisplayItem/MovieDetail/index.tsx +++ b/frontend/src/DisplayItem/MovieDetail/index.tsx @@ -170,7 +170,7 @@ const MovieDetailView: FunctionComponent = ({ match }) => { -
+
Date: Mon, 23 Aug 2021 19:58:59 -0400 Subject: [PATCH 42/67] Fixed Yavka provider. #1514 --- libs/subliminal_patch/providers/yavkanet.py | 75 +++++++++++++++------ 1 file changed, 53 insertions(+), 22 deletions(-) diff --git a/libs/subliminal_patch/providers/yavkanet.py b/libs/subliminal_patch/providers/yavkanet.py index 9be512491..e8b67e827 100644 --- a/libs/subliminal_patch/providers/yavkanet.py +++ b/libs/subliminal_patch/providers/yavkanet.py @@ -5,6 +5,7 @@ import re import io import os import codecs +import time from hashlib import sha1 from random import randint from bs4 import BeautifulSoup @@ -40,12 +41,11 @@ def fix_movie_naming(title): }, True) - class YavkaNetSubtitle(Subtitle): """YavkaNet Subtitle.""" provider_name = 'yavkanet' - def __init__(self, language, filename, type, video, link, fps): + def __init__(self, language, filename, type, video, link, fps, subs_id): super(YavkaNetSubtitle, self).__init__(language) self.filename = filename self.page_link = link @@ -53,6 +53,9 @@ class YavkaNetSubtitle(Subtitle): self.video = video self.fps = fps self.release_info = filename + self.subs_id = subs_id + self.content = None + self._is_valid = False if fps: if video.fps and float(video.fps) == fps: self.release_info += " [{:.3f}]".format(fps) @@ -67,8 +70,6 @@ class YavkaNetSubtitle(Subtitle): return self.fps def make_picklable(self): - self.content = None - self._is_valid = False return self def get_matches(self, video): @@ -133,7 +134,7 @@ class YavkaNetProvider(Provider): params['y'] = video.year params['s'] = sanitize(fix_movie_naming(video.title), {'\''}) - if language == 'en' or language == 'eng': + if language == 'en' or language == 'eng': params['l'] = 'EN' elif language == 'ru' or language == 'rus': params['l'] = 'RU' @@ -143,10 +144,10 @@ class YavkaNetProvider(Provider): params['l'] = 'IT' logger.info('Searching subtitle %r', params) - response = self.session.get('https://yavka.net/subtitles.php', params=params, allow_redirects=False, timeout=10, headers={ - 'Referer': 'https://yavka.net/', - }) - + response = self.retry(self.session.get('https://yavka.net/subtitles.php', params=params, allow_redirects=False, + timeout=10, headers={'Referer': 'https://yavka.net/'})) + if not response: + return subtitles response.raise_for_status() if response.status_code != 200: @@ -177,7 +178,19 @@ class YavkaNetProvider(Provider): element = row.find('a', {'class': 'click'}) uploader = element.get_text() if element else None logger.info('Found subtitle link %r', link) - sub = self.download_archive_and_add_subtitle_files('https://yavka.net' + link + '/', language, video, fps) + # slow down to prevent being throttled + time.sleep(1) + response = self.retry(self.session.get('https://yavka.net' + link)) + if not response: + continue + soup = BeautifulSoup(response.content, 'lxml') + subs_id = soup.find("input", {"name": "id"}) + if subs_id: + subs_id = subs_id['value'] + else: + continue + sub = self.download_archive_and_add_subtitle_files('https://yavka.net' + link + '/', language, video, + fps, subs_id) for s in sub: s.title = title s.notes = notes @@ -188,7 +201,7 @@ class YavkaNetProvider(Provider): return subtitles def list_subtitles(self, video, languages): - return [s for l in languages for s in self.query(l, video)] + return [s for lang in languages for s in self.query(lang, video)] def download_subtitle(self, subtitle): if subtitle.content: @@ -196,30 +209,37 @@ class YavkaNetProvider(Provider): else: seeking_subtitle_file = subtitle.filename arch = self.download_archive_and_add_subtitle_files(subtitle.page_link, subtitle.language, subtitle.video, - subtitle.fps) + subtitle.fps, subtitle.subs_id) for s in arch: if s.filename == seeking_subtitle_file: subtitle.content = s.content - def process_archive_subtitle_files(self, archiveStream, language, video, link, fps): + @staticmethod + def process_archive_subtitle_files(archive_stream, language, video, link, fps, subs_id): subtitles = [] - type = 'episode' if isinstance(video, Episode) else 'movie' - for file_name in archiveStream.namelist(): + media_type = 'episode' if isinstance(video, Episode) else 'movie' + for file_name in archive_stream.namelist(): if file_name.lower().endswith(('.srt', '.sub')): logger.info('Found subtitle file %r', file_name) - subtitle = YavkaNetSubtitle(language, file_name, type, video, link, fps) - subtitle.content = fix_line_ending(archiveStream.read(file_name)) + subtitle = YavkaNetSubtitle(language, file_name, media_type, video, link, fps, subs_id) + subtitle.content = fix_line_ending(archive_stream.read(file_name)) subtitles.append(subtitle) return subtitles - def download_archive_and_add_subtitle_files(self, link, language, video, fps): + def download_archive_and_add_subtitle_files(self, link, language, video, fps, subs_id): logger.info('Downloading subtitle %r', link) cache_key = sha1(link.encode("utf-8")).digest() request = region.get(cache_key) if request is NO_VALUE: - request = self.session.post(link, headers={ + time.sleep(1) + request = self.retry(self.session.post(link, data={ + 'id': subs_id, + 'lng': language.basename.upper() + }, headers={ 'referer': link - }) + }, allow_redirects=False)) + if not request: + return [] request.raise_for_status() region.set(cache_key, request) else: @@ -228,12 +248,23 @@ class YavkaNetProvider(Provider): try: archive_stream = io.BytesIO(request.content) if is_rarfile(archive_stream): - return self.process_archive_subtitle_files(RarFile(archive_stream), language, video, link, fps) + return self.process_archive_subtitle_files(RarFile(archive_stream), language, video, link, fps, subs_id) elif is_zipfile(archive_stream): - return self.process_archive_subtitle_files(ZipFile(archive_stream), language, video, link, fps) + return self.process_archive_subtitle_files(ZipFile(archive_stream), language, video, link, fps, subs_id) except: pass logger.error('Ignore unsupported archive %r', request.headers) region.delete(cache_key) return [] + + @staticmethod + def retry(func, limit=5, delay=5): + for i in range(limit): + response = func + if response.content: + return response + else: + logging.debug('Slowing down because we are getting throttled. Iteration {0} of {1}.Waiting {2} seconds ' + 'to retry...'.format(i + 1, limit, delay)) + time.sleep(delay) From 81507b9e750228de6d52cb3f7cbd631ecfac3713 Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Tue, 24 Aug 2021 09:31:47 +0800 Subject: [PATCH 43/67] Add a dialog before closing the page to inform user when there're still background tasks running --- frontend/src/@modules/task/index.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/frontend/src/@modules/task/index.ts b/frontend/src/@modules/task/index.ts index aee555b0d..02483e990 100644 --- a/frontend/src/@modules/task/index.ts +++ b/frontend/src/@modules/task/index.ts @@ -12,6 +12,17 @@ class BackgroundTask { private groups: Task.Group; constructor() { this.groups = {}; + window.addEventListener("beforeunload", this.onBeforeUnload.bind(this)); + } + + private onBeforeUnload(e: BeforeUnloadEvent) { + const message = "Background tasks are still running"; + if (Object.keys(this.groups).length !== 0) { + e.preventDefault(); + e.returnValue = message; + return; + } + delete e["returnValue"]; } dispatch(groupName: string, tasks: Task.Task[]) { From 89d95080d0e29c8b58b0c7f96accb01b4569c691 Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Tue, 24 Aug 2021 09:31:47 +0800 Subject: [PATCH 44/67] no log: Fix typos --- frontend/src/@modules/socketio/hooks.ts | 2 +- frontend/src/@modules/socketio/index.ts | 4 ++-- .../src/@modules/task/{utilites.ts => utilities.ts} | 0 frontend/src/@redux/actions/site.ts | 2 +- frontend/src/@redux/hooks/async.ts | 2 +- frontend/src/@redux/hooks/movies.ts | 2 +- frontend/src/@redux/hooks/series.ts | 2 +- frontend/src/@redux/utils/factory.ts | 2 +- frontend/src/App/Header.tsx | 2 +- frontend/src/App/Notification.tsx | 2 +- frontend/src/App/Router.tsx | 2 +- frontend/src/App/index.tsx | 2 +- frontend/src/DisplayItem/Episodes/index.tsx | 4 ++-- frontend/src/DisplayItem/Episodes/table.tsx | 2 +- frontend/src/DisplayItem/MovieDetail/index.tsx | 4 ++-- frontend/src/DisplayItem/MovieDetail/table.tsx | 2 +- frontend/src/DisplayItem/Movies/index.tsx | 2 +- frontend/src/DisplayItem/Series/index.tsx | 2 +- .../src/DisplayItem/generic/BaseItemView/index.tsx | 2 +- .../src/DisplayItem/generic/BaseItemView/table.tsx | 2 +- frontend/src/DisplayItem/generic/ItemOverview.tsx | 2 +- frontend/src/Settings/General/index.tsx | 2 +- frontend/src/Settings/Languages/modal.tsx | 2 +- frontend/src/Settings/Notifications/components.tsx | 2 +- frontend/src/Settings/Providers/components.tsx | 2 +- frontend/src/Settings/components/forms.tsx | 2 +- frontend/src/Settings/components/hooks.ts | 2 +- frontend/src/Settings/components/provider.tsx | 2 +- frontend/src/Sidebar/index.tsx | 2 +- frontend/src/System/Logs/index.tsx | 2 +- frontend/src/System/Releases/index.tsx | 2 +- frontend/src/Wanted/Movies/index.tsx | 2 +- frontend/src/Wanted/Series/index.tsx | 2 +- frontend/src/Wanted/generic/index.tsx | 2 +- frontend/src/apis/index.ts | 2 +- .../components/{ContentHeader => header}/Button.tsx | 0 .../src/components/{ContentHeader => header}/Group.tsx | 0 .../src/components/{ContentHeader => header}/index.tsx | 0 .../components/{ContentHeader => header}/style.scss | 0 frontend/src/components/index.tsx | 2 +- frontend/src/components/modals/ItemEditorModal.tsx | 2 +- frontend/src/components/modals/ManualSearchModal.tsx | 4 ++-- frontend/src/components/modals/MovieUploadModal.tsx | 10 ++++++++-- frontend/src/components/modals/SeriesUploadModal.tsx | 2 +- frontend/src/components/modals/SubtitleToolModal.tsx | 6 +++--- frontend/src/components/modals/hooks.tsx | 2 +- frontend/src/components/tables/AsyncPageTable.tsx | 2 +- frontend/src/components/tables/PageTable.tsx | 2 +- frontend/src/special-pages/LaunchError.tsx | 2 +- frontend/src/special-pages/UIError.tsx | 2 +- frontend/src/{utilites => utilities}/async.ts | 0 frontend/src/{utilites => utilities}/entity.ts | 0 frontend/src/{utilites => utilities}/hooks.ts | 0 frontend/src/{utilites => utilities}/index.ts | 0 frontend/src/{utilites => utilities}/logger.ts | 0 frontend/src/{utilites => utilities}/validate.ts | 0 56 files changed, 58 insertions(+), 52 deletions(-) rename frontend/src/@modules/task/{utilites.ts => utilities.ts} (100%) rename frontend/src/components/{ContentHeader => header}/Button.tsx (100%) rename frontend/src/components/{ContentHeader => header}/Group.tsx (100%) rename frontend/src/components/{ContentHeader => header}/index.tsx (100%) rename frontend/src/components/{ContentHeader => header}/style.scss (100%) rename frontend/src/{utilites => utilities}/async.ts (100%) rename frontend/src/{utilites => utilities}/entity.ts (100%) rename frontend/src/{utilites => utilities}/hooks.ts (100%) rename frontend/src/{utilites => utilities}/index.ts (100%) rename frontend/src/{utilites => utilities}/logger.ts (100%) rename frontend/src/{utilites => utilities}/validate.ts (100%) diff --git a/frontend/src/@modules/socketio/hooks.ts b/frontend/src/@modules/socketio/hooks.ts index ca550b5dc..0fcc90f97 100644 --- a/frontend/src/@modules/socketio/hooks.ts +++ b/frontend/src/@modules/socketio/hooks.ts @@ -1,6 +1,6 @@ import { useEffect } from "react"; import Socketio from "."; -import { log } from "../../utilites/logger"; +import { log } from "../../utilities/logger"; export function useSocketIOReducer(reducer: SocketIO.Reducer) { useEffect(() => { diff --git a/frontend/src/@modules/socketio/index.ts b/frontend/src/@modules/socketio/index.ts index fd571b7eb..23fbdd157 100644 --- a/frontend/src/@modules/socketio/index.ts +++ b/frontend/src/@modules/socketio/index.ts @@ -1,7 +1,7 @@ import { debounce, forIn, remove, uniq } from "lodash"; import { io, Socket } from "socket.io-client"; -import { getBaseUrl } from "../../utilites"; -import { conditionalLog, log } from "../../utilites/logger"; +import { getBaseUrl } from "../../utilities"; +import { conditionalLog, log } from "../../utilities/logger"; import { createDefaultReducer } from "./reducer"; class SocketIOClient { diff --git a/frontend/src/@modules/task/utilites.ts b/frontend/src/@modules/task/utilities.ts similarity index 100% rename from frontend/src/@modules/task/utilites.ts rename to frontend/src/@modules/task/utilities.ts diff --git a/frontend/src/@redux/actions/site.ts b/frontend/src/@redux/actions/site.ts index 873e67eb1..b151bfb5f 100644 --- a/frontend/src/@redux/actions/site.ts +++ b/frontend/src/@redux/actions/site.ts @@ -1,6 +1,6 @@ import { createAction, createAsyncThunk } from "@reduxjs/toolkit"; import { BadgesApi } from "../../apis"; -import { waitFor } from "../../utilites"; +import { waitFor } from "../../utilities"; import { systemUpdateAllSettings } from "./system"; export const siteBootstrap = createAsyncThunk( diff --git a/frontend/src/@redux/hooks/async.ts b/frontend/src/@redux/hooks/async.ts index 8553f427b..8bbd00517 100644 --- a/frontend/src/@redux/hooks/async.ts +++ b/frontend/src/@redux/hooks/async.ts @@ -1,6 +1,6 @@ import { AsyncThunk } from "@reduxjs/toolkit"; import { useEffect } from "react"; -import { log } from "../../utilites/logger"; +import { log } from "../../utilities/logger"; import { useReduxAction } from "./base"; export function useAutoUpdate(item: Async.Item, update: () => void) { diff --git a/frontend/src/@redux/hooks/movies.ts b/frontend/src/@redux/hooks/movies.ts index df8a82272..485e93451 100644 --- a/frontend/src/@redux/hooks/movies.ts +++ b/frontend/src/@redux/hooks/movies.ts @@ -1,5 +1,5 @@ import { useCallback, useMemo } from "react"; -import { useEntityItemById, useEntityToList } from "../../utilites"; +import { useEntityItemById, useEntityToList } from "../../utilities"; import { movieUpdateBlacklist, movieUpdateById, diff --git a/frontend/src/@redux/hooks/series.ts b/frontend/src/@redux/hooks/series.ts index d37b7eb32..6892ced83 100644 --- a/frontend/src/@redux/hooks/series.ts +++ b/frontend/src/@redux/hooks/series.ts @@ -1,5 +1,5 @@ import { useCallback, useEffect, useMemo } from "react"; -import { useEntityItemById, useEntityToList } from "../../utilites"; +import { useEntityItemById, useEntityToList } from "../../utilities"; import { episodesUpdateBlacklist, episodeUpdateById, diff --git a/frontend/src/@redux/utils/factory.ts b/frontend/src/@redux/utils/factory.ts index 41ab339b7..46184dca4 100644 --- a/frontend/src/@redux/utils/factory.ts +++ b/frontend/src/@redux/utils/factory.ts @@ -15,7 +15,7 @@ import { pullAllWith, } from "lodash"; import { ReducerUtility } from "."; -import { conditionalLog } from "../../utilites/logger"; +import { conditionalLog } from "../../utilities/logger"; interface ActionParam { range?: AsyncThunk; diff --git a/frontend/src/App/Header.tsx b/frontend/src/App/Header.tsx index aebdde395..ae413030c 100644 --- a/frontend/src/App/Header.tsx +++ b/frontend/src/App/Header.tsx @@ -24,7 +24,7 @@ import { useIsOffline } from "../@redux/hooks/site"; import logo from "../@static/logo64.png"; import { SystemApi } from "../apis"; import { ActionButton, SearchBar, SearchResult } from "../components"; -import { useGotoHomepage, useIsMobile } from "../utilites"; +import { useGotoHomepage, useIsMobile } from "../utilities"; import "./header.scss"; import NotificationCenter from "./Notification"; diff --git a/frontend/src/App/Notification.tsx b/frontend/src/App/Notification.tsx index 8930a64f2..c5d405acf 100644 --- a/frontend/src/App/Notification.tsx +++ b/frontend/src/App/Notification.tsx @@ -27,7 +27,7 @@ import { } from "react-bootstrap"; import { useDidUpdate, useTimeoutWhen } from "rooks"; import { useReduxStore } from "../@redux/hooks/base"; -import { BuildKey, useIsArrayExtended } from "../utilites"; +import { BuildKey, useIsArrayExtended } from "../utilities"; import "./notification.scss"; enum State { diff --git a/frontend/src/App/Router.tsx b/frontend/src/App/Router.tsx index ee520445a..626ec6a4d 100644 --- a/frontend/src/App/Router.tsx +++ b/frontend/src/App/Router.tsx @@ -8,7 +8,7 @@ import HistoryRouter from "../History/Router"; import SettingRouter from "../Settings/Router"; import EmptyPage, { RouterEmptyPath } from "../special-pages/404"; import SystemRouter from "../System/Router"; -import { ScrollToTop } from "../utilites"; +import { ScrollToTop } from "../utilities"; import WantedRouter from "../Wanted/Router"; const Router: FunctionComponent<{ className?: string }> = ({ className }) => { diff --git a/frontend/src/App/index.tsx b/frontend/src/App/index.tsx index 3cadff45c..5d26fbd37 100644 --- a/frontend/src/App/index.tsx +++ b/frontend/src/App/index.tsx @@ -20,7 +20,7 @@ import Sidebar from "../Sidebar"; import Auth from "../special-pages/AuthPage"; import ErrorBoundary from "../special-pages/ErrorBoundary"; import LaunchError from "../special-pages/LaunchError"; -import { useBaseUrl, useHasUpdateInject } from "../utilites"; +import { useBaseUrl, useHasUpdateInject } from "../utilities"; import Header from "./Header"; import Router from "./Router"; diff --git a/frontend/src/DisplayItem/Episodes/index.tsx b/frontend/src/DisplayItem/Episodes/index.tsx index bda4f7cdc..6639dd2d9 100644 --- a/frontend/src/DisplayItem/Episodes/index.tsx +++ b/frontend/src/DisplayItem/Episodes/index.tsx @@ -13,7 +13,7 @@ import { Helmet } from "react-helmet"; import { Redirect, RouteComponentProps, withRouter } from "react-router-dom"; import { dispatchTask } from "../../@modules/task"; import { useIsAnyTaskRunningWithId } from "../../@modules/task/hooks"; -import { createTask } from "../../@modules/task/utilites"; +import { createTask } from "../../@modules/task/utilities"; import { useEpisodesBy, useProfileBy, useSerieBy } from "../../@redux/hooks"; import { SeriesApi } from "../../apis"; import { @@ -24,7 +24,7 @@ import { useShowModal, } from "../../components"; import { RouterEmptyPath } from "../../special-pages/404"; -import { useOnLoadedOnce } from "../../utilites"; +import { useOnLoadedOnce } from "../../utilities"; import ItemOverview from "../generic/ItemOverview"; import Table from "./table"; diff --git a/frontend/src/DisplayItem/Episodes/table.tsx b/frontend/src/DisplayItem/Episodes/table.tsx index a10bc7084..24131d82a 100644 --- a/frontend/src/DisplayItem/Episodes/table.tsx +++ b/frontend/src/DisplayItem/Episodes/table.tsx @@ -22,7 +22,7 @@ import { useShowModal, } from "../../components"; import { ManualSearchModal } from "../../components/modals/ManualSearchModal"; -import { BuildKey, filterSubtitleBy } from "../../utilites"; +import { BuildKey, filterSubtitleBy } from "../../utilities"; import { SubtitleAction } from "./components"; interface Props { diff --git a/frontend/src/DisplayItem/MovieDetail/index.tsx b/frontend/src/DisplayItem/MovieDetail/index.tsx index 86dd7b44f..dbd5041c4 100644 --- a/frontend/src/DisplayItem/MovieDetail/index.tsx +++ b/frontend/src/DisplayItem/MovieDetail/index.tsx @@ -13,7 +13,7 @@ import { Helmet } from "react-helmet"; import { Redirect, RouteComponentProps, withRouter } from "react-router-dom"; import { dispatchTask } from "../../@modules/task"; import { useIsAnyTaskRunningWithId } from "../../@modules/task/hooks"; -import { createTask } from "../../@modules/task/utilites"; +import { createTask } from "../../@modules/task/utilities"; import { useMovieBy, useProfileBy } from "../../@redux/hooks"; import { MoviesApi, ProvidersApi } from "../../apis"; import { @@ -27,7 +27,7 @@ import { } from "../../components"; import { ManualSearchModal } from "../../components/modals/ManualSearchModal"; import { RouterEmptyPath } from "../../special-pages/404"; -import { useOnLoadedOnce } from "../../utilites"; +import { useOnLoadedOnce } from "../../utilities"; import ItemOverview from "../generic/ItemOverview"; import Table from "./table"; diff --git a/frontend/src/DisplayItem/MovieDetail/table.tsx b/frontend/src/DisplayItem/MovieDetail/table.tsx index e8785e522..082565510 100644 --- a/frontend/src/DisplayItem/MovieDetail/table.tsx +++ b/frontend/src/DisplayItem/MovieDetail/table.tsx @@ -7,7 +7,7 @@ import { useProfileItemsToLanguages } from "../../@redux/hooks"; import { useShowOnlyDesired } from "../../@redux/hooks/site"; import { MoviesApi } from "../../apis"; import { AsyncButton, LanguageText, SimpleTable } from "../../components"; -import { filterSubtitleBy } from "../../utilites"; +import { filterSubtitleBy } from "../../utilities"; const missingText = "Missing Subtitles"; diff --git a/frontend/src/DisplayItem/Movies/index.tsx b/frontend/src/DisplayItem/Movies/index.tsx index 8ca97226a..4036aa6cb 100644 --- a/frontend/src/DisplayItem/Movies/index.tsx +++ b/frontend/src/DisplayItem/Movies/index.tsx @@ -10,7 +10,7 @@ import { useLanguageProfiles, useMovieEntities } from "../../@redux/hooks"; import { useReduxAction } from "../../@redux/hooks/base"; import { MoviesApi } from "../../apis"; import { ActionBadge, LanguageText, TextPopover } from "../../components"; -import { BuildKey } from "../../utilites"; +import { BuildKey } from "../../utilities"; import BaseItemView from "../generic/BaseItemView"; interface Props {} diff --git a/frontend/src/DisplayItem/Series/index.tsx b/frontend/src/DisplayItem/Series/index.tsx index 53d0da7e3..0afd29e9f 100644 --- a/frontend/src/DisplayItem/Series/index.tsx +++ b/frontend/src/DisplayItem/Series/index.tsx @@ -8,7 +8,7 @@ import { useLanguageProfiles, useSerieEntities } from "../../@redux/hooks"; import { useReduxAction } from "../../@redux/hooks/base"; import { SeriesApi } from "../../apis"; import { ActionBadge } from "../../components"; -import { BuildKey } from "../../utilites"; +import { BuildKey } from "../../utilities"; import BaseItemView from "../generic/BaseItemView"; interface Props {} diff --git a/frontend/src/DisplayItem/generic/BaseItemView/index.tsx b/frontend/src/DisplayItem/generic/BaseItemView/index.tsx index 330295cc5..57ad6984c 100644 --- a/frontend/src/DisplayItem/generic/BaseItemView/index.tsx +++ b/frontend/src/DisplayItem/generic/BaseItemView/index.tsx @@ -9,7 +9,7 @@ import { useIsAnyTaskRunning } from "../../../@modules/task/hooks"; import { useLanguageProfiles } from "../../../@redux/hooks"; import { useAppDispatch } from "../../../@redux/hooks/base"; import { ContentHeader } from "../../../components"; -import { GetItemId, isNonNullable } from "../../../utilites"; +import { GetItemId, isNonNullable } from "../../../utilities"; import Table from "./table"; export interface SharedProps { diff --git a/frontend/src/DisplayItem/generic/BaseItemView/table.tsx b/frontend/src/DisplayItem/generic/BaseItemView/table.tsx index a06b66a54..07b7c15fe 100644 --- a/frontend/src/DisplayItem/generic/BaseItemView/table.tsx +++ b/frontend/src/DisplayItem/generic/BaseItemView/table.tsx @@ -10,7 +10,7 @@ import { } from "../../../components"; import { TableStyleProps } from "../../../components/tables/BaseTable"; import { useCustomSelection } from "../../../components/tables/plugins"; -import { GetItemId, useEntityToList } from "../../../utilites"; +import { GetItemId, useEntityToList } from "../../../utilities"; interface Props extends SharedProps { dirtyItems: readonly T[]; diff --git a/frontend/src/DisplayItem/generic/ItemOverview.tsx b/frontend/src/DisplayItem/generic/ItemOverview.tsx index 17c9db188..1c06b5d25 100644 --- a/frontend/src/DisplayItem/generic/ItemOverview.tsx +++ b/frontend/src/DisplayItem/generic/ItemOverview.tsx @@ -24,7 +24,7 @@ import { } from "react-bootstrap"; import { useProfileBy, useProfileItemsToLanguages } from "../../@redux/hooks"; import { LanguageText } from "../../components"; -import { BuildKey, isMovie } from "../../utilites"; +import { BuildKey, isMovie } from "../../utilities"; interface Props { item: Item.Base; diff --git a/frontend/src/Settings/General/index.tsx b/frontend/src/Settings/General/index.tsx index 90a1c3d42..0049f1506 100644 --- a/frontend/src/Settings/General/index.tsx +++ b/frontend/src/Settings/General/index.tsx @@ -10,7 +10,7 @@ import { copyToClipboard, toggleState, useCanUpdateInject, -} from "../../utilites"; +} from "../../utilities"; import { Button, Check, diff --git a/frontend/src/Settings/Languages/modal.tsx b/frontend/src/Settings/Languages/modal.tsx index 92854ef22..20d1943a9 100644 --- a/frontend/src/Settings/Languages/modal.tsx +++ b/frontend/src/Settings/Languages/modal.tsx @@ -18,7 +18,7 @@ import { SimpleTable, useModalInformation, } from "../../components"; -import { BuildKey } from "../../utilites"; +import { BuildKey } from "../../utilities"; import { Input, Message } from "../components"; import { cutoffOptions } from "./options"; interface Props { diff --git a/frontend/src/Settings/Notifications/components.tsx b/frontend/src/Settings/Notifications/components.tsx index c8db22159..16530069d 100644 --- a/frontend/src/Settings/Notifications/components.tsx +++ b/frontend/src/Settings/Notifications/components.tsx @@ -15,7 +15,7 @@ import { useOnModalShow, useShowModal, } from "../../components"; -import { BuildKey } from "../../utilites"; +import { BuildKey } from "../../utilities"; import { ColCard, useLatestArray, useUpdateArray } from "../components"; import { notificationsKey } from "../keys"; diff --git a/frontend/src/Settings/Providers/components.tsx b/frontend/src/Settings/Providers/components.tsx index 9d08aa6f3..93000df8f 100644 --- a/frontend/src/Settings/Providers/components.tsx +++ b/frontend/src/Settings/Providers/components.tsx @@ -15,7 +15,7 @@ import { useOnModalShow, useShowModal, } from "../../components"; -import { BuildKey, isReactText } from "../../utilites"; +import { BuildKey, isReactText } from "../../utilities"; import { Check, ColCard, diff --git a/frontend/src/Settings/components/forms.tsx b/frontend/src/Settings/components/forms.tsx index 93c46fc36..844fe26ab 100644 --- a/frontend/src/Settings/components/forms.tsx +++ b/frontend/src/Settings/components/forms.tsx @@ -14,7 +14,7 @@ import { Slider as CSlider, SliderProps as CSliderProps, } from "../../components"; -import { isReactText } from "../../utilites"; +import { isReactText } from "../../utilities"; import { OverrideFuncType, useSingleUpdate } from "./hooks"; export const Message: FunctionComponent<{ diff --git a/frontend/src/Settings/components/hooks.ts b/frontend/src/Settings/components/hooks.ts index e2a81fe56..bdb98b5a0 100644 --- a/frontend/src/Settings/components/hooks.ts +++ b/frontend/src/Settings/components/hooks.ts @@ -1,7 +1,7 @@ import { isArray, uniqBy } from "lodash"; import { useCallback, useContext, useMemo } from "react"; import { useSystemSettings } from "../../@redux/hooks"; -import { log } from "../../utilites/logger"; +import { log } from "../../utilities/logger"; import { StagedChangesContext } from "./provider"; export function useStagedValues(): LooseObject { diff --git a/frontend/src/Settings/components/provider.tsx b/frontend/src/Settings/components/provider.tsx index 1d25cf843..c895b47fb 100644 --- a/frontend/src/Settings/components/provider.tsx +++ b/frontend/src/Settings/components/provider.tsx @@ -15,7 +15,7 @@ import { useSystemSettings } from "../../@redux/hooks"; import { useUpdateLocalStorage } from "../../@storage/local"; import { SystemApi } from "../../apis"; import { ContentHeader } from "../../components"; -import { log } from "../../utilites/logger"; +import { log } from "../../utilities/logger"; import { enabledLanguageKey, languageProfileKey, diff --git a/frontend/src/Sidebar/index.tsx b/frontend/src/Sidebar/index.tsx index dd2c19375..00bc43f55 100644 --- a/frontend/src/Sidebar/index.tsx +++ b/frontend/src/Sidebar/index.tsx @@ -4,7 +4,7 @@ import { useReduxStore } from "../@redux/hooks/base"; import { useIsRadarrEnabled, useIsSonarrEnabled } from "../@redux/hooks/site"; import logo from "../@static/logo64.png"; import { SidebarToggleContext } from "../App"; -import { useGotoHomepage } from "../utilites/hooks"; +import { useGotoHomepage } from "../utilities/hooks"; import { BadgesContext, CollapseItem, diff --git a/frontend/src/System/Logs/index.tsx b/frontend/src/System/Logs/index.tsx index 49840abbf..9458eb636 100644 --- a/frontend/src/System/Logs/index.tsx +++ b/frontend/src/System/Logs/index.tsx @@ -7,7 +7,7 @@ import { useSystemLogs } from "../../@redux/hooks"; import { useReduxAction } from "../../@redux/hooks/base"; import { SystemApi } from "../../apis"; import { AsyncOverlay, ContentHeader } from "../../components"; -import { useBaseUrl } from "../../utilites"; +import { useBaseUrl } from "../../utilities"; import Table from "./table"; interface Props {} diff --git a/frontend/src/System/Releases/index.tsx b/frontend/src/System/Releases/index.tsx index 8662840e3..8df51c975 100644 --- a/frontend/src/System/Releases/index.tsx +++ b/frontend/src/System/Releases/index.tsx @@ -3,7 +3,7 @@ import { Badge, Card, Col, Container, Row } from "react-bootstrap"; import { Helmet } from "react-helmet"; import { useSystemReleases } from "../../@redux/hooks"; import { AsyncOverlay } from "../../components"; -import { BuildKey } from "../../utilites"; +import { BuildKey } from "../../utilities"; interface Props {} diff --git a/frontend/src/Wanted/Movies/index.tsx b/frontend/src/Wanted/Movies/index.tsx index 6fc080f30..b9bd68250 100644 --- a/frontend/src/Wanted/Movies/index.tsx +++ b/frontend/src/Wanted/Movies/index.tsx @@ -9,7 +9,7 @@ import { useWantedMovies } from "../../@redux/hooks"; import { useReduxAction } from "../../@redux/hooks/base"; import { MoviesApi } from "../../apis"; import { AsyncButton, LanguageText } from "../../components"; -import { BuildKey } from "../../utilites"; +import { BuildKey } from "../../utilities"; import GenericWantedView from "../generic"; interface Props {} diff --git a/frontend/src/Wanted/Series/index.tsx b/frontend/src/Wanted/Series/index.tsx index d8e8dad37..065521b86 100644 --- a/frontend/src/Wanted/Series/index.tsx +++ b/frontend/src/Wanted/Series/index.tsx @@ -9,7 +9,7 @@ import { useWantedSeries } from "../../@redux/hooks"; import { useReduxAction } from "../../@redux/hooks/base"; import { EpisodesApi, SeriesApi } from "../../apis"; import { AsyncButton, LanguageText } from "../../components"; -import { BuildKey } from "../../utilites"; +import { BuildKey } from "../../utilities"; import GenericWantedView from "../generic"; interface Props {} diff --git a/frontend/src/Wanted/generic/index.tsx b/frontend/src/Wanted/generic/index.tsx index f25b346ee..53d842ac2 100644 --- a/frontend/src/Wanted/generic/index.tsx +++ b/frontend/src/Wanted/generic/index.tsx @@ -6,7 +6,7 @@ import { Helmet } from "react-helmet"; import { Column } from "react-table"; import { dispatchTask } from "../../@modules/task"; import { useIsGroupTaskRunning } from "../../@modules/task/hooks"; -import { createTask } from "../../@modules/task/utilites"; +import { createTask } from "../../@modules/task/utilities"; import { AsyncPageTable, ContentHeader } from "../../components"; interface Props { diff --git a/frontend/src/apis/index.ts b/frontend/src/apis/index.ts index 9c66aa4ab..c3ec0d1d8 100644 --- a/frontend/src/apis/index.ts +++ b/frontend/src/apis/index.ts @@ -1,7 +1,7 @@ import Axios, { AxiosError, AxiosInstance, CancelTokenSource } from "axios"; import { siteRedirectToAuth } from "../@redux/actions"; import { AppDispatch } from "../@redux/store"; -import { getBaseUrl } from "../utilites"; +import { getBaseUrl } from "../utilities"; class Api { axios!: AxiosInstance; source!: CancelTokenSource; diff --git a/frontend/src/components/ContentHeader/Button.tsx b/frontend/src/components/header/Button.tsx similarity index 100% rename from frontend/src/components/ContentHeader/Button.tsx rename to frontend/src/components/header/Button.tsx diff --git a/frontend/src/components/ContentHeader/Group.tsx b/frontend/src/components/header/Group.tsx similarity index 100% rename from frontend/src/components/ContentHeader/Group.tsx rename to frontend/src/components/header/Group.tsx diff --git a/frontend/src/components/ContentHeader/index.tsx b/frontend/src/components/header/index.tsx similarity index 100% rename from frontend/src/components/ContentHeader/index.tsx rename to frontend/src/components/header/index.tsx diff --git a/frontend/src/components/ContentHeader/style.scss b/frontend/src/components/header/style.scss similarity index 100% rename from frontend/src/components/ContentHeader/style.scss rename to frontend/src/components/header/style.scss diff --git a/frontend/src/components/index.tsx b/frontend/src/components/index.tsx index 517153c0f..dc0e0999c 100644 --- a/frontend/src/components/index.tsx +++ b/frontend/src/components/index.tsx @@ -164,7 +164,7 @@ export const TextPopover: FunctionComponent = ({ export * from "./async"; export * from "./buttons"; -export * from "./ContentHeader"; +export * from "./header"; export * from "./inputs"; export * from "./LanguageSelector"; export * from "./modals"; diff --git a/frontend/src/components/modals/ItemEditorModal.tsx b/frontend/src/components/modals/ItemEditorModal.tsx index f178cf138..cc8a93468 100644 --- a/frontend/src/components/modals/ItemEditorModal.tsx +++ b/frontend/src/components/modals/ItemEditorModal.tsx @@ -3,7 +3,7 @@ import { Container, Form } from "react-bootstrap"; import { AsyncButton, Selector } from "../"; import { useIsAnyTaskRunningWithId } from "../../@modules/task/hooks"; import { useLanguageProfiles } from "../../@redux/hooks"; -import { GetItemId } from "../../utilites"; +import { GetItemId } from "../../utilities"; import BaseModal, { BaseModalProps } from "./BaseModal"; import { useModalInformation } from "./hooks"; diff --git a/frontend/src/components/modals/ManualSearchModal.tsx b/frontend/src/components/modals/ManualSearchModal.tsx index 8a5259719..2fb50bf99 100644 --- a/frontend/src/components/modals/ManualSearchModal.tsx +++ b/frontend/src/components/modals/ManualSearchModal.tsx @@ -33,9 +33,9 @@ import { useModalPayload, } from ".."; import { dispatchTask } from "../../@modules/task"; -import { createTask } from "../../@modules/task/utilites"; +import { createTask } from "../../@modules/task/utilities"; import { ProvidersApi } from "../../apis"; -import { GetItemId, isMovie } from "../../utilites"; +import { GetItemId, isMovie } from "../../utilities"; import "./msmStyle.scss"; type SupportType = Item.Movie | Item.Episode; diff --git a/frontend/src/components/modals/MovieUploadModal.tsx b/frontend/src/components/modals/MovieUploadModal.tsx index 37785aada..a0557e7b7 100644 --- a/frontend/src/components/modals/MovieUploadModal.tsx +++ b/frontend/src/components/modals/MovieUploadModal.tsx @@ -9,10 +9,10 @@ import React, { import { Button, Container, Form } from "react-bootstrap"; import { Column, Row } from "react-table"; import { dispatchTask } from "../../@modules/task"; -import { createTask } from "../../@modules/task/utilites"; +import { createTask } from "../../@modules/task/utilities"; import { useProfileBy, useProfileItemsToLanguages } from "../../@redux/hooks"; import { MoviesApi } from "../../apis"; -import { BuildKey } from "../../utilites"; +import { BuildKey } from "../../utilities"; import { FileForm } from "../inputs"; import { LanguageSelector } from "../LanguageSelector"; import { SimpleTable } from "../tables"; @@ -100,6 +100,12 @@ const MovieUploadModal: FunctionComponent = (props) => { const columns = useMemo[]>( () => [ + { + id: "state", + Cell: () => { + return "hello"; + }, + }, { id: "name", Header: "File", diff --git a/frontend/src/components/modals/SeriesUploadModal.tsx b/frontend/src/components/modals/SeriesUploadModal.tsx index f0efa5a50..e91e7fb04 100644 --- a/frontend/src/components/modals/SeriesUploadModal.tsx +++ b/frontend/src/components/modals/SeriesUploadModal.tsx @@ -16,7 +16,7 @@ import { Button, Container, Form } from "react-bootstrap"; import { Column, TableUpdater } from "react-table"; import { FileForm, LanguageSelector, MessageIcon, SimpleTable } from ".."; import { dispatchTask } from "../../@modules/task"; -import { createTask } from "../../@modules/task/utilites"; +import { createTask } from "../../@modules/task/utilities"; import { useProfileBy, useProfileItemsToLanguages } from "../../@redux/hooks"; import { EpisodesApi, SubtitlesApi } from "../../apis"; import { Selector } from "../inputs"; diff --git a/frontend/src/components/modals/SubtitleToolModal.tsx b/frontend/src/components/modals/SubtitleToolModal.tsx index eb4114038..ca79a7b09 100644 --- a/frontend/src/components/modals/SubtitleToolModal.tsx +++ b/frontend/src/components/modals/SubtitleToolModal.tsx @@ -40,11 +40,11 @@ import { useShowModal, } from ".."; import { dispatchTask } from "../../@modules/task"; -import { createTask } from "../../@modules/task/utilites"; +import { createTask } from "../../@modules/task/utilities"; import { useEnabledLanguages } from "../../@redux/hooks"; import { SubtitlesApi } from "../../apis"; -import { isMovie, submodProcessColor } from "../../utilites"; -import { log } from "../../utilites/logger"; +import { isMovie, submodProcessColor } from "../../utilities"; +import { log } from "../../utilities/logger"; import { useCustomSelection } from "../tables/plugins"; import BaseModal, { BaseModalProps } from "./BaseModal"; import { useCloseModal } from "./hooks"; diff --git a/frontend/src/components/modals/hooks.tsx b/frontend/src/components/modals/hooks.tsx index 8cb762c9a..485261376 100644 --- a/frontend/src/components/modals/hooks.tsx +++ b/frontend/src/components/modals/hooks.tsx @@ -1,6 +1,6 @@ import { useCallback, useContext, useMemo } from "react"; import { useDidUpdate } from "rooks"; -import { log } from "../../utilites/logger"; +import { log } from "../../utilities/logger"; import { ModalContext } from "./provider"; interface ModalInformation { diff --git a/frontend/src/components/tables/AsyncPageTable.tsx b/frontend/src/components/tables/AsyncPageTable.tsx index 254663176..00e7748b8 100644 --- a/frontend/src/components/tables/AsyncPageTable.tsx +++ b/frontend/src/components/tables/AsyncPageTable.tsx @@ -6,7 +6,7 @@ import { ScrollToTop, useEntityByRange, useIsEntityLoaded, -} from "../../utilites"; +} from "../../utilities"; import BaseTable, { TableStyleProps, useStyleAndOptions } from "./BaseTable"; import PageControl from "./PageControl"; import { useDefaultSettings } from "./plugins"; diff --git a/frontend/src/components/tables/PageTable.tsx b/frontend/src/components/tables/PageTable.tsx index 3e2d26346..6dc839bb5 100644 --- a/frontend/src/components/tables/PageTable.tsx +++ b/frontend/src/components/tables/PageTable.tsx @@ -6,7 +6,7 @@ import { useRowSelect, useTable, } from "react-table"; -import { ScrollToTop } from "../../utilites"; +import { ScrollToTop } from "../../utilities"; import BaseTable, { TableStyleProps, useStyleAndOptions } from "./BaseTable"; import PageControl from "./PageControl"; import { useCustomSelection, useDefaultSettings } from "./plugins"; diff --git a/frontend/src/special-pages/LaunchError.tsx b/frontend/src/special-pages/LaunchError.tsx index 7611f28f6..2b7db3400 100644 --- a/frontend/src/special-pages/LaunchError.tsx +++ b/frontend/src/special-pages/LaunchError.tsx @@ -2,7 +2,7 @@ import { faExclamationTriangle } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import React, { FunctionComponent } from "react"; import { Alert, Button, Container } from "react-bootstrap"; -import { Reload } from "../utilites"; +import { Reload } from "../utilities"; interface Props { children: string; diff --git a/frontend/src/special-pages/UIError.tsx b/frontend/src/special-pages/UIError.tsx index bb6f95b8a..39bbd047f 100644 --- a/frontend/src/special-pages/UIError.tsx +++ b/frontend/src/special-pages/UIError.tsx @@ -3,7 +3,7 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import React, { FunctionComponent } from "react"; import { Button, Container } from "react-bootstrap"; import { GithubRepoRoot } from "../constants"; -import { Reload } from "../utilites"; +import { Reload } from "../utilities"; interface Props { error: Error; diff --git a/frontend/src/utilites/async.ts b/frontend/src/utilities/async.ts similarity index 100% rename from frontend/src/utilites/async.ts rename to frontend/src/utilities/async.ts diff --git a/frontend/src/utilites/entity.ts b/frontend/src/utilities/entity.ts similarity index 100% rename from frontend/src/utilites/entity.ts rename to frontend/src/utilities/entity.ts diff --git a/frontend/src/utilites/hooks.ts b/frontend/src/utilities/hooks.ts similarity index 100% rename from frontend/src/utilites/hooks.ts rename to frontend/src/utilities/hooks.ts diff --git a/frontend/src/utilites/index.ts b/frontend/src/utilities/index.ts similarity index 100% rename from frontend/src/utilites/index.ts rename to frontend/src/utilities/index.ts diff --git a/frontend/src/utilites/logger.ts b/frontend/src/utilities/logger.ts similarity index 100% rename from frontend/src/utilites/logger.ts rename to frontend/src/utilities/logger.ts diff --git a/frontend/src/utilites/validate.ts b/frontend/src/utilities/validate.ts similarity index 100% rename from frontend/src/utilites/validate.ts rename to frontend/src/utilities/validate.ts From 499faeb94a61c2320e2f99cfd05e92c85a581081 Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Tue, 24 Aug 2021 09:31:47 +0800 Subject: [PATCH 45/67] Fix display issues of backend background tasks --- bazarr/get_episodes.py | 2 +- bazarr/get_movies.py | 2 +- bazarr/get_series.py | 2 +- bazarr/get_subtitle.py | 14 +++++++------- bazarr/list_subtitles.py | 4 ++-- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/bazarr/get_episodes.py b/bazarr/get_episodes.py index 614bf135d..ebbec73ec 100644 --- a/bazarr/get_episodes.py +++ b/bazarr/get_episodes.py @@ -44,7 +44,7 @@ def sync_episodes(series_id=None, send_event=True): seriesIdList = get_series_from_sonarr_api(series_id=series_id, url=url_sonarr(), apikey_sonarr=apikey_sonarr,) series_count = len(seriesIdList) - for i, seriesId in enumerate(seriesIdList, 1): + for i, seriesId in enumerate(seriesIdList): sleep() if send_event: show_progress(id='episodes_progress', diff --git a/bazarr/get_movies.py b/bazarr/get_movies.py index 95ff5b60d..8749ff6fd 100644 --- a/bazarr/get_movies.py +++ b/bazarr/get_movies.py @@ -63,7 +63,7 @@ def update_movies(send_event=True): # Build new and updated movies movies_count = len(movies) - for i, movie in enumerate(movies, 1): + for i, movie in enumerate(movies): sleep() if send_event: show_progress(id='movies_progress', diff --git a/bazarr/get_series.py b/bazarr/get_series.py index 9af7bb49b..98f77dcaf 100644 --- a/bazarr/get_series.py +++ b/bazarr/get_series.py @@ -50,7 +50,7 @@ def update_series(send_event=True): series_to_add = [] series_count = len(series) - for i, show in enumerate(series, 1): + for i, show in enumerate(series): sleep() if send_event: show_progress(id='series_progress', diff --git a/bazarr/get_subtitle.py b/bazarr/get_subtitle.py index cf25a0fb8..06c520757 100644 --- a/bazarr/get_subtitle.py +++ b/bazarr/get_subtitle.py @@ -738,7 +738,7 @@ def series_download_subtitles(no): count_episodes_details = len(episodes_details) - for i, episode in enumerate(episodes_details, 1): + for i, episode in enumerate(episodes_details): if providers_list: show_progress(id='series_search_progress_{}'.format(no), header='Searching missing subtitles...', @@ -835,7 +835,7 @@ def episode_download_subtitles(no, send_progress=False): episode['season'], episode['episode'], episode['episodeTitle']), - value=1, + value=0, count=1) for language in ast.literal_eval(episode['missing_subtitles']): # confirm if language is still missing or if cutoff have been reached @@ -915,7 +915,7 @@ def movies_download_subtitles(no): else: count_movie = 0 - for i, language in enumerate(ast.literal_eval(movie['missing_subtitles']), 1): + for i, language in enumerate(ast.literal_eval(movie['missing_subtitles'])): # confirm if language is still missing or if cutoff have been reached confirmed_missing_subs = TableMovies.select(TableMovies.missing_subtitles)\ .where(TableMovies.radarrId == movie['radarrId'])\ @@ -1159,7 +1159,7 @@ def wanted_search_missing_subtitles_series(): episodes = list(episodes) count_episodes = len(episodes) - for i, episode in enumerate(episodes, 1): + for i, episode in enumerate(episodes): show_progress(id='wanted_episodes_progress', header='Searching subtitles...', name='{0} - S{1:02d}E{2:02d} - {3}'.format(episode['title'], @@ -1193,7 +1193,7 @@ def wanted_search_missing_subtitles_movies(): movies = list(movies) count_movies = len(movies) - for i, movie in enumerate(movies, 1): + for i, movie in enumerate(movies): show_progress(id='wanted_movies_progress', header='Searching subtitles...', name=movie['title'], @@ -1470,7 +1470,7 @@ def upgrade_subtitles(): providers_auth = get_providers_auth() if settings.general.getboolean('use_sonarr'): - for i, episode in enumerate(episodes_to_upgrade, 1): + for i, episode in enumerate(episodes_to_upgrade): show_progress(id='upgrade_episodes_progress', header='Upgrading episodes subtitles...', name='{0} - S{1:02d}E{2:02d} - {3}'.format(episode['seriesTitle'], @@ -1537,7 +1537,7 @@ def upgrade_subtitles(): hide_progress(id='upgrade_episodes_progress') if settings.general.getboolean('use_radarr'): - for i, movie in enumerate(movies_to_upgrade, 1): + for i, movie in enumerate(movies_to_upgrade): show_progress(id='upgrade_movies_progress', header='Upgrading movies subtitles...', name=movie['title'], diff --git a/bazarr/list_subtitles.py b/bazarr/list_subtitles.py index 2248f904d..e18ef0d1a 100644 --- a/bazarr/list_subtitles.py +++ b/bazarr/list_subtitles.py @@ -451,7 +451,7 @@ def series_full_scan_subtitles(): episodes = TableEpisodes.select(TableEpisodes.path).dicts() count_episodes = len(episodes) - for i, episode in enumerate(episodes, 1): + for i, episode in enumerate(episodes): sleep() show_progress(id='episodes_disk_scan', header='Full disk scan...', @@ -471,7 +471,7 @@ def movies_full_scan_subtitles(): movies = TableMovies.select(TableMovies.path).dicts() count_movies = len(movies) - for i, movie in enumerate(movies, 1): + for i, movie in enumerate(movies): sleep() show_progress(id='movies_disk_scan', header='Full disk scan...', From 903f33e6b0440e600698844edd37eb189fbeb395 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Aug 2021 09:34:07 +0800 Subject: [PATCH 46/67] no log: Bump @types/react from 16.14.12 to 17.0.19 in /frontend (#1515) Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 16.14.12 to 17.0.19. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react) --- updated-dependencies: - dependency-name: "@types/react" dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frontend/package-lock.json | 14 +++++++------- frontend/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 7e8e40491..9f7c5b024 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -20,7 +20,7 @@ "@types/jest": "~26.0.24", "@types/lodash": "^4", "@types/node": "^15", - "@types/react": "^16", + "@types/react": "^17", "@types/react-dom": "^17", "@types/react-helmet": "^6.1", "@types/react-router-dom": "^5", @@ -3594,9 +3594,9 @@ "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" }, "node_modules/@types/react": { - "version": "16.14.12", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.12.tgz", - "integrity": "sha512-7nOJgNsRbARhZhvwPm7cnzahtzEi5VJ9OvcQk8ExEEb1t+zaFklwLVkJz7G1kfxX4X/mDa/icTmzE0vTmqsqBg==", + "version": "17.0.19", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.19.tgz", + "integrity": "sha512-sX1HisdB1/ZESixMTGnMxH9TDe8Sk709734fEQZzCV/4lSu9kJCPbo2PbTRoZM+53Pp0P10hYVyReUueGwUi4A==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -24927,9 +24927,9 @@ "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" }, "@types/react": { - "version": "16.14.12", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.12.tgz", - "integrity": "sha512-7nOJgNsRbARhZhvwPm7cnzahtzEi5VJ9OvcQk8ExEEb1t+zaFklwLVkJz7G1kfxX4X/mDa/icTmzE0vTmqsqBg==", + "version": "17.0.19", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.19.tgz", + "integrity": "sha512-sX1HisdB1/ZESixMTGnMxH9TDe8Sk709734fEQZzCV/4lSu9kJCPbo2PbTRoZM+53Pp0P10hYVyReUueGwUi4A==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", diff --git a/frontend/package.json b/frontend/package.json index 0ba3e2f8c..223b0b1d7 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -24,7 +24,7 @@ "@types/jest": "~26.0.24", "@types/lodash": "^4", "@types/node": "^15", - "@types/react": "^16", + "@types/react": "^17", "@types/react-dom": "^17", "@types/react-helmet": "^6.1", "@types/react-router-dom": "^5", From e0b988b20f71d6fb6cc8bf5b55be1cbaf436d227 Mon Sep 17 00:00:00 2001 From: morpheus65535 Date: Mon, 23 Aug 2021 22:50:56 -0400 Subject: [PATCH 47/67] Fixed throttled providers badge not being updated when pressing the reset button. --- bazarr/get_providers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bazarr/get_providers.py b/bazarr/get_providers.py index 497ce4526..b2b700f6b 100644 --- a/bazarr/get_providers.py +++ b/bazarr/get_providers.py @@ -281,7 +281,7 @@ def update_throttled_provider(): del tp[provider] set_throttled_providers(str(tp)) - event_stream(type='badges') + event_stream(type='badges') def list_throttled_providers(): From 4a890b25617b0a50f3882f95e626c0f226382c7f Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Wed, 25 Aug 2021 00:33:59 +0800 Subject: [PATCH 48/67] Support multi-language in subtitle upload modal --- frontend/src/components/LanguageSelector.tsx | 2 +- .../components/modals/MovieUploadModal.tsx | 232 ++++-------- .../components/modals/SeriesUploadModal.tsx | 344 +++++------------- .../components/modals/SubtitleUploadModal.tsx | 290 +++++++++++++++ 4 files changed, 463 insertions(+), 405 deletions(-) create mode 100644 frontend/src/components/modals/SubtitleUploadModal.tsx diff --git a/frontend/src/components/LanguageSelector.tsx b/frontend/src/components/LanguageSelector.tsx index 17e17d8ac..f2466e1bc 100644 --- a/frontend/src/components/LanguageSelector.tsx +++ b/frontend/src/components/LanguageSelector.tsx @@ -7,7 +7,7 @@ interface Props { type RemovedSelectorProps = Omit< SelectorProps, - "label" | "placeholder" + "label" >; export type LanguageSelectorProps = Override< diff --git a/frontend/src/components/modals/MovieUploadModal.tsx b/frontend/src/components/modals/MovieUploadModal.tsx index a0557e7b7..85e852f93 100644 --- a/frontend/src/components/modals/MovieUploadModal.tsx +++ b/frontend/src/components/modals/MovieUploadModal.tsx @@ -1,27 +1,19 @@ -import { faTrash } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import React, { - FunctionComponent, - useCallback, - useMemo, - useState, -} from "react"; -import { Button, Container, Form } from "react-bootstrap"; -import { Column, Row } from "react-table"; +import React, { FunctionComponent, useCallback, useMemo } from "react"; +import { Form } from "react-bootstrap"; +import { Column } from "react-table"; import { dispatchTask } from "../../@modules/task"; import { createTask } from "../../@modules/task/utilities"; import { useProfileBy, useProfileItemsToLanguages } from "../../@redux/hooks"; import { MoviesApi } from "../../apis"; import { BuildKey } from "../../utilities"; -import { FileForm } from "../inputs"; -import { LanguageSelector } from "../LanguageSelector"; -import { SimpleTable } from "../tables"; -import BaseModal, { BaseModalProps } from "./BaseModal"; +import { BaseModalProps } from "./BaseModal"; import { useModalInformation } from "./hooks"; +import SubtitleUploadModal, { + PendingSubtitle, + Validator, +} from "./SubtitleUploadModal"; -interface PendingSubtitle { - file: File; - language: Language.Info; +interface Payload { forced: boolean; } @@ -30,178 +22,114 @@ export const TaskGroupName = "Uploading Subtitles..."; const MovieUploadModal: FunctionComponent = (props) => { const modal = props; - const { payload, closeModal } = useModalInformation( - modal.modalKey - ); + const { payload } = useModalInformation(modal.modalKey); const profile = useProfileBy(payload?.profileId); const availableLanguages = useProfileItemsToLanguages(profile); - const [pending, setPending] = useState([]); + const update = useCallback(async (list: PendingSubtitle[]) => { + return list; + }, []); - const filelist = useMemo(() => pending.map((v) => v.file), [pending]); - - const setFiles = useCallback( - (files: File[]) => { - const list: PendingSubtitle[] = files.map((v) => ({ - file: v, - forced: availableLanguages[0].forced ?? false, - language: availableLanguages[0], - })); - setPending(list); + const validate = useCallback>( + (item) => { + if (item.language === null) { + return { + state: "error", + messages: ["Language is not selected"], + }; + } else if ( + payload?.subtitles.find((v) => v.code2 === item.language?.code2) !== + undefined + ) { + return { + state: "warning", + messages: ["Override existing subtitle"], + }; + } + return { + state: "valid", + messages: [], + }; }, - [availableLanguages] + [payload?.subtitles] ); - const upload = useCallback(() => { - if (payload === null || pending.length === 0) { - return; - } + const upload = useCallback( + (items: PendingSubtitle[]) => { + if (payload === null) { + return; + } - const { radarrId } = payload; + const { radarrId } = payload; - const tasks = pending.map((v) => { - const { file, language, forced } = v; + const tasks = items + .filter((v) => v.language !== null) + .map((v) => { + const { + file, + language, + payload: { forced }, + } = v; - return createTask( - file.name, - radarrId, - MoviesApi.uploadSubtitles.bind(MoviesApi), - radarrId, - { - file: file, - forced, - hi: false, - language: language.code2, - } - ); - }); + return createTask( + file.name, + radarrId, + MoviesApi.uploadSubtitles.bind(MoviesApi), + radarrId, + { + file: file, + forced, + hi: false, + language: language!.code2, + } + ); + }); - dispatchTask(TaskGroupName, tasks, "Uploading..."); - setFiles([]); - closeModal(); - }, [payload, closeModal, pending, setFiles]); - - const modify = useCallback( - (row: Row, info?: PendingSubtitle) => { - setPending((pd) => { - const newPending = [...pd]; - if (info) { - newPending[row.index] = info; - } else { - newPending.splice(row.index, 1); - } - return newPending; - }); + dispatchTask(TaskGroupName, tasks, "Uploading..."); }, - [] + [payload] ); - const columns = useMemo[]>( + const columns = useMemo>[]>( () => [ { - id: "state", - Cell: () => { - return "hello"; - }, - }, - { - id: "name", - Header: "File", - accessor: (d) => d.file.name, - }, - { + id: "forced", Header: "Forced", - accessor: "forced", + accessor: "payload", Cell: ({ row, value, update }) => { const { original, index } = row; return ( { const newInfo = { ...row.original }; - newInfo.forced = v.target.checked; + newInfo.payload.forced = v.target.checked; update && update(row, newInfo); }} > ); }, }, - { - Header: "Language", - accessor: "language", - className: "w-25", - Cell: ({ row, update, value }) => { - return ( - { - if (lang && update) { - const newInfo = { ...row.original }; - newInfo.language = lang; - update(row, newInfo); - } - }} - > - ); - }, - }, - { - accessor: "file", - Cell: ({ row, update }) => { - return ( - - ); - }, - }, ], - [availableLanguages] - ); - - const canUpload = pending.length > 0; - - const footer = ( - + [] ); return ( - - - - - - - - - - + ); }; diff --git a/frontend/src/components/modals/SeriesUploadModal.tsx b/frontend/src/components/modals/SeriesUploadModal.tsx index e91e7fb04..dd5a9040e 100644 --- a/frontend/src/components/modals/SeriesUploadModal.tsx +++ b/frontend/src/components/modals/SeriesUploadModal.tsx @@ -1,213 +1,126 @@ -import { - faCheck, - faCircleNotch, - faInfoCircle, - faTrash, -} from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import React, { - FunctionComponent, - useCallback, - useEffect, - useMemo, - useState, -} from "react"; -import { Button, Container, Form } from "react-bootstrap"; -import { Column, TableUpdater } from "react-table"; -import { FileForm, LanguageSelector, MessageIcon, SimpleTable } from ".."; +import React, { FunctionComponent, useCallback, useMemo } from "react"; +import { Column } from "react-table"; import { dispatchTask } from "../../@modules/task"; import { createTask } from "../../@modules/task/utilities"; import { useProfileBy, useProfileItemsToLanguages } from "../../@redux/hooks"; import { EpisodesApi, SubtitlesApi } from "../../apis"; import { Selector } from "../inputs"; -import BaseModal, { BaseModalProps } from "./BaseModal"; +import { BaseModalProps } from "./BaseModal"; import { useModalInformation } from "./hooks"; +import SubtitleUploadModal, { + PendingSubtitle, + Validator, +} from "./SubtitleUploadModal"; -interface PendingSubtitle { - file: File; - fetching: boolean; - instance?: Item.Episode; +interface Payload { + instance: Item.Episode | null; } -type EpisodeMap = { - [name: string]: Item.Episode; -}; - -interface SerieProps { +interface SeriesProps { episodes: readonly Item.Episode[]; } export const TaskGroupName = "Uploading Subtitles..."; -const SeriesUploadModal: FunctionComponent = ({ +const SeriesUploadModal: FunctionComponent = ({ episodes, ...modal }) => { - const { payload, closeModal } = useModalInformation( - modal.modalKey - ); - - const [pending, setPending] = useState([]); + const { payload } = useModalInformation(modal.modalKey); const profile = useProfileBy(payload?.profileId); - const avaliableLanguages = useProfileItemsToLanguages(profile); + const availableLanguages = useProfileItemsToLanguages(profile); - const [language, setLanguage] = useState(null); - - useEffect(() => { - if (avaliableLanguages.length > 0) { - setLanguage(avaliableLanguages[0]); - } - }, [avaliableLanguages]); - - const filelist = useMemo(() => pending.map((v) => v.file), [pending]); - - const checkEpisodes = useCallback( - async (list: PendingSubtitle[]) => { + const update = useCallback( + async (list: PendingSubtitle[]) => { + const newList = [...list]; const names = list.map((v) => v.file.name); if (names.length > 0) { const results = await SubtitlesApi.info(names); - const episodeMap = results.reduce((prev, curr) => { - const ep = episodes.find( - (v) => v.season === curr.season && v.episode === curr.episode - ); - if (ep) { - prev[curr.filename] = ep; + // TODO: Optimization + newList.forEach((v) => { + const info = results.find((f) => f.filename === v.file.name); + if (info) { + v.payload.instance = + episodes.find( + (e) => e.season === info.season && e.episode === info.episode + ) ?? null; } - return prev; - }, {}); - - setPending((pd) => - pd.map((v) => { - const instance = episodeMap[v.file.name]; - return { - ...v, - instance, - fetching: false, - }; - }) - ); + }); } + + return newList; }, [episodes] ); - const setFiles = useCallback( - (files: File[]) => { - // At lease 1 language is required - const list: PendingSubtitle[] = files.map((f) => { - return { - file: f, - didCheck: false, - fetching: true, - }; - }); - setPending(list); - checkEpisodes(list); - }, - [checkEpisodes] - ); - - const upload = useCallback(() => { - if (payload === null || language === null) { - return; + const validate = useCallback>((item) => { + const { language } = item; + const { instance } = item.payload; + if (language === null || instance === null) { + return { + state: "error", + messages: ["Language or Episode is not selected"], + }; + } else if ( + instance.subtitles.find((v) => v.code2 === language.code2) !== undefined + ) { + return { + state: "warning", + messages: ["Override existing subtitle"], + }; } + return { + state: "valid", + messages: [], + }; + }, []); - const { sonarrSeriesId: seriesid } = payload; - const { code2, hi, forced } = language; + const upload = useCallback( + (items: PendingSubtitle[]) => { + if (payload === null) { + return; + } - const tasks = pending - .filter((v) => v.instance !== undefined) - .map((v) => { - const { sonarrEpisodeId: episodeid } = v.instance!; + const { sonarrSeriesId: seriesid } = payload; - const form: FormType.UploadSubtitle = { - file: v.file, - language: code2, - hi: hi ?? false, - forced: forced ?? false, - }; + const tasks = items + .filter((v) => v.payload.instance !== undefined) + .map((v) => { + const { code2, hi, forced } = v.language!; + const { sonarrEpisodeId: episodeid } = v.payload.instance!; - return createTask( - v.file.name, - episodeid, - EpisodesApi.uploadSubtitles.bind(EpisodesApi), - seriesid, - episodeid, - form - ); - }); + const form: FormType.UploadSubtitle = { + file: v.file, + language: code2, + hi: hi ?? false, + forced: forced ?? false, + }; - dispatchTask(TaskGroupName, tasks, "Uploading subtitles..."); - setFiles([]); - closeModal(); - }, [payload, pending, language, closeModal, setFiles]); + return createTask( + v.file.name, + episodeid, + EpisodesApi.uploadSubtitles.bind(EpisodesApi), + seriesid, + episodeid, + form + ); + }); - const canUpload = useMemo( - () => - pending.length > 0 && - pending.every((v) => v.instance !== undefined) && - language, - [pending, language] + dispatchTask(TaskGroupName, tasks, "Uploading subtitles..."); + }, + [payload] ); - const showTable = pending.length > 0; - - const columns = useMemo[]>( + const columns = useMemo>[]>( () => [ { - id: "Icon", - accessor: "fetching", - className: "text-center", - Cell: ({ value: fetching, row: { original } }) => { - let icon = faCircleNotch; - let color: string | undefined = undefined; - let spin = false; - let msgs: string[] = []; - - const override = useMemo( - () => - original.instance?.subtitles.find( - (v) => v.code2 === language?.code2 - ) !== undefined, - [original.instance?.subtitles] - ); - - if (fetching) { - spin = true; - } else if (override) { - icon = faInfoCircle; - color = "var(--warning)"; - msgs.push("Overwrite existing subtitle"); - } else if (original.instance) { - icon = faCheck; - color = "var(--success)"; - } else { - icon = faInfoCircle; - color = "var(--warning)"; - msgs.push("Season or episode info is missing"); - } - - return ( - - ); - }, - }, - { - Header: "File", - accessor: (d) => d.file.name, - }, - { + id: "instance", Header: "Episode", - accessor: "instance", + accessor: "payload", className: "vw-1", Cell: ({ value, row, update }) => { const options = episodes.map>((ep) => ({ @@ -219,7 +132,7 @@ const SeriesUploadModal: FunctionComponent = ({ (ep: Nullable) => { if (ep) { const newInfo = { ...row.original }; - newInfo.instance = ep; + newInfo.payload.instance = ep; update && update(row, newInfo); } }, @@ -228,101 +141,28 @@ const SeriesUploadModal: FunctionComponent = ({ return ( ); }, }, - { - accessor: "file", - Cell: ({ row, update }) => { - return ( - - ); - }, - }, ], - [language?.code2, episodes] - ); - - const updateItem = useCallback>( - (row, info?: PendingSubtitle) => { - setPending((pd) => { - const newPending = [...pd]; - if (info) { - newPending[row.index] = info; - } else { - newPending.splice(row.index, 1); - } - return newPending; - }); - }, - [] - ); - - const footer = ( -
-
- { - if (l) { - setLanguage(l); - } - }} - > -
-
- - -
-
+ [episodes] ); return ( - - -
- - - -
- -
-
+ ); }; diff --git a/frontend/src/components/modals/SubtitleUploadModal.tsx b/frontend/src/components/modals/SubtitleUploadModal.tsx new file mode 100644 index 000000000..4584826fb --- /dev/null +++ b/frontend/src/components/modals/SubtitleUploadModal.tsx @@ -0,0 +1,290 @@ +import { + faCheck, + faCircleNotch, + faInfoCircle, + faTimes, + faTrash, +} from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { Button, Container, Form } from "react-bootstrap"; +import { Column, TableUpdater } from "react-table"; +import { LanguageSelector, MessageIcon } from ".."; +import { FileForm } from "../inputs"; +import { SimpleTable } from "../tables"; +import BaseModal, { BaseModalProps } from "./BaseModal"; +import { useCloseModal } from "./hooks"; + +export interface PendingSubtitle

{ + file: File; + state: "valid" | "fetching" | "warning" | "error"; + messages: string[]; + language: Language.Info | null; + payload: P; +} + +export type Validator = ( + item: PendingSubtitle +) => Pick, "state" | "messages">; + +interface Props { + initial: T; + availableLanguages: Language.Info[]; + upload: (items: PendingSubtitle[]) => void; + update: (items: PendingSubtitle[]) => Promise[]>; + validate: Validator; + columns: Column>[]; + hideAllLanguages?: boolean; +} + +export default function SubtitleUploadModal( + props: Props & Omit +) { + const { + initial, + columns, + upload, + update, + validate, + availableLanguages, + hideAllLanguages, + } = props; + + const closeModal = useCloseModal(); + + const [pending, setPending] = useState[]>([]); + + const fileList = useMemo(() => pending.map((v) => v.file), [pending]); + + const initialRef = useRef(initial); + + const setFiles = useCallback( + async (files: File[]) => { + const initialLanguage = + availableLanguages.length > 0 ? availableLanguages[0] : null; + let list = files.map>((file) => ({ + file, + state: "fetching", + messages: [], + language: initialLanguage, + payload: { ...initialRef.current }, + })); + + if (update) { + setPending(list); + list = await update(list); + } else { + list = list.map>((v) => ({ + ...v, + state: "valid", + })); + } + + list = list.map((v) => ({ + ...v, + ...validate(v), + })); + + setPending(list); + }, + [update, validate, availableLanguages] + ); + + const modify = useCallback>>( + (row, info?: PendingSubtitle) => { + setPending((pd) => { + const newPending = [...pd]; + if (info) { + info = { ...info, ...validate(info) }; + newPending[row.index] = info; + } else { + newPending.splice(row.index, 1); + } + return newPending; + }); + }, + [validate] + ); + + useEffect(() => { + setPending((pd) => { + const newPd = pd.map((v) => { + if (v.state !== "fetching") { + return { ...v, ...validate(v) }; + } else { + return v; + } + }); + + return newPd; + }); + }, [validate]); + + const columnsWithAction = useMemo>[]>( + () => [ + { + id: "icon", + accessor: "state", + className: "text-center", + Cell: ({ value, row }) => { + let icon = faCircleNotch; + let color: string | undefined = undefined; + let spin = false; + + switch (value) { + case "fetching": + spin = true; + break; + case "warning": + icon = faInfoCircle; + color = "var(--warning)"; + break; + case "valid": + icon = faCheck; + color = "var(--success)"; + break; + default: + icon = faTimes; + color = "var(--danger)"; + break; + } + + const messages = row.original.messages; + + return ( + + ); + }, + }, + { + Header: "File", + accessor: (d) => d.file.name, + }, + ...columns, + { + id: "language", + Header: "Language", + accessor: "language", + className: "w-25", + Cell: ({ row, update, value }) => { + return ( + { + if (lang && update) { + const newInfo = { ...row.original }; + newInfo.language = lang; + update(row, newInfo); + } + }} + > + ); + }, + }, + { + id: "action", + accessor: "file", + Cell: ({ row, update }) => ( + + ), + }, + ], + [columns, availableLanguages] + ); + + const showTable = pending.length > 0; + + const canUpload = useMemo( + () => + pending.length > 0 && + pending.every((v) => v.state === "valid" || v.state === "warning"), + [pending] + ); + + const footer = ( +

+
+ + +
+ +
+ ); + + return ( + + +
+ + + +
+ +
+
+ ); +} From eb8f482eed83112bee986f919150145c16ff63db Mon Sep 17 00:00:00 2001 From: morpheus65535 Date: Tue, 24 Aug 2021 22:33:22 -0400 Subject: [PATCH 49/67] no log: fix for opensubtitles.com login issue. --- libs/subliminal_patch/providers/opensubtitlescom.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/libs/subliminal_patch/providers/opensubtitlescom.py b/libs/subliminal_patch/providers/opensubtitlescom.py index 7d04a6026..ced5f85ed 100644 --- a/libs/subliminal_patch/providers/opensubtitlescom.py +++ b/libs/subliminal_patch/providers/opensubtitlescom.py @@ -167,7 +167,7 @@ class OpenSubtitlesComProvider(ProviderRetryMixin, Provider): raise ProviderError('Invalid JSON returned by provider') else: region.set("oscom_token", self.token) - return True + return elif r.status_code == 401: raise AuthenticationError('Login failed: {}'.format(r.reason)) elif r.status_code == 429: @@ -176,8 +176,6 @@ class OpenSubtitlesComProvider(ProviderRetryMixin, Provider): raise ProviderError(r.reason) else: raise ProviderError('Bad status code: {}'.format(r.status_code)) - finally: - return False @region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME) def search_titles(self, title): From 9ced18d0d3053fbdf8887a139d94e718c9abfd55 Mon Sep 17 00:00:00 2001 From: vitiko98 Date: Wed, 25 Aug 2021 01:10:40 -0400 Subject: [PATCH 50/67] Score: add a condition class to allow painless future additions --- bazarr/score.py | 128 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 91 insertions(+), 37 deletions(-) diff --git a/bazarr/score.py b/bazarr/score.py index 34f4affd3..09b568a30 100644 --- a/bazarr/score.py +++ b/bazarr/score.py @@ -1,5 +1,7 @@ # -*- coding: utf-8 -*- +from __future__ import annotations + import logging import re @@ -10,6 +12,72 @@ from database import TableCustomScoreProfiles as profiles_table logger = logging.getLogger(__name__) +class Condition: + """Base class for score conditions. Every condition can take the amount + of attributes needed from a subtitle object in order to find a match.""" + + type = None + against = () + + # {type: provider, value: subdivx, required: False, negate: False} + def __init__(self, value: str, required=False, negate=False, **kwargs): + self._value = str(value) + self._negate = negate + self.required = required + + @classmethod + def from_dict(cls, item: dict) -> Condition: + """A factory method to create a condition object from a database + dictionary.""" + try: + new = _registered_conditions[item["type"]] + except IndexError: + raise NotImplementedError(f"{item} condition doesn't have a class.") + + return new(**item) + + def check(self, subtitle) -> bool: + """Check if the condition is met against a Subtitle object. **May be implemented + in a subclass**.""" + to_match = [str(getattr(subtitle, name, None)) for name in self.against] + met = any(item == self._value for item in to_match) + if met and not self._negate: + return True + + return not met and self._negate + + def __repr__(self) -> str: + return f"" + + +class ProviderCondition(Condition): + type = "provider" + against = ("provider_name",) + + +class UploaderCondition(Condition): + type = "uploader" + against = ("uploader",) + + +class LanguageCondition(Condition): + type = "language" + against = ("language",) + + +class RegexCondition(Condition): + type = "regex" + against = ("release_info", "filename") + + def check(self, subtitle): + to_match = [str(getattr(subtitle, name, None)) for name in self.against] + met = re.search(rf"{self._value}", "".join(to_match)) is not None + if met and not self._negate: + return True + + return not met and self._negate + + class CustomScoreProfile: table = profiles_table conditions_table = conditions_table @@ -24,11 +92,12 @@ class CustomScoreProfile: def load_conditions(self): try: - self._conditions = list( - self.conditions_table.select() + self._conditions = [ + Condition.from_dict(item) + for item in self.conditions_table.select() .where(self.conditions_table.profile_id == self.id) .dicts() - ) + ] except self.conditions_table.DoesNotExist: logger.debug("Conditions not found for %s", self) self._conditions = [] @@ -42,50 +111,28 @@ class CustomScoreProfile: # Always return False if no conditions are set if not self._conditions: - logger.debug("No conditions found in %s profile", self) + logger.debug("No conditions found in db for %s", self) return False - logger.debug("Checking conditions for %s profile", self) - met = self._check_conditions(subtitle) - logger.debug("Profile conditions met? %s", met) - return met + return self._check_conditions(subtitle) def _check_conditions(self, subtitle): - checkers = { - "provider": subtitle.provider_name, - "uploader": subtitle.uploader, - "language": subtitle.language, - "regex": subtitle.release_info, - } + logger.debug("Checking conditions for %s profile", self) matches = [] for condition in self._conditions: - # Condition dict example: - # {type: provider, value: subdivx, required: False, negate: False} - key = condition.get("type") - sub_value = checkers.get(key) - if sub_value is None: - continue + matched = condition.check(subtitle) - cond_value = condition.get("value", "") - negate = condition.get("negate", False) - - logger.debug("Checking %s: %s (condition: %s)", key, sub_value, condition) - - if key == "regex" and re.findall(rf"{cond_value}", sub_value): - logger.debug("Regex matched: %s -> %s", cond_value, sub_value) - matches.append(not negate and True) - - elif cond_value == sub_value: - logger.debug("%s condition met: %s -> %s", key, cond_value, sub_value) - matches.append(not negate and True) - - # Return False if any required condition is not met - elif condition.get("required"): - logger.debug("%s required condition not met, discarding profile", key) + if matched is True: + logger.debug("%s Condition met", condition) + matches.append(True) + elif condition.required and not matched: + logger.debug("%s not met, discarding profile", condition) return False - return True in matches + met = True in matches + logger.debug("Profile conditions met? %s", met) + return met def __repr__(self): return f"" @@ -217,5 +264,12 @@ class MovieScore(Score): self.data.update(kwargs["movie_scores"]) +_registered_conditions = { + "provider": ProviderCondition, + "uploader": UploaderCondition, + "language": LanguageCondition, + "regex": RegexCondition, +} + series_score = SeriesScore.from_config(**get_settings()) movie_score = MovieScore.from_config(**get_settings()) From 5c5d14c045e7c152806a75c6ee0088e92c09c32b Mon Sep 17 00:00:00 2001 From: morpheus65535 Date: Wed, 25 Aug 2021 09:22:52 -0400 Subject: [PATCH 51/67] Improved how custom post-processing deal with subtitles language modifier (HI and forced). #1516 --- bazarr/api.py | 4 +++ bazarr/get_subtitle.py | 32 +++++++++++++++++------ bazarr/helper.py | 29 +++++++++++++++----- frontend/src/Settings/Subtitles/index.tsx | 15 +++++++++-- 4 files changed, 64 insertions(+), 16 deletions(-) diff --git a/bazarr/api.py b/bazarr/api.py index 29a4c8486..d7ffab4f5 100644 --- a/bazarr/api.py +++ b/bazarr/api.py @@ -857,6 +857,7 @@ class EpisodesSubtitles(Resource): language = request.form.get('language') forced = True if request.form.get('forced') == 'on' else False + hi = True if request.form.get('hi') == 'on' else False subFile = request.files.get('file') _, ext = os.path.splitext(subFile.filename) @@ -868,6 +869,7 @@ class EpisodesSubtitles(Resource): result = manual_upload_subtitle(path=episodePath, language=language, forced=forced, + hi=hi, title=title, scene_name=sceneName, media_type='series', @@ -1086,6 +1088,7 @@ class MoviesSubtitles(Resource): language = request.form.get('language') forced = True if request.form.get('forced') == 'true' else False + hi = True if request.form.get('hi') == 'true' else False subFile = request.files.get('file') _, ext = os.path.splitext(subFile.filename) @@ -1097,6 +1100,7 @@ class MoviesSubtitles(Resource): result = manual_upload_subtitle(path=moviePath, language=language, forced=forced, + hi=hi, title=title, scene_name=sceneName, media_type='movie', diff --git a/bazarr/get_subtitle.py b/bazarr/get_subtitle.py index 06c520757..9f9f6212b 100644 --- a/bazarr/get_subtitle.py +++ b/bazarr/get_subtitle.py @@ -249,7 +249,8 @@ def download_subtitle(path, language, audio_language, hi, forced, providers, pro command = pp_replace(postprocessing_cmd, path, downloaded_path, downloaded_language, downloaded_language_code2, downloaded_language_code3, audio_language, audio_language_code2, audio_language_code3, subtitle.language.forced, - percent_score, subtitle_id, downloaded_provider, series_id, episode_id) + percent_score, subtitle_id, downloaded_provider, series_id, episode_id, + subtitle.language.hi) if media_type == 'series': use_pp_threshold = settings.general.getboolean('use_postprocessing_threshold') @@ -569,7 +570,8 @@ def manual_download_subtitle(path, language, audio_language, hi, forced, subtitl command = pp_replace(postprocessing_cmd, path, downloaded_path, downloaded_language, downloaded_language_code2, downloaded_language_code3, audio_language, audio_language_code2, audio_language_code3, subtitle.language.forced, - percent_score, subtitle_id, downloaded_provider, series_id, episode_id) + percent_score, subtitle_id, downloaded_provider, series_id, episode_id, + subtitle.language.hi) if media_type == 'series': use_pp_threshold = settings.general.getboolean('use_postprocessing_threshold') @@ -610,7 +612,7 @@ def manual_download_subtitle(path, language, audio_language, hi, forced, subtitl logging.debug('BAZARR Ended manually downloading Subtitles for file: ' + path) -def manual_upload_subtitle(path, language, forced, title, scene_name, media_type, subtitle, audio_language): +def manual_upload_subtitle(path, language, forced, hi, title, scene_name, media_type, subtitle, audio_language): logging.debug('BAZARR Manually uploading subtitles for this file: ' + path) single = settings.general.getboolean('single_language') @@ -663,11 +665,24 @@ def manual_upload_subtitle(path, language, forced, title, scene_name, media_type return subtitle_path = saved_subtitles[0].storage_path - message = language_from_alpha3(language) + (" forced" if forced else "") + " Subtitles manually uploaded." - uploaded_language_code3 = language - uploaded_language = language_from_alpha3(uploaded_language_code3) - uploaded_language_code2 = alpha2_from_alpha3(uploaded_language_code3) + if hi: + modifier_string = " HI" + elif forced: + modifier_string = " forced" + else: + modifier_string = "" + message = language_from_alpha3(language) + modifier_string + " Subtitles manually uploaded." + + if hi: + modifier_code = ":hi" + elif forced: + modifier_code = ":forced" + else: + modifier_code = "" + uploaded_language_code3 = language + modifier_code + uploaded_language = language_from_alpha3(language) + modifier_string + uploaded_language_code2 = alpha2_from_alpha3(language) + modifier_code audio_language_code2 = alpha2_from_language(audio_language) audio_language_code3 = alpha3_from_language(audio_language) @@ -694,7 +709,8 @@ def manual_upload_subtitle(path, language, forced, title, scene_name, media_type if use_postprocessing : command = pp_replace(postprocessing_cmd, path, subtitle_path, uploaded_language, uploaded_language_code2, uploaded_language_code3, audio_language, - audio_language_code2, audio_language_code3, forced, 100, "1", "manual", series_id, episode_id) + audio_language_code2, audio_language_code3, forced, 100, "1", "manual", series_id, + episode_id, hi=hi) postprocessing(command, path) if media_type == 'series': diff --git a/bazarr/helper.py b/bazarr/helper.py index 5b5fd798a..551a10fc8 100644 --- a/bazarr/helper.py +++ b/bazarr/helper.py @@ -96,16 +96,33 @@ class PathMappings: path_mappings = PathMappings() -def pp_replace(pp_command, episode, subtitles, language, language_code2, language_code3, episode_language, episode_language_code2, episode_language_code3, forced, score, subtitle_id, provider, series_id, episode_id): - is_forced = ":forced" if forced else "" - is_forced_string = " forced" if forced else "" +def pp_replace(pp_command, episode, subtitles, language, language_code2, language_code3, episode_language, episode_language_code2, episode_language_code3, forced, score, subtitle_id, provider, series_id, episode_id, hi): + if hi: + modifier_string = " HI" + elif forced: + modifier_string = " forced" + else: + modifier_string = "" + + if hi: + modifier_code = ":hi" + modifier_code_dot = ".hi" + elif forced: + modifier_code = ":forced" + modifier_code_dot = ".forced" + else: + modifier_code = "" + modifier_code_dot = "" + pp_command = pp_command.replace('{{directory}}', os.path.dirname(episode)) pp_command = pp_command.replace('{{episode}}', episode) pp_command = pp_command.replace('{{episode_name}}', os.path.splitext(os.path.basename(episode))[0]) pp_command = pp_command.replace('{{subtitles}}', str(subtitles)) - pp_command = pp_command.replace('{{subtitles_language}}', str(language) + is_forced_string) - pp_command = pp_command.replace('{{subtitles_language_code2}}', str(language_code2) + is_forced) - pp_command = pp_command.replace('{{subtitles_language_code3}}', str(language_code3) + is_forced) + pp_command = pp_command.replace('{{subtitles_language}}', str(language) + modifier_string) + pp_command = pp_command.replace('{{subtitles_language_code2}}', str(language_code2) + modifier_code) + pp_command = pp_command.replace('{{subtitles_language_code3}}', str(language_code3) + modifier_code) + pp_command = pp_command.replace('{{subtitles_language_code2_dot}}', str(language_code2) + modifier_code_dot) + pp_command = pp_command.replace('{{subtitles_language_code3_dot}}', str(language_code3) + modifier_code_dot) pp_command = pp_command.replace('{{episode_language}}', str(episode_language)) pp_command = pp_command.replace('{{episode_language_code2}}', str(episode_language_code2)) pp_command = pp_command.replace('{{episode_language_code3}}', str(episode_language_code3)) diff --git a/frontend/src/Settings/Subtitles/index.tsx b/frontend/src/Settings/Subtitles/index.tsx index 66ddbd2e3..4f5f05db9 100644 --- a/frontend/src/Settings/Subtitles/index.tsx +++ b/frontend/src/Settings/Subtitles/index.tsx @@ -423,14 +423,25 @@ const SettingsSubtitlesView: FunctionComponent = () => { {"{{subtitles_language}}"} Language of the subtitles file + (may include HI or forced) {"{{subtitles_language_code2}}"} 2-letter ISO-639 language - code of the subtitles language + code of the subtitles language (may include :hi or :forced) + + + {"{{subtitles_language_code2_dot}}"} 2-letter ISO-639 + language code of the subtitles language (same as previous but with + dot separator instead of colon) {"{{subtitles_language_code3}}"} 3-letter ISO-639 language - code of the subtitles language + code of the subtitles language (may include :hi or :forced) + + + {"{{subtitles_language_code3_dot}}"} 3-letter ISO-639 + language code of the subtitles language (same as previous but with + dot separator instead of colon) {"{{episode_language}}"} Audio language of the episode file From 7e48413493510f4f7e95b2b49bdd8b051e482d14 Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Wed, 25 Aug 2021 22:08:36 +0800 Subject: [PATCH 52/67] Add forced and hi checkbox to subtitle upload modal --- .../components/modals/MovieUploadModal.tsx | 48 +++--------------- .../components/modals/SubtitleUploadModal.tsx | 49 ++++++++++++++++++- 2 files changed, 54 insertions(+), 43 deletions(-) diff --git a/frontend/src/components/modals/MovieUploadModal.tsx b/frontend/src/components/modals/MovieUploadModal.tsx index 85e852f93..f96e77089 100644 --- a/frontend/src/components/modals/MovieUploadModal.tsx +++ b/frontend/src/components/modals/MovieUploadModal.tsx @@ -1,11 +1,8 @@ -import React, { FunctionComponent, useCallback, useMemo } from "react"; -import { Form } from "react-bootstrap"; -import { Column } from "react-table"; +import React, { FunctionComponent, useCallback } from "react"; import { dispatchTask } from "../../@modules/task"; import { createTask } from "../../@modules/task/utilities"; import { useProfileBy, useProfileItemsToLanguages } from "../../@redux/hooks"; import { MoviesApi } from "../../apis"; -import { BuildKey } from "../../utilities"; import { BaseModalProps } from "./BaseModal"; import { useModalInformation } from "./hooks"; import SubtitleUploadModal, { @@ -13,9 +10,7 @@ import SubtitleUploadModal, { Validator, } from "./SubtitleUploadModal"; -interface Payload { - forced: boolean; -} +interface Payload {} export const TaskGroupName = "Uploading Subtitles..."; @@ -67,11 +62,7 @@ const MovieUploadModal: FunctionComponent = (props) => { const tasks = items .filter((v) => v.language !== null) .map((v) => { - const { - file, - language, - payload: { forced }, - } = v; + const { file, language, forced, hi } = v; return createTask( file.name, @@ -79,9 +70,9 @@ const MovieUploadModal: FunctionComponent = (props) => { MoviesApi.uploadSubtitles.bind(MoviesApi), radarrId, { - file: file, + file, forced, - hi: false, + hi, language: language!.code2, } ); @@ -92,39 +83,12 @@ const MovieUploadModal: FunctionComponent = (props) => { [payload] ); - const columns = useMemo>[]>( - () => [ - { - id: "forced", - Header: "Forced", - accessor: "payload", - Cell: ({ row, value, update }) => { - const { original, index } = row; - return ( - { - const newInfo = { ...row.original }; - newInfo.payload.forced = v.target.checked; - update && update(row, newInfo); - }} - > - ); - }, - }, - ], - [] - ); - return ( { state: "valid" | "fetching" | "warning" | "error"; messages: string[]; language: Language.Info | null; + forced: boolean; + hi: boolean; payload: P; } @@ -67,6 +70,8 @@ export default function SubtitleUploadModal( state: "fetching", messages: [], language: initialLanguage, + forced: false, + hi: false, payload: { ...initialRef.current }, })); @@ -165,7 +170,48 @@ export default function SubtitleUploadModal( Header: "File", accessor: (d) => d.file.name, }, - ...columns, + { + id: "hi", + Header: "HI", + accessor: "hi", + Cell: ({ row, value, update }) => { + const { original, index } = row; + return ( + { + const newInfo = { ...row.original }; + newInfo.hi = v.target.checked; + update && update(row, newInfo); + }} + > + ); + }, + }, + { + id: "forced", + Header: "Forced", + accessor: "forced", + Cell: ({ row, value, update }) => { + const { original, index } = row; + return ( + { + const newInfo = { ...row.original }; + newInfo.forced = v.target.checked; + update && update(row, newInfo); + }} + > + ); + }, + }, { id: "language", Header: "Language", @@ -188,6 +234,7 @@ export default function SubtitleUploadModal( ); }, }, + ...columns, { id: "action", accessor: "file", From 50fb06b23a502c3a108c2e17038e4bfe85cbcd59 Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Thu, 26 Aug 2021 20:11:33 +0800 Subject: [PATCH 53/67] Fix a issue that hi and forced is not properly updated on series subtitle upload modal --- frontend/src/components/modals/SeriesUploadModal.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/frontend/src/components/modals/SeriesUploadModal.tsx b/frontend/src/components/modals/SeriesUploadModal.tsx index dd5a9040e..6f6245905 100644 --- a/frontend/src/components/modals/SeriesUploadModal.tsx +++ b/frontend/src/components/modals/SeriesUploadModal.tsx @@ -90,14 +90,15 @@ const SeriesUploadModal: FunctionComponent = ({ const tasks = items .filter((v) => v.payload.instance !== undefined) .map((v) => { - const { code2, hi, forced } = v.language!; - const { sonarrEpisodeId: episodeid } = v.payload.instance!; + const { hi, forced, payload, language } = v; + const { code2 } = language!; + const { sonarrEpisodeId: episodeid } = payload.instance!; const form: FormType.UploadSubtitle = { file: v.file, language: code2, - hi: hi ?? false, - forced: forced ?? false, + hi: hi, + forced: forced, }; return createTask( From 75d85d05517a7547d36195b309809adfc402a8de Mon Sep 17 00:00:00 2001 From: morpheus65535 Date: Thu, 26 Aug 2021 10:10:52 -0400 Subject: [PATCH 54/67] Fixed some issues with HI/forced in history and custom post-processing. #1516 --- bazarr/api.py | 12 ++++++++---- bazarr/helper.py | 10 +++++----- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/bazarr/api.py b/bazarr/api.py index d7ffab4f5..28d29b192 100644 --- a/bazarr/api.py +++ b/bazarr/api.py @@ -856,8 +856,8 @@ class EpisodesSubtitles(Resource): if sceneName is None: sceneName = "None" language = request.form.get('language') - forced = True if request.form.get('forced') == 'on' else False - hi = True if request.form.get('hi') == 'on' else False + forced = True if request.form.get('forced') == 'true' else False + hi = True if request.form.get('hi') == 'true' else False subFile = request.files.get('file') _, ext = os.path.splitext(subFile.filename) @@ -880,7 +880,9 @@ class EpisodesSubtitles(Resource): message = result[0] path = result[1] subs_path = result[2] - if forced: + if hi: + language_code = language + ":hi" + elif forced: language_code = language + ":forced" else: language_code = language @@ -1111,7 +1113,9 @@ class MoviesSubtitles(Resource): message = result[0] path = result[1] subs_path = result[2] - if forced: + if hi: + language_code = language + ":hi" + elif forced: language_code = language + ":forced" else: language_code = language diff --git a/bazarr/helper.py b/bazarr/helper.py index 551a10fc8..7b258af76 100644 --- a/bazarr/helper.py +++ b/bazarr/helper.py @@ -118,11 +118,11 @@ def pp_replace(pp_command, episode, subtitles, language, language_code2, languag pp_command = pp_command.replace('{{episode}}', episode) pp_command = pp_command.replace('{{episode_name}}', os.path.splitext(os.path.basename(episode))[0]) pp_command = pp_command.replace('{{subtitles}}', str(subtitles)) - pp_command = pp_command.replace('{{subtitles_language}}', str(language) + modifier_string) - pp_command = pp_command.replace('{{subtitles_language_code2}}', str(language_code2) + modifier_code) - pp_command = pp_command.replace('{{subtitles_language_code3}}', str(language_code3) + modifier_code) - pp_command = pp_command.replace('{{subtitles_language_code2_dot}}', str(language_code2) + modifier_code_dot) - pp_command = pp_command.replace('{{subtitles_language_code3_dot}}', str(language_code3) + modifier_code_dot) + pp_command = pp_command.replace('{{subtitles_language}}', str(language)) + pp_command = pp_command.replace('{{subtitles_language_code2}}', str(language_code2)) + pp_command = pp_command.replace('{{subtitles_language_code3}}', str(language_code3)) + pp_command = pp_command.replace('{{subtitles_language_code2_dot}}', str(language_code2).replace(':', '.')) + pp_command = pp_command.replace('{{subtitles_language_code3_dot}}', str(language_code3).replace(':', '.')) pp_command = pp_command.replace('{{episode_language}}', str(episode_language)) pp_command = pp_command.replace('{{episode_language_code2}}', str(episode_language_code2)) pp_command = pp_command.replace('{{episode_language_code3}}', str(episode_language_code3)) From 4887b3dcdd36da9a7637588aaeaa32c2e634953a Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Thu, 26 Aug 2021 23:34:56 +0800 Subject: [PATCH 55/67] no log: Remove pending subtitles after starting the upload process --- frontend/src/components/modals/SubtitleUploadModal.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/components/modals/SubtitleUploadModal.tsx b/frontend/src/components/modals/SubtitleUploadModal.tsx index ac6edd14b..eba982ed5 100644 --- a/frontend/src/components/modals/SubtitleUploadModal.tsx +++ b/frontend/src/components/modals/SubtitleUploadModal.tsx @@ -279,6 +279,7 @@ export default function SubtitleUploadModal( disabled={!canUpload || !showTable} onClick={() => { upload(pending); + setFiles([]); closeModal(); }} > From aa20633b64dfa20275e9134f6063bc6000323866 Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Sun, 29 Aug 2021 23:17:53 +0800 Subject: [PATCH 56/67] no log: Update gitignore list --- .gitignore | 5 ----- frontend/.gitignore | 4 ++++ 2 files changed, 4 insertions(+), 5 deletions(-) create mode 100644 frontend/.gitignore diff --git a/.gitignore b/.gitignore index f26da6724..702d69d74 100644 --- a/.gitignore +++ b/.gitignore @@ -21,8 +21,3 @@ VERSION # Allow !*.dll -# Frontend -node_modules -/frontend/dist -/frontend/*.local -/frontend/build diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 000000000..d6633a06d --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,4 @@ +node_modules +dist +*.local +build From 71f2ed20b3bde08b3382ebfeedb56bc9372ea146 Mon Sep 17 00:00:00 2001 From: morpheus65535 Date: Sun, 29 Aug 2021 16:15:05 -0400 Subject: [PATCH 57/67] Fixed an issue with series updated by SignalR feed not being updated in DB. --- bazarr/get_series.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bazarr/get_series.py b/bazarr/get_series.py index 98f77dcaf..45b0941f6 100644 --- a/bazarr/get_series.py +++ b/bazarr/get_series.py @@ -164,8 +164,7 @@ def update_one_series(series_id, action): series = None series_data = get_series_from_sonarr_api(url=url_sonarr(), apikey_sonarr=settings.sonarr.apikey, - sonarr_series_id=int(series_id), - sonarr_version=get_sonarr_info.version()) + sonarr_series_id=int(series_id)) if not series_data: return From 3b4e81db5eee45a73b7cee8b371e1f0649b01037 Mon Sep 17 00:00:00 2001 From: morpheus65535 Date: Sun, 29 Aug 2021 20:27:15 -0400 Subject: [PATCH 58/67] Fixed a search loop issue with missing subtitles for episodes. #1521 --- bazarr/get_subtitle.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/bazarr/get_subtitle.py b/bazarr/get_subtitle.py index 9f9f6212b..02956ad17 100644 --- a/bazarr/get_subtitle.py +++ b/bazarr/get_subtitle.py @@ -988,7 +988,7 @@ def movies_download_subtitles(no): hide_progress(id='movie_search_progress_{}'.format(no)) -def wanted_download_subtitles(sonarr_series_id): +def wanted_download_subtitles(sonarr_episode_id): episodes_details = TableEpisodes.select(TableEpisodes.path, TableEpisodes.missing_subtitles, TableEpisodes.sonarrEpisodeId, @@ -998,7 +998,7 @@ def wanted_download_subtitles(sonarr_series_id): TableEpisodes.failedAttempts, TableShows.title)\ .join(TableShows, on=(TableEpisodes.sonarrSeriesId == TableShows.sonarrSeriesId))\ - .where((TableEpisodes.sonarrSeriesId == sonarr_series_id))\ + .where((TableEpisodes.sonarrEpisodeId == sonarr_episode_id))\ .dicts() episodes_details = list(episodes_details) @@ -1162,6 +1162,7 @@ def wanted_search_missing_subtitles_series(): conditions = [(TableEpisodes.missing_subtitles != '[]')] conditions += get_exclusion_clause('series') episodes = TableEpisodes.select(TableEpisodes.sonarrSeriesId, + TableEpisodes.sonarrEpisodeId, TableShows.tags, TableEpisodes.monitored, TableShows.title, @@ -1187,7 +1188,7 @@ def wanted_search_missing_subtitles_series(): providers = get_providers() if providers: - wanted_download_subtitles(episode['sonarrSeriesId']) + wanted_download_subtitles(episode['sonarrEpisodeId']) else: logging.info("BAZARR All providers are throttled") return From da21e5dad0ce0631a9c02768f9ef9be535586fb4 Mon Sep 17 00:00:00 2001 From: LASER-Yi Date: Mon, 30 Aug 2021 00:45:25 +0800 Subject: [PATCH 59/67] no log: Support overriding backend server when developing UI --- frontend/.env | 7 -- frontend/.env.development | 24 ++++ frontend/README.md | 32 ++++- frontend/package-lock.json | 155 +++++++++++++++++++++--- frontend/package.json | 2 +- frontend/src/@modules/socketio/index.ts | 5 +- frontend/src/@redux/reducers/site.ts | 3 +- frontend/src/App/index.tsx | 9 +- frontend/src/Settings/General/index.tsx | 10 +- frontend/src/System/Logs/index.tsx | 8 +- frontend/src/apis/index.ts | 12 +- frontend/src/setupProxy.js | 16 ++- frontend/src/utilities/env.ts | 45 +++++++ frontend/src/utilities/hooks.ts | 23 +--- frontend/src/utilities/index.ts | 16 +-- frontend/src/utilities/logger.ts | 4 +- 16 files changed, 269 insertions(+), 102 deletions(-) delete mode 100644 frontend/.env create mode 100644 frontend/.env.development create mode 100644 frontend/src/utilities/env.ts diff --git a/frontend/.env b/frontend/.env deleted file mode 100644 index 0e600cd13..000000000 --- a/frontend/.env +++ /dev/null @@ -1,7 +0,0 @@ -# Please override by creating a .env.local file at the same directory -# Required -REACT_APP_APIKEY="YOUR_SERVER_API_KEY" - -# Optional -REACT_APP_CAN_UPDATE=true -REACT_APP_HAS_UPDATE=false \ No newline at end of file diff --git a/frontend/.env.development b/frontend/.env.development new file mode 100644 index 000000000..3b530d7a7 --- /dev/null +++ b/frontend/.env.development @@ -0,0 +1,24 @@ +# Override by duplicating and rename to .env.local +# The following environment variables will only be used during development + +# Required + +# API key of your backend +REACT_APP_APIKEY="REPLACE_ME_TO_YOUR_SERVER_API_KEY" + +# Address of your backend +REACT_APP_PROXY_URL=http://localhost:6767 + +# Optional + +# Allow Unsecured connection to your backend +REACT_APP_PROXY_SECURE=true + +# Allow websocket connection in Socket.IO +REACT_APP_ALLOW_WEBSOCKET=true + +# Display update section in settings +REACT_APP_CAN_UPDATE=true + +# Display update notification in notification center +REACT_APP_HAS_UPDATE=false diff --git a/frontend/README.md b/frontend/README.md index 05f866171..758aa35e9 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -1,10 +1,12 @@ # Bazarr Frontend ## Dependencies -* [Node.js](https://nodejs.org/) -* npm (included in Node.js) + +- [Node.js](https://nodejs.org/) +- npm (included in Node.js) ## Getting Started + 1. Clone or download this repository ``` @@ -17,18 +19,36 @@ ``` $ npm install ``` -4. Duplicate `.env` file and rename to `.env.local` + +3. Duplicate `.env.development` file and rename to `.env.local` ``` $ cp .env .env.local ``` -6. Fill any variable that defined in `.env.local` -7. Run Bazarr backend (Backend must listening on `http://localhost:6767`) + +4. Update your backend server's API key in `.env.local` + + ``` + # API key of your backend + REACT_APP_APIKEY="REPLACE_ME_TO_YOUR_SERVER_API_KEY" + ``` + +5. Change the address of your backend server (Optional) + + > http://localhost:6767 will be used by default + + ``` + # Address of your backend + REACT_APP_PROXY_URL=http://localhost:6767 + ``` + +6. Run Bazarr backend ``` $ python3 ../bazarr.py ``` -9. Run the web client for local development + +7. Run the web development tool ``` $ npm start diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 9f7c5b024..c8e85beac 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -28,7 +28,7 @@ "@types/react-table": "^7", "axios": "^0.21", "bootstrap": "^4", - "http-proxy-middleware": "^0.19", + "http-proxy-middleware": "^2", "lodash": "^4", "rc-slider": "^9.7", "react": "^17", @@ -3505,6 +3505,14 @@ "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==" }, + "node_modules/@types/http-proxy": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz", + "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/invariant": { "version": "2.2.34", "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.34.tgz", @@ -10490,17 +10498,82 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/http-proxy-middleware": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.2.tgz", - "integrity": "sha512-aYk1rTKqLTus23X3L96LGNCGNgWpG4cG0XoZIT1GUPhhulEHX/QalnO6Vbo+WmKWi4AL2IidjuC0wZtbpg0yhQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", + "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", "dependencies": { + "@types/http-proxy": "^1.17.5", "http-proxy": "^1.18.1", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" }, "engines": { - "node": ">=4.0.0" + "node": ">=12.0.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/http-proxy-middleware/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http-proxy-middleware/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/http-proxy-middleware/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, "node_modules/https-browserify": { @@ -24838,6 +24911,14 @@ "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==" }, + "@types/http-proxy": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz", + "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", + "requires": { + "@types/node": "*" + } + }, "@types/invariant": { "version": "2.2.34", "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.34.tgz", @@ -30290,14 +30371,60 @@ } }, "http-proxy-middleware": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.2.tgz", - "integrity": "sha512-aYk1rTKqLTus23X3L96LGNCGNgWpG4cG0XoZIT1GUPhhulEHX/QalnO6Vbo+WmKWi4AL2IidjuC0wZtbpg0yhQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", + "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", "requires": { + "@types/http-proxy": "^1.17.5", "http-proxy": "^1.18.1", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + } } }, "https-browserify": { diff --git a/frontend/package.json b/frontend/package.json index 223b0b1d7..a036be86e 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -32,7 +32,7 @@ "@types/react-table": "^7", "axios": "^0.21", "bootstrap": "^4", - "http-proxy-middleware": "^0.19", + "http-proxy-middleware": "^2", "lodash": "^4", "rc-slider": "^9.7", "react": "^17", diff --git a/frontend/src/@modules/socketio/index.ts b/frontend/src/@modules/socketio/index.ts index 23fbdd157..63c101089 100644 --- a/frontend/src/@modules/socketio/index.ts +++ b/frontend/src/@modules/socketio/index.ts @@ -1,6 +1,6 @@ import { debounce, forIn, remove, uniq } from "lodash"; import { io, Socket } from "socket.io-client"; -import { getBaseUrl } from "../../utilities"; +import { Environment } from "../../utilities"; import { conditionalLog, log } from "../../utilities/logger"; import { createDefaultReducer } from "./reducer"; @@ -12,9 +12,8 @@ class SocketIOClient { private reducers: SocketIO.Reducer[]; constructor() { - const baseUrl = getBaseUrl(); this.socket = io({ - path: `${baseUrl}/api/socket.io`, + path: `${Environment.baseUrl}/api/socket.io`, transports: ["polling", "websocket"], upgrade: true, rememberUpgrade: true, diff --git a/frontend/src/@redux/reducers/site.ts b/frontend/src/@redux/reducers/site.ts index 8999f973d..8381a95b4 100644 --- a/frontend/src/@redux/reducers/site.ts +++ b/frontend/src/@redux/reducers/site.ts @@ -1,6 +1,7 @@ import { createReducer } from "@reduxjs/toolkit"; import { intersectionWith, pullAllWith, remove, sortBy, uniqBy } from "lodash"; import apis from "../../apis"; +import { isProdEnv } from "../../utilities"; import { siteAddNotifications, siteAddProgress, @@ -59,7 +60,7 @@ const reducer = createReducer(defaultSite, (builder) => { state.initialized = "An Error Occurred When Initializing Bazarr UI"; }) .addCase(siteRedirectToAuth, (state) => { - if (process.env.NODE_ENV !== "production") { + if (!isProdEnv) { apis._resetApi("NEED_AUTH"); } state.auth = false; diff --git a/frontend/src/App/index.tsx b/frontend/src/App/index.tsx index 5d26fbd37..fb16aef60 100644 --- a/frontend/src/App/index.tsx +++ b/frontend/src/App/index.tsx @@ -20,7 +20,7 @@ import Sidebar from "../Sidebar"; import Auth from "../special-pages/AuthPage"; import ErrorBoundary from "../special-pages/ErrorBoundary"; import LaunchError from "../special-pages/LaunchError"; -import { useBaseUrl, useHasUpdateInject } from "../utilities"; +import { Environment } from "../utilities"; import Header from "./Header"; import Router from "./Router"; @@ -35,9 +35,8 @@ const App: FunctionComponent = () => { const notify = useNotification("has-update", 10 * 1000); // Has any update? - const hasUpdate = useHasUpdateInject(); useEffectOnceWhen(() => { - if (hasUpdate) { + if (Environment.hasUpdate) { notify({ type: "info", message: "A new version of Bazarr is ready, restart is required", @@ -80,14 +79,12 @@ const App: FunctionComponent = () => { }; const MainRouter: FunctionComponent = () => { - const baseUrl = useBaseUrl(); - useEffect(() => { Socketio.initialize(); }, []); return ( - + diff --git a/frontend/src/Settings/General/index.tsx b/frontend/src/Settings/General/index.tsx index 0049f1506..7476ef3d0 100644 --- a/frontend/src/Settings/General/index.tsx +++ b/frontend/src/Settings/General/index.tsx @@ -6,11 +6,7 @@ import { import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import React, { FunctionComponent, useState } from "react"; import { InputGroup } from "react-bootstrap"; -import { - copyToClipboard, - toggleState, - useCanUpdateInject, -} from "../../utilities"; +import { copyToClipboard, Environment, toggleState } from "../../utilities"; import { Button, Check, @@ -41,8 +37,6 @@ const baseUrlOverride = (settings: Settings) => const SettingsGeneralView: FunctionComponent = () => { const [copied, setCopy] = useState(false); - const canUpdate = useCanUpdateInject(); - return ( @@ -155,7 +149,7 @@ const SettingsGeneralView: FunctionComponent = () => { -