diff options
| author | Matain <[email protected]> | 2022-06-12 23:34:56 +0800 |
|---|---|---|
| committer | Matain <[email protected]> | 2022-06-12 23:34:56 +0800 |
| commit | ea5d7cf003eeef30cb7bbe789c6ba7f314bf1ce4 (patch) | |
| tree | bff1bd7b0e8e8eb753d373b57f007bbe97f96c76 | |
| parent | 4fd2c8f646e48dd0c07d0c2041de52e9a4f8bc82 (diff) | |
| parent | 38571da24ac54137564be5e41b7a409009e2ee10 (diff) | |
Merge branch 'master' of https://github.com/haishanh/yacd into haishanh-master
74 files changed, 1438 insertions, 1314 deletions
diff --git a/.eslintrc.yml b/.eslintrc.yml index d3b7d05..3595855 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -16,7 +16,6 @@ extends: env: node: true - jest: true globals: __DEV__: true diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 341e876..658da3c 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -6,9 +6,108 @@ jobs: build: runs-on: ubuntu-latest steps: - - name: Checkout Dashboard code - uses: actions/checkout@v3 - - uses: pnpm/action-setup@v2 + - uses: actions/checkout@v3 + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + + - name: Cache pnpm modules + uses: actions/cache@v3 + with: + path: ~/.pnpm-store + key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}- + + - uses: pnpm/[email protected] + with: + version: 7 + run_install: true + + - name: Lint + run: pnpm lint + - name: Build + run: pnpm build + + - name: Create Release + if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags/') + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.ref }} + release_name: ${{ github.ref }} + draft: true + prerelease: false + - name: Create Tar Ball + if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags/') + run: tar cJf yacd.tar.xz public + - name: Upload Release Asset + if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags/') + id: upload-release-asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ./yacd.tar.xz + asset_name: yacd.tar.xz + asset_content_type: application/x-gzip + + - name: Push to gh-pages + if: github.event_name == 'push' && (startsWith(github.event.ref, 'refs/tags/') || github.event.ref == 'refs/heads/publish') + env: + GITHUB_TOKEN: ${{ secrets.TOKEN }} + PUBLISH_DIR: public + BRANCH: gh-pages + run: | + cd $PUBLISH_DIR + ls -l + git init + git config user.name "${GITHUB_ACTOR}" + git config user.email "${GITHUB_ACTOR}@noreply.github.com" + git add . + git status + git commit -m "Push to gh-pages" + git push -f https://$GITHUB_ACTOR:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git HEAD:$BRANCH + + - name: Send Notification + uses: haishanh/actions-telegram-notification@v1 + if: ${{ always() }} + with: + notification-token: ${{ secrets.TG_NOTIFICATION_TOKEN }} + job-status: ${{ job.status }} + + docker: + needs: install + runs-on: ubuntu-20.04 + if: github.event_name == 'push' && (startsWith(github.event.ref, 'refs/tags/') || startsWith(github.event.ref, 'refs/heads/v0.') || github.event.ref == 'refs/heads/master' || github.event.ref == 'refs/heads/test') + steps: + - uses: actions/checkout@v3 + + - name: Cache Docker layers + uses: actions/cache@v3 + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-buildx- + + - name: Docker meta + id: docker_meta + uses: docker/metadata-action@v4 + with: + images: haishanh/yacd + + # - name: Set up QEMU + # uses: docker/[email protected] + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v2 with: version: latest - name: Setup Nodejs @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Haishan + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/package.json b/package.json index d95bce2..8e9b896 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "start": "vite", "build": "vite build", "serve": "vite preview", - "pretty": "prettier --single-quote --write 'src/**/*.{js,scss,ts,tsx,md}'" + "pretty": "prettier --write 'src/**/*.{js,scss,ts,tsx,md}'", + "fmt": "pnpm lint && pnpm pretty" }, "browserslist": [ ">0.25%", @@ -27,20 +28,20 @@ "private": true, "license": "MIT", "dependencies": { - "@babel/runtime": "7.17.9", + "@babel/runtime": "7.18.3", "@fontsource/roboto-mono": "4.5.7", "@reach/tooltip": "0.17.0", "@reach/visually-hidden": "0.17.0", - "chart.js": "3.7.1", + "chart.js": "3.8.0", "clsx": "^1.1.0", - "core-js": "3.22.4", + "core-js": "3.22.8", "date-fns": "2.28.0", - "framer-motion": "6.3.3", + "framer-motion": "6.3.11", "history": "5.3.0", - "i18next": "21.7.1", + "i18next": "21.8.9", "i18next-browser-languagedetector": "6.1.4", - "i18next-http-backend": "1.4.0", - "immer": "9.0.12", + "i18next-http-backend": "1.4.1", + "immer": "9.0.14", "invariant": "^2.2.4", "lodash-es": "^4.17.21", "memoize-one": "6.0.0", @@ -48,21 +49,21 @@ "prop-types": "15.8.1", "react": "18.1.0", "react-dom": "18.1.0", - "react-feather": "^2.0.9", - "react-i18next": "11.16.9", - "react-icons": "4.3.1", + "react-feather": "^2.0.10", + "react-i18next": "11.17.1", + "react-icons": "4.4.0", "react-modal": "3.15.1", - "react-query": "3.38.1", + "react-query": "3.39.1", "react-router": "6.3.0", "react-router-dom": "6.3.0", - "react-switch": "^6.0.0", - "react-table": "7.7.0", + "react-switch": "^7.0.0", + "react-table": "7.8.0", "react-tabs": "5.1.0", "react-tiny-fab": "4.0.4", "react-window": "^1.8.5", - "recoil": "0.7.3-alpha.1", + "recoil": "0.7.3", "regenerator-runtime": "0.13.9", - "reselect": "4.1.5", + "reselect": "4.1.6", "tslib": "2.4.0", "use-asset": "1.0.4", "workbox-core": "6.5.3", @@ -72,39 +73,37 @@ "workbox-strategies": "6.5.3" }, "devDependencies": { - "@fontsource/inter": "4.5.10", + "@fontsource/inter": "4.5.11", "@types/invariant": "2.2.35", - "@types/jest": "27.5.0", "@types/lodash-es": "4.17.6", - "@types/react": "18.0.9", - "@types/react-dom": "18.0.3", + "@types/react": "18.0.12", + "@types/react-dom": "18.0.5", "@types/react-modal": "3.13.1", "@types/react-window": "1.8.5", - "@typescript-eslint/eslint-plugin": "5.22.0", - "@typescript-eslint/parser": "5.22.0", + "@typescript-eslint/eslint-plugin": "5.27.1", + "@typescript-eslint/parser": "5.27.1", "@vitejs/plugin-react": "1.3.2", "autoprefixer": "10.4.7", - "cssnano": "5.1.7", - "eslint": "8.15.0", + "cssnano": "5.1.11", + "eslint": "8.17.0", "eslint-config-airbnb-base": "15.0.0", "eslint-config-prettier": "8.5.0", "eslint-config-react-app": "7.0.1", "eslint-plugin-flowtype": "8.0.3", "eslint-plugin-import": "2.26.0", - "eslint-plugin-jest": "26.1.5", "eslint-plugin-jsx-a11y": "6.5.1", - "eslint-plugin-react": "7.29.4", + "eslint-plugin-react": "7.30.0", "eslint-plugin-react-hooks": "4.5.0", "eslint-plugin-simple-import-sort": "^7.0.0", - "postcss": "8.4.13", - "postcss-custom-media": "^8.0.0", + "postcss": "8.4.14", + "postcss-custom-media": "^8.0.2", "postcss-import": "14.1.0", "postcss-simple-vars": "^6.0.3", "prettier": "2.6.2", "resize-observer-polyfill": "^1.5.1", - "sass": "1.51.0", - "typescript": "4.6.4", - "vite": "2.9.8", + "sass": "1.52.3", + "typescript": "4.7.3", + "vite": "2.9.12", "vite-plugin-pwa": "0.12.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 93fc5c7..3265472 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,77 +1,75 @@ lockfileVersion: 5.4 specifiers: - '@babel/runtime': 7.17.9 - '@fontsource/inter': 4.5.10 + '@babel/runtime': 7.18.3 + '@fontsource/inter': 4.5.11 '@fontsource/roboto-mono': 4.5.7 '@reach/tooltip': 0.17.0 '@reach/visually-hidden': 0.17.0 '@types/invariant': 2.2.35 - '@types/jest': 27.5.0 '@types/lodash-es': 4.17.6 - '@types/react': 18.0.9 - '@types/react-dom': 18.0.3 + '@types/react': 18.0.12 + '@types/react-dom': 18.0.5 '@types/react-modal': 3.13.1 '@types/react-window': 1.8.5 - '@typescript-eslint/eslint-plugin': 5.22.0 - '@typescript-eslint/parser': 5.22.0 + '@typescript-eslint/eslint-plugin': 5.27.1 + '@typescript-eslint/parser': 5.27.1 '@vitejs/plugin-react': 1.3.2 autoprefixer: 10.4.7 - chart.js: 3.7.1 + chart.js: 3.8.0 clsx: ^1.1.0 - core-js: 3.22.4 - cssnano: 5.1.7 + core-js: 3.22.8 + cssnano: 5.1.11 date-fns: 2.28.0 - eslint: 8.15.0 + eslint: 8.17.0 eslint-config-airbnb-base: 15.0.0 eslint-config-prettier: 8.5.0 eslint-config-react-app: 7.0.1 eslint-plugin-flowtype: 8.0.3 eslint-plugin-import: 2.26.0 - eslint-plugin-jest: 26.1.5 eslint-plugin-jsx-a11y: 6.5.1 - eslint-plugin-react: 7.29.4 + eslint-plugin-react: 7.30.0 eslint-plugin-react-hooks: 4.5.0 eslint-plugin-simple-import-sort: ^7.0.0 - framer-motion: 6.3.3 + framer-motion: 6.3.11 history: 5.3.0 - i18next: 21.7.1 + i18next: 21.8.9 i18next-browser-languagedetector: 6.1.4 - i18next-http-backend: 1.4.0 - immer: 9.0.12 + i18next-http-backend: 1.4.1 + immer: 9.0.14 invariant: ^2.2.4 lodash-es: ^4.17.21 memoize-one: 6.0.0 modern-normalize: 1.1.0 - postcss: 8.4.13 - postcss-custom-media: ^8.0.0 + postcss: 8.4.14 + postcss-custom-media: ^8.0.2 postcss-import: 14.1.0 postcss-simple-vars: ^6.0.3 prettier: 2.6.2 prop-types: 15.8.1 react: 18.1.0 react-dom: 18.1.0 - react-feather: ^2.0.9 - react-i18next: 11.16.9 - react-icons: 4.3.1 + react-feather: ^2.0.10 + react-i18next: 11.17.1 + react-icons: 4.4.0 react-modal: 3.15.1 - react-query: 3.38.1 + react-query: 3.39.1 react-router: 6.3.0 react-router-dom: 6.3.0 - react-switch: ^6.0.0 - react-table: 7.7.0 + react-switch: ^7.0.0 + react-table: 7.8.0 react-tabs: 5.1.0 react-tiny-fab: 4.0.4 react-window: ^1.8.5 - recoil: 0.7.3-alpha.1 + recoil: 0.7.3 regenerator-runtime: 0.13.9 - reselect: 4.1.5 + reselect: 4.1.6 resize-observer-polyfill: ^1.5.1 - sass: 1.51.0 + sass: 1.52.3 tslib: 2.4.0 - typescript: 4.6.4 + typescript: 4.7.3 use-asset: 1.0.4 - vite: 2.9.8 + vite: 2.9.12 vite-plugin-pwa: 0.12.0 workbox-core: 6.5.3 workbox-expiration: 6.5.3 @@ -80,20 +78,20 @@ specifiers: workbox-strategies: 6.5.3 dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 '@fontsource/roboto-mono': 4.5.7 '@reach/tooltip': 0.17.0_ef5jwxihqo6n7gxfmzogljlgcm '@reach/visually-hidden': 0.17.0_ef5jwxihqo6n7gxfmzogljlgcm - chart.js: 3.7.1 + chart.js: 3.8.0 clsx: 1.1.1 - core-js: 3.22.4 + core-js: 3.22.8 date-fns: 2.28.0 - framer-motion: 6.3.3_ef5jwxihqo6n7gxfmzogljlgcm + framer-motion: 6.3.11_ef5jwxihqo6n7gxfmzogljlgcm history: 5.3.0 - i18next: 21.7.1 + i18next: 21.8.9 i18next-browser-languagedetector: 6.1.4 - i18next-http-backend: 1.4.0 - immer: 9.0.12 + i18next-http-backend: 1.4.1 + immer: 9.0.14 invariant: 2.2.4 lodash-es: 4.17.21 memoize-one: 6.0.0 @@ -101,21 +99,21 @@ dependencies: prop-types: 15.8.1 react: 18.1.0 react-dom: [email protected] - react-feather: [email protected] - react-i18next: 11.16.9_2xmduy7g43rnjce2rgborrjowa - react-icons: [email protected] + react-feather: [email protected] + react-i18next: 11.17.1_yu4sb4vmu5dvmheeaa2fohstne + react-icons: [email protected] react-modal: 3.15.1_ef5jwxihqo6n7gxfmzogljlgcm - react-query: 3.38.1_ef5jwxihqo6n7gxfmzogljlgcm + react-query: 3.39.1_ef5jwxihqo6n7gxfmzogljlgcm react-router: [email protected] react-router-dom: 6.3.0_ef5jwxihqo6n7gxfmzogljlgcm - react-switch: 6.0.0_ef5jwxihqo6n7gxfmzogljlgcm - react-table: [email protected] + react-switch: 7.0.0_ef5jwxihqo6n7gxfmzogljlgcm + react-table: [email protected] react-tabs: [email protected] react-tiny-fab: [email protected] react-window: 1.8.7_ef5jwxihqo6n7gxfmzogljlgcm - recoil: 0.7.3-alpha.1_ef5jwxihqo6n7gxfmzogljlgcm + recoil: 0.7.3_ef5jwxihqo6n7gxfmzogljlgcm regenerator-runtime: 0.13.9 - reselect: 4.1.5 + reselect: 4.1.6 tslib: 2.4.0 use-asset: [email protected] workbox-core: 6.5.3 @@ -125,40 +123,38 @@ dependencies: workbox-strategies: 6.5.3 devDependencies: - '@fontsource/inter': 4.5.10 + '@fontsource/inter': 4.5.11 '@types/invariant': 2.2.35 - '@types/jest': 27.5.0 '@types/lodash-es': 4.17.6 - '@types/react': 18.0.9 - '@types/react-dom': 18.0.3 + '@types/react': 18.0.12 + '@types/react-dom': 18.0.5 '@types/react-modal': 3.13.1 '@types/react-window': 1.8.5 - '@typescript-eslint/eslint-plugin': 5.22.0_tal4xlmvnofklupd3hwjtzfb4q - '@typescript-eslint/parser': 5.22.0_hcfsmds2fshutdssjqluwm76uu + '@typescript-eslint/eslint-plugin': 5.27.1_aq7uryhocdbvbqum33pitcm3y4 + '@typescript-eslint/parser': 5.27.1_ud6rd4xtew5bv4yhvkvu24pzm4 '@vitejs/plugin-react': 1.3.2 - autoprefixer: [email protected] - cssnano: [email protected] - eslint: 8.15.0 - eslint-config-airbnb-base: 15.0.0_gwd37gqv3vjv3xlpl7ju3ag2qu - eslint-config-prettier: [email protected] - eslint-config-react-app: 7.0.1_hcfsmds2fshutdssjqluwm76uu - eslint-plugin-flowtype: [email protected] - eslint-plugin-import: [email protected] - eslint-plugin-jest: 26.1.5_izigq5cravd5ahn2yqozpc2que - eslint-plugin-jsx-a11y: [email protected] - eslint-plugin-react: [email protected] - eslint-plugin-react-hooks: [email protected] - eslint-plugin-simple-import-sort: [email protected] - postcss: 8.4.13 - postcss-custom-media: [email protected] - postcss-import: [email protected] - postcss-simple-vars: [email protected] + autoprefixer: [email protected] + cssnano: [email protected] + eslint: 8.17.0 + eslint-config-airbnb-base: 15.0.0_3yxiwxzsqipdmy4jwrlv6vgfmy + eslint-config-prettier: [email protected] + eslint-config-react-app: 7.0.1_ud6rd4xtew5bv4yhvkvu24pzm4 + eslint-plugin-flowtype: [email protected] + eslint-plugin-import: 2.26.0_pv5w3e62ssxduf5aiwxbc3knra + eslint-plugin-jsx-a11y: [email protected] + eslint-plugin-react: [email protected] + eslint-plugin-react-hooks: [email protected] + eslint-plugin-simple-import-sort: [email protected] + postcss: 8.4.14 + postcss-custom-media: [email protected] + postcss-import: [email protected] + postcss-simple-vars: [email protected] prettier: 2.6.2 resize-observer-polyfill: 1.5.1 - sass: 1.51.0 - typescript: 4.6.4 - vite: [email protected] - vite-plugin-pwa: [email protected] + sass: 1.52.3 + typescript: 4.7.3 + vite: [email protected] + vite-plugin-pwa: [email protected] packages: @@ -217,7 +213,7 @@ packages: - supports-color dev: true - /@babel/eslint-parser/7.17.0_annt2i75qyqp7sfsklqkwkfeaa: + /@babel/eslint-parser/7.17.0_eko6nswhjkkmiiwhnyhdta6g74: resolution: {integrity: sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: @@ -225,7 +221,7 @@ packages: eslint: ^7.5.0 || ^8.0.0 dependencies: '@babel/core': 7.17.10 - eslint: 8.15.0 + eslint: 8.17.0 eslint-scope: 5.1.1 eslint-visitor-keys: 2.1.0 semver: 6.3.0 @@ -240,6 +236,15 @@ packages: jsesc: 2.5.2 dev: true + /@babel/generator/7.18.2: + resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.18.4 + '@jridgewell/gen-mapping': 0.3.1 + jsesc: 2.5.2 + dev: true + /@babel/helper-annotate-as-pure/7.16.7: resolution: {integrity: sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==} engines: {node: '>=6.9.0'} @@ -286,6 +291,24 @@ packages: - supports-color dev: true + /@babel/helper-create-class-features-plugin/7.18.0_@[email protected]: + resolution: {integrity: sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.17.10 + '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-environment-visitor': 7.18.2 + '@babel/helper-function-name': 7.17.9 + '@babel/helper-member-expression-to-functions': 7.17.7 + '@babel/helper-optimise-call-expression': 7.16.7 + '@babel/helper-replace-supers': 7.18.2 + '@babel/helper-split-export-declaration': 7.16.7 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helper-create-regexp-features-plugin/7.17.0_@[email protected]: resolution: {integrity: sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==} engines: {node: '>=6.9.0'} @@ -322,6 +345,11 @@ packages: '@babel/types': 7.17.10 dev: true + /@babel/helper-environment-visitor/7.18.2: + resolution: {integrity: sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-explode-assignable-expression/7.16.7: resolution: {integrity: sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==} engines: {node: '>=6.9.0'} @@ -386,6 +414,11 @@ packages: engines: {node: '>=6.9.0'} dev: true + /@babel/helper-plugin-utils/7.17.12: + resolution: {integrity: sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-remap-async-to-generator/7.16.8: resolution: {integrity: sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==} engines: {node: '>=6.9.0'} @@ -410,6 +443,19 @@ packages: - supports-color dev: true + /@babel/helper-replace-supers/7.18.2: + resolution: {integrity: sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.2 + '@babel/helper-member-expression-to-functions': 7.17.7 + '@babel/helper-optimise-call-expression': 7.16.7 + '@babel/traverse': 7.18.2 + '@babel/types': 7.18.4 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helper-simple-access/7.17.7: resolution: {integrity: sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==} engines: {node: '>=6.9.0'} @@ -477,6 +523,16 @@ packages: resolution: {integrity: sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ==} engines: {node: '>=6.0.0'} hasBin: true + dependencies: + '@babel/types': 7.17.10 + dev: true + + /@babel/parser/7.18.4: + resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.18.4 dev: true /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@[email protected]: @@ -690,6 +746,21 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-private-property-in-object/7.17.12_@[email protected]: + resolution: {integrity: sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.10 + '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-create-class-features-plugin': 7.18.0_@[email protected] + '@babel/helper-plugin-utils': 7.17.12 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@[email protected] + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-unicode-property-regex/7.16.7_@[email protected]: resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} engines: {node: '>=4'} @@ -1472,8 +1543,8 @@ packages: regenerator-runtime: 0.13.9 dev: true - /@babel/runtime/7.17.9: - resolution: {integrity: sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==} + /@babel/runtime/7.18.3: + resolution: {integrity: sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.9 @@ -1505,6 +1576,24 @@ packages: - supports-color dev: true + /@babel/traverse/7.18.2: + resolution: {integrity: sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.16.7 + '@babel/generator': 7.18.2 + '@babel/helper-environment-visitor': 7.18.2 + '@babel/helper-function-name': 7.17.9 + '@babel/helper-hoist-variables': 7.16.7 + '@babel/helper-split-export-declaration': 7.16.7 + '@babel/parser': 7.18.4 + '@babel/types': 7.18.4 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/types/7.17.10: resolution: {integrity: sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A==} engines: {node: '>=6.9.0'} @@ -1513,6 +1602,14 @@ packages: to-fast-properties: 2.0.0 dev: true + /@babel/types/7.18.4: + resolution: {integrity: sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.16.7 + to-fast-properties: 2.0.0 + dev: true + /@emotion/is-prop-valid/0.8.8: resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} requiresBuild: true @@ -1526,14 +1623,14 @@ packages: dev: false optional: true - /@eslint/eslintrc/1.2.3: - resolution: {integrity: sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA==} + /@eslint/eslintrc/1.3.0: + resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 espree: 9.3.2 - globals: 13.13.0 + globals: 13.15.0 ignore: 5.2.0 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -1543,8 +1640,8 @@ packages: - supports-color dev: true - /@fontsource/inter/4.5.10: - resolution: {integrity: sha512-YOt2/K8yo25MVBjrTImHxVimmyZEt0GcrWp2w7O29sdFX9SJqbGlOqjFJ1wI5yBbP6AmTeimyPE0UC/jjFRoIA==} + /@fontsource/inter/4.5.11: + resolution: {integrity: sha512-toizzQkfXL8YJcG/f8j3EYXYGQe4OxiDEItThSigvHU+cYNDw8HPp3wLYQX745hddsnHqOGCM4exitFSBOU8+w==} dev: true /@fontsource/roboto-mono/4.5.7: @@ -1574,6 +1671,15 @@ packages: '@jridgewell/sourcemap-codec': 1.4.13 dev: true + /@jridgewell/gen-mapping/0.3.1: + resolution: {integrity: sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.1 + '@jridgewell/sourcemap-codec': 1.4.13 + '@jridgewell/trace-mapping': 0.3.13 + dev: true + /@jridgewell/resolve-uri/3.0.7: resolution: {integrity: sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==} engines: {node: '>=6.0.0'} @@ -1595,6 +1701,13 @@ packages: '@jridgewell/sourcemap-codec': 1.4.13 dev: true + /@jridgewell/trace-mapping/0.3.13: + resolution: {integrity: sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==} + dependencies: + '@jridgewell/resolve-uri': 3.0.7 + '@jridgewell/sourcemap-codec': 1.4.13 + dev: true + /@nodelib/fs.scandir/2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1790,13 +1903,6 @@ packages: resolution: {integrity: sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg==} dev: true - /@types/jest/27.5.0: - resolution: {integrity: sha512-9RBFx7r4k+msyj/arpfaa0WOOEcaAZNmN+j80KFbFCoSqCJGHTz7YMAMGQW9Xmqm5w6l5c25vbSjMwlikJi5+g==} - dependencies: - jest-matcher-utils: 27.5.1 - pretty-format: 27.5.1 - dev: true - /@types/json-schema/7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true @@ -1827,30 +1933,30 @@ packages: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} dev: true - /@types/react-dom/18.0.3: - resolution: {integrity: sha512-1RRW9kst+67gveJRYPxGmVy8eVJ05O43hg77G2j5m76/RFJtMbcfAs2viQ2UNsvvDg8F7OfQZx8qQcl6ymygaQ==} + /@types/react-dom/18.0.5: + resolution: {integrity: sha512-OWPWTUrY/NIrjsAPkAk1wW9LZeIjSvkXRhclsFO8CZcZGCOg2G0YZy4ft+rOyYxy8B7ui5iZzi9OkDebZ7/QSA==} dependencies: - '@types/react': 18.0.9 + '@types/react': 18.0.12 dev: true /@types/react-modal/3.13.1: resolution: {integrity: sha512-iY/gPvTDIy6Z+37l+ibmrY+GTV4KQTHcCyR5FIytm182RQS69G5ps4PH2FxtC7bAQ2QRHXMevsBgck7IQruHNg==} dependencies: - '@types/react': 18.0.9 + '@types/react': 18.0.12 dev: true /@types/react-window/1.8.5: resolution: {integrity: sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw==} dependencies: - '@types/react': 18.0.9 + '@types/react': 18.0.12 dev: true - /@types/react/18.0.9: - resolution: {integrity: sha512-9bjbg1hJHUm4De19L1cHiW0Jvx3geel6Qczhjd0qY5VKVE2X5+x77YxAepuCwVh4vrgZJdgEJw48zrhRIeF4Nw==} + /@types/react/18.0.12: + resolution: {integrity: sha512-duF1OTASSBQtcigUvhuiTB1Ya3OvSy+xORCiEf20H0P0lzx+/KeVsA99U5UjLXSbyo1DRJDlLKqTeM1ngosqtg==} dependencies: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.2 - csstype: 3.0.11 + csstype: 3.1.0 dev: true /@types/resolve/1.17.1: @@ -1867,8 +1973,8 @@ packages: resolution: {integrity: sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==} dev: true - /@typescript-eslint/eslint-plugin/5.22.0_tal4xlmvnofklupd3hwjtzfb4q: - resolution: {integrity: sha512-YCiy5PUzpAeOPGQ7VSGDEY2NeYUV1B0swde2e0HzokRsHBYjSdF6DZ51OuRZxVPHx0032lXGLvOMls91D8FXlg==} + /@typescript-eslint/eslint-plugin/5.27.1_aq7uryhocdbvbqum33pitcm3y4: + resolution: {integrity: sha512-6dM5NKT57ZduNnJfpY81Phe9nc9wolnMCnknb1im6brWi1RYv84nbMS3olJa27B6+irUVV1X/Wb+Am0FjJdGFw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -1878,37 +1984,37 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.22.0_hcfsmds2fshutdssjqluwm76uu - '@typescript-eslint/scope-manager': 5.22.0 - '@typescript-eslint/type-utils': 5.22.0_hcfsmds2fshutdssjqluwm76uu - '@typescript-eslint/utils': 5.22.0_hcfsmds2fshutdssjqluwm76uu + '@typescript-eslint/parser': 5.27.1_ud6rd4xtew5bv4yhvkvu24pzm4 + '@typescript-eslint/scope-manager': 5.27.1 + '@typescript-eslint/type-utils': 5.27.1_ud6rd4xtew5bv4yhvkvu24pzm4 + '@typescript-eslint/utils': 5.27.1_ud6rd4xtew5bv4yhvkvu24pzm4 debug: 4.3.4 - eslint: 8.15.0 + eslint: 8.17.0 functional-red-black-tree: 1.0.1 ignore: 5.2.0 regexpp: 3.2.0 semver: 7.3.7 - tsutils: [email protected] - typescript: 4.6.4 + tsutils: [email protected] + typescript: 4.7.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/experimental-utils/5.22.0_hcfsmds2fshutdssjqluwm76uu: + /@typescript-eslint/experimental-utils/5.22.0_ud6rd4xtew5bv4yhvkvu24pzm4: resolution: {integrity: sha512-rKxoCUtAHwEH6IcAoVpqipY6Th+YKW7WFspAKu0IFdbdKZpveFBeqxxE9Xn+GWikhq1o03V3VXbxIe+GdhggiQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.22.0_hcfsmds2fshutdssjqluwm76uu - eslint: 8.15.0 + '@typescript-eslint/utils': 5.22.0_ud6rd4xtew5bv4yhvkvu24pzm4 + eslint: 8.17.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/parser/5.22.0_hcfsmds2fshutdssjqluwm76uu: - resolution: {integrity: sha512-piwC4krUpRDqPaPbFaycN70KCP87+PC5WZmrWs+DlVOxxmF+zI6b6hETv7Quy4s9wbkV16ikMeZgXsvzwI3icQ==} + /@typescript-eslint/parser/5.27.1_ud6rd4xtew5bv4yhvkvu24pzm4: + resolution: {integrity: sha512-7Va2ZOkHi5NP+AZwb5ReLgNF6nWLGTeUJfxdkVUAPPSaAdbWNnFZzLZ4EGGmmiCTg+AwlbE1KyUYTBglosSLHQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1917,12 +2023,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.22.0 - '@typescript-eslint/types': 5.22.0 - '@typescript-eslint/typescript-estree': [email protected] + '@typescript-eslint/scope-manager': 5.27.1 + '@typescript-eslint/types': 5.27.1 + '@typescript-eslint/typescript-estree': [email protected] debug: 4.3.4 - eslint: 8.15.0 - typescript: 4.6.4 + eslint: 8.17.0 + typescript: 4.7.3 transitivePeerDependencies: - supports-color dev: true @@ -1935,8 +2041,24 @@ packages: '@typescript-eslint/visitor-keys': 5.22.0 dev: true - /@typescript-eslint/type-utils/5.22.0_hcfsmds2fshutdssjqluwm76uu: - resolution: {integrity: sha512-iqfLZIsZhK2OEJ4cQ01xOq3NaCuG5FQRKyHicA3xhZxMgaxQazLUHbH/B2k9y5i7l3+o+B5ND9Mf1AWETeMISA==} + /@typescript-eslint/scope-manager/5.27.0: + resolution: {integrity: sha512-VnykheBQ/sHd1Vt0LJ1JLrMH1GzHO+SzX6VTXuStISIsvRiurue/eRkTqSrG0CexHQgKG8shyJfR4o5VYioB9g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.27.0 + '@typescript-eslint/visitor-keys': 5.27.0 + dev: true + + /@typescript-eslint/scope-manager/5.27.1: + resolution: {integrity: sha512-fQEOSa/QroWE6fAEg+bJxtRZJTH8NTskggybogHt4H9Da8zd4cJji76gA5SBlR0MgtwF7rebxTbDKB49YUCpAg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.27.1 + '@typescript-eslint/visitor-keys': 5.27.1 + dev: true + + /@typescript-eslint/type-utils/5.27.1_ud6rd4xtew5bv4yhvkvu24pzm4: + resolution: {integrity: sha512-+UC1vVUWaDHRnC2cQrCJ4QtVjpjjCgjNFpg8b03nERmkHv9JV9X5M19D7UFMd+/G7T/sgFwX2pGmWK38rqyvXw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -1945,11 +2067,11 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/utils': 5.22.0_hcfsmds2fshutdssjqluwm76uu + '@typescript-eslint/utils': 5.27.1_ud6rd4xtew5bv4yhvkvu24pzm4 debug: 4.3.4 - eslint: 8.15.0 - tsutils: [email protected] - typescript: 4.6.4 + eslint: 8.17.0 + tsutils: [email protected] + typescript: 4.7.3 transitivePeerDependencies: - supports-color dev: true @@ -1959,7 +2081,17 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/[email protected]: + /@typescript-eslint/types/5.27.0: + resolution: {integrity: sha512-lY6C7oGm9a/GWhmUDOs3xAVRz4ty/XKlQ2fOLr8GAIryGn0+UBOoJDWyHer3UgrHkenorwvBnphhP+zPmzmw0A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/types/5.27.1: + resolution: {integrity: sha512-LgogNVkBhCTZU/m8XgEYIWICD6m4dmEDbKXESCbqOXfKZxRKeqpiJXQIErv66sdopRKZPo5l32ymNqibYEH/xg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree/[email protected]: resolution: {integrity: sha512-EyBEQxvNjg80yinGE2xdhpDYm41so/1kOItl0qrjIiJ1kX/L/L8WWGmJg8ni6eG3DwqmOzDqOhe6763bF92nOw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1974,13 +2106,55 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.7 - tsutils: [email protected] - typescript: 4.6.4 + tsutils: [email protected] + typescript: 4.7.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.22.0_hcfsmds2fshutdssjqluwm76uu: + /@typescript-eslint/typescript-estree/[email protected]: + resolution: {integrity: sha512-QywPMFvgZ+MHSLRofLI7BDL+UczFFHyj0vF5ibeChDAJgdTV8k4xgEwF0geFhVlPc1p8r70eYewzpo6ps+9LJQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.27.0 + '@typescript-eslint/visitor-keys': 5.27.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.3.7 + tsutils: [email protected] + typescript: 4.7.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree/[email protected]: + resolution: {integrity: sha512-DnZvvq3TAJ5ke+hk0LklvxwYsnXpRdqUY5gaVS0D4raKtbznPz71UJGnPTHEFo0GDxqLOLdMkkmVZjSpET1hFw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.27.1 + '@typescript-eslint/visitor-keys': 5.27.1 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.3.7 + tsutils: [email protected] + typescript: 4.7.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils/5.22.0_ud6rd4xtew5bv4yhvkvu24pzm4: resolution: {integrity: sha512-HodsGb037iobrWSUMS7QH6Hl1kppikjA1ELiJlNSTYf/UdMEwzgj0WIp+lBNb6WZ3zTwb0tEz51j0Wee3iJ3wQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1989,10 +2163,46 @@ packages: '@types/json-schema': 7.0.11 '@typescript-eslint/scope-manager': 5.22.0 '@typescript-eslint/types': 5.22.0 - '@typescript-eslint/typescript-estree': [email protected] - eslint: 8.15.0 + '@typescript-eslint/typescript-estree': [email protected] + eslint: 8.17.0 + eslint-scope: 5.1.1 + eslint-utils: [email protected] + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils/5.27.0_ud6rd4xtew5bv4yhvkvu24pzm4: + resolution: {integrity: sha512-nZvCrkIJppym7cIbP3pOwIkAefXOmfGPnCM0LQfzNaKxJHI6VjI8NC662uoiPlaf5f6ymkTy9C3NQXev2mdXmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.11 + '@typescript-eslint/scope-manager': 5.27.0 + '@typescript-eslint/types': 5.27.0 + '@typescript-eslint/typescript-estree': [email protected] + eslint: 8.17.0 + eslint-scope: 5.1.1 + eslint-utils: [email protected] + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils/5.27.1_ud6rd4xtew5bv4yhvkvu24pzm4: + resolution: {integrity: sha512-mZ9WEn1ZLDaVrhRaYgzbkXBkTPghPFsup8zDbbsYTxC5OmqrFE7skkKS/sraVsLP3TcT3Ki5CSyEFBRkLH/H/w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.11 + '@typescript-eslint/scope-manager': 5.27.1 + '@typescript-eslint/types': 5.27.1 + '@typescript-eslint/typescript-estree': [email protected] + eslint: 8.17.0 eslint-scope: 5.1.1 - eslint-utils: [email protected] + eslint-utils: [email protected] transitivePeerDependencies: - supports-color - typescript @@ -2006,6 +2216,22 @@ packages: eslint-visitor-keys: 3.3.0 dev: true + /@typescript-eslint/visitor-keys/5.27.0: + resolution: {integrity: sha512-46cYrteA2MrIAjv9ai44OQDUoCZyHeGIc4lsjCUX2WT6r4C+kidz1bNiR4017wHOPUythYeH+Sc7/cFP97KEAA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.27.0 + eslint-visitor-keys: 3.3.0 + dev: true + + /@typescript-eslint/visitor-keys/5.27.1: + resolution: {integrity: sha512-xYs6ffo01nhdJgPieyk7HAOpjhTsx7r/oB9LWEhwAXgwn33tkr+W8DI2ChboqhZlC4q3TC6geDYPoiX8ROqyOQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.27.1 + eslint-visitor-keys: 3.3.0 + dev: true + /@vitejs/plugin-react/1.3.2: resolution: {integrity: sha512-aurBNmMo0kz1O4qRoY+FM4epSA39y3ShWGuqfLRA/3z0oEJAdtoSfgA3aO98/PCCHAqMaduLxIxErWrVKIFzXA==} engines: {node: '>=12.0.0'} @@ -2073,11 +2299,6 @@ packages: color-convert: 2.0.1 dev: true - /ansi-styles/5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - /anymatch/3.1.2: resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} engines: {node: '>= 8'} @@ -2094,7 +2315,7 @@ packages: resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==} engines: {node: '>=6.0'} dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 '@babel/runtime-corejs3': 7.17.9 dev: true @@ -2130,7 +2351,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.0 + es-abstract: 1.20.1 es-shim-unscopables: 1.0.0 dev: true @@ -2147,7 +2368,7 @@ packages: engines: {node: '>= 4.0.0'} dev: true - /autoprefixer/[email protected]: + /autoprefixer/[email protected]: resolution: {integrity: sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -2159,7 +2380,7 @@ packages: fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.13 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: true @@ -2182,7 +2403,7 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 cosmiconfig: 7.0.1 resolve: 1.22.0 dev: true @@ -2237,13 +2458,14 @@ packages: '@babel/plugin-proposal-numeric-separator': 7.16.7_@[email protected] '@babel/plugin-proposal-optional-chaining': 7.16.7_@[email protected] '@babel/plugin-proposal-private-methods': 7.16.11_@[email protected] + '@babel/plugin-proposal-private-property-in-object': 7.17.12_@[email protected] '@babel/plugin-transform-flow-strip-types': 7.16.7_@[email protected] '@babel/plugin-transform-react-display-name': 7.16.7_@[email protected] '@babel/plugin-transform-runtime': 7.17.10_@[email protected] '@babel/preset-env': 7.17.10_@[email protected] '@babel/preset-react': 7.16.7_@[email protected] '@babel/preset-typescript': 7.16.7_@[email protected] - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 babel-plugin-macros: 3.1.0 babel-plugin-transform-react-remove-prop-types: 0.4.24 transitivePeerDependencies: @@ -2264,7 +2486,7 @@ packages: dev: true /boolbase/1.0.0: - resolution: {integrity: sha1-aN/1++YMUes3cl6p4+0xDcwed24=} + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} dev: true /brace-expansion/1.1.11: @@ -2289,7 +2511,7 @@ packages: /broadcast-channel/3.7.0: resolution: {integrity: sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==} dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 detect-node: 2.1.0 js-sha3: 0.8.0 microseconds: 0.2.0 @@ -2336,7 +2558,7 @@ packages: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: browserslist: 4.20.3 - caniuse-lite: 1.0.30001338 + caniuse-lite: 1.0.30001346 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: true @@ -2345,6 +2567,10 @@ packages: resolution: {integrity: sha512-1gLHWyfVoRDsHieO+CaeYe7jSo/MT7D7lhaXUiwwbuR5BwQxORs0f1tAwUSQr3YbxRXJvxHM/PA5FfPQRnsPeQ==} dev: true + /caniuse-lite/1.0.30001346: + resolution: {integrity: sha512-q6ibZUO2t88QCIPayP/euuDREq+aMAxFE5S70PkrLh0iTDj/zEhgvJRKC2+CvXY6EWc6oQwUR48lL5vCW6jiXQ==} + dev: true + /chalk/2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -2367,8 +2593,8 @@ packages: engines: {node: '>=6'} dev: true - /chart.js/3.7.1: - resolution: {integrity: sha512-8knRegQLFnPQAheZV8MjxIXc5gQEfDFD897BJgv/klO/vtIyFFmgMXrNfgrXpbTr/XbTturxRgxIXx/Y+ASJBA==} + /chart.js/3.8.0: + resolution: {integrity: sha512-cr8xhrXjLIXVLOBZPkBZVF6NDeiVIrPLHcMhnON7UufudL+CNeRrD+wpYanswlm8NpudMdrt3CHoLMQMxJhHRg==} dev: false /chokidar/3.5.3: @@ -2455,8 +2681,8 @@ packages: requiresBuild: true dev: true - /core-js/3.22.4: - resolution: {integrity: sha512-1uLykR+iOfYja+6Jn/57743gc9n73EWiOnSJJ4ba3B4fOEYDBv25MagmEZBxTp5cWq4b/KPx/l77zgsp28ju4w==} + /core-js/3.22.8: + resolution: {integrity: sha512-UoGQ/cfzGYIuiq6Z7vWL1HfkE9U9IZ4Ub+0XSiJTCzvbZzgPA69oDF2f+lgJ6dFFLEdjW5O6svvoKzXX23xFkA==} requiresBuild: true dev: false @@ -2493,13 +2719,13 @@ packages: engines: {node: '>=8'} dev: true - /css-declaration-sorter/[email protected]: + /css-declaration-sorter/[email protected]: resolution: {integrity: sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==} engines: {node: ^10 || ^12 || >=14} peerDependencies: postcss: ^8.0.9 dependencies: - postcss: 8.4.13 + postcss: 8.4.14 dev: true /css-select/4.3.0: @@ -2509,7 +2735,7 @@ packages: css-what: 6.1.0 domhandler: 4.3.1 domutils: 2.8.0 - nth-check: 2.0.1 + nth-check: 2.1.1 dev: true /css-tree/1.1.3: @@ -2531,62 +2757,62 @@ packages: hasBin: true dev: true - /cssnano-preset-default/[email protected]: - resolution: {integrity: sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA==} + /cssnano-preset-default/[email protected]: + resolution: {integrity: sha512-4PadR1NtuaIK8MvLNuY7MznK4WJteldGlzCiMaaTiOUP+apeiIvUDIXykzUOoqgOOUAHrU64ncdD90NfZR3LSQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - css-declaration-sorter: [email protected] - cssnano-utils: [email protected] - postcss: 8.4.13 - postcss-calc: [email protected] - postcss-colormin: [email protected] - postcss-convert-values: [email protected] - postcss-discard-comments: [email protected] - postcss-discard-duplicates: [email protected] - postcss-discard-empty: [email protected] - postcss-discard-overridden: [email protected] - postcss-merge-longhand: [email protected] - postcss-merge-rules: [email protected] - postcss-minify-font-values: [email protected] - postcss-minify-gradients: [email protected] - postcss-minify-params: [email protected] - postcss-minify-selectors: [email protected] - postcss-normalize-charset: [email protected] - postcss-normalize-display-values: [email protected] - postcss-normalize-positions: [email protected] - postcss-normalize-repeat-style: [email protected] - postcss-normalize-string: [email protected] - postcss-normalize-timing-functions: [email protected] - postcss-normalize-unicode: [email protected] - postcss-normalize-url: [email protected] - postcss-normalize-whitespace: [email protected] - postcss-ordered-values: [email protected] - postcss-reduce-initial: [email protected] - postcss-reduce-transforms: [email protected] - postcss-svgo: [email protected] - postcss-unique-selectors: [email protected] + css-declaration-sorter: [email protected] + cssnano-utils: [email protected] + postcss: 8.4.14 + postcss-calc: [email protected] + postcss-colormin: [email protected] + postcss-convert-values: [email protected] + postcss-discard-comments: [email protected] + postcss-discard-duplicates: [email protected] + postcss-discard-empty: [email protected] + postcss-discard-overridden: [email protected] + postcss-merge-longhand: [email protected] + postcss-merge-rules: [email protected] + postcss-minify-font-values: [email protected] + postcss-minify-gradients: [email protected] + postcss-minify-params: [email protected] + postcss-minify-selectors: [email protected] + postcss-normalize-charset: [email protected] + postcss-normalize-display-values: [email protected] + postcss-normalize-positions: [email protected] + postcss-normalize-repeat-style: [email protected] + postcss-normalize-string: [email protected] + postcss-normalize-timing-functions: [email protected] + postcss-normalize-unicode: [email protected] + postcss-normalize-url: [email protected] + postcss-normalize-whitespace: [email protected] + postcss-ordered-values: [email protected] + postcss-reduce-initial: [email protected] + postcss-reduce-transforms: [email protected] + postcss-svgo: [email protected] + postcss-unique-selectors: [email protected] dev: true - /cssnano-utils/[email protected]: + /cssnano-utils/[email protected]: resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.13 + postcss: 8.4.14 dev: true - /cssnano/[email protected]: - resolution: {integrity: sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg==} + /cssnano/[email protected]: + resolution: {integrity: sha512-2nx+O6LvewPo5EBtYrKc8762mMkZRk9cMGIOP4UlkmxHm7ObxH+zvsJJ+qLwPkUc4/yumL/qJkavYi9NlodWIQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-preset-default: [email protected] + cssnano-preset-default: [email protected] lilconfig: 2.0.5 - postcss: 8.4.13 + postcss: 8.4.14 yaml: 1.10.2 dev: true @@ -2597,8 +2823,8 @@ packages: css-tree: 1.1.3 dev: true - /csstype/3.0.11: - resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==} + /csstype/3.1.0: + resolution: {integrity: sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==} dev: true /damerau-levenshtein/1.0.8: @@ -2612,12 +2838,22 @@ packages: /debug/2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: ms: 2.0.0 dev: true /debug/3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: ms: 2.1.3 dev: true @@ -2655,11 +2891,6 @@ packages: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} dev: false - /diff-sequences/27.5.1: - resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: true - /dir-glob/3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -2763,6 +2994,35 @@ packages: unbox-primitive: 1.0.2 dev: true + /es-abstract/1.20.1: + resolution: {integrity: sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + es-to-primitive: 1.2.1 + function-bind: 1.1.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.1.1 + get-symbol-description: 1.0.0 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-symbols: 1.0.3 + internal-slot: 1.0.3 + is-callable: 1.2.4 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-weakref: 1.0.2 + object-inspect: 1.12.2 + object-keys: 1.1.1 + object.assign: 4.1.2 + regexp.prototype.flags: 1.4.3 + string.prototype.trimend: 1.0.5 + string.prototype.trimstart: 1.0.5 + unbox-primitive: 1.0.2 + dev: true + /es-shim-unscopables/1.0.0: resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} dependencies: @@ -2778,8 +3038,8 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild-android-64/0.14.38: - resolution: {integrity: sha512-aRFxR3scRKkbmNuGAK+Gee3+yFxkTJO/cx83Dkyzo4CnQl/2zVSurtG6+G86EQIZ+w+VYngVyK7P3HyTBKu3nw==} + /esbuild-android-64/0.14.43: + resolution: {integrity: sha512-kqFXAS72K6cNrB6RiM7YJ5lNvmWRDSlpi7ZuRZ1hu1S3w0zlwcoCxWAyM23LQUyZSs1PbjHgdbbfYAN8IGh6xg==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -2787,8 +3047,8 @@ packages: dev: true optional: true - /esbuild-android-arm64/0.14.38: - resolution: {integrity: sha512-L2NgQRWuHFI89IIZIlpAcINy9FvBk6xFVZ7xGdOwIm8VyhX1vNCEqUJO3DPSSy945Gzdg98cxtNt8Grv1CsyhA==} + /esbuild-android-arm64/0.14.43: + resolution: {integrity: sha512-bKS2BBFh+7XZY9rpjiHGRNA7LvWYbZWP87pLehggTG7tTaCDvj8qQGOU/OZSjCSKDYbgY7Q+oDw8RlYQ2Jt2BA==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -2796,8 +3056,8 @@ packages: dev: true optional: true - /esbuild-darwin-64/0.14.38: - resolution: {integrity: sha512-5JJvgXkX87Pd1Og0u/NJuO7TSqAikAcQQ74gyJ87bqWRVeouky84ICoV4sN6VV53aTW+NE87qLdGY4QA2S7KNA==} + /esbuild-darwin-64/0.14.43: + resolution: {integrity: sha512-/3PSilx011ttoieRGkSZ0XV8zjBf2C9enV4ScMMbCT4dpx0mFhMOpFnCHkOK0pWGB8LklykFyHrWk2z6DENVUg==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -2805,8 +3065,8 @@ packages: dev: true optional: true - /esbuild-darwin-arm64/0.14.38: - resolution: {integrity: sha512-eqF+OejMI3mC5Dlo9Kdq/Ilbki9sQBw3QlHW3wjLmsLh+quNfHmGMp3Ly1eWm981iGBMdbtSS9+LRvR2T8B3eQ==} + /esbuild-darwin-arm64/0.14.43: + resolution: {integrity: sha512-1HyFUKs8DMCBOvw1Qxpr5Vv/ThNcVIFb5xgXWK3pyT40WPvgYIiRTwJCvNs4l8i5qWF8/CK5bQxJVDjQvtv0Yw==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -2814,8 +3074,8 @@ packages: dev: true optional: true - /esbuild-freebsd-64/0.14.38: - resolution: {integrity: sha512-epnPbhZUt93xV5cgeY36ZxPXDsQeO55DppzsIgWM8vgiG/Rz+qYDLmh5ts3e+Ln1wA9dQ+nZmVHw+RjaW3I5Ig==} + /esbuild-freebsd-64/0.14.43: + resolution: {integrity: sha512-FNWc05TPHYgaXjbPZO5/rJKSBslfG6BeMSs8GhwnqAKP56eEhvmzwnIz1QcC9cRVyO+IKqWNfmHFkCa1WJTULA==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -2823,8 +3083,8 @@ packages: dev: true optional: true - /esbuild-freebsd-arm64/0.14.38: - resolution: {integrity: sha512-/9icXUYJWherhk+y5fjPI5yNUdFPtXHQlwP7/K/zg8t8lQdHVj20SqU9/udQmeUo5pDFHMYzcEFfJqgOVeKNNQ==} + /esbuild-freebsd-arm64/0.14.43: + resolution: {integrity: sha512-amrYopclz3VohqisOPR6hA3GOWA3LZC1WDLnp21RhNmoERmJ/vLnOpnrG2P/Zao+/erKTCUqmrCIPVtj58DRoA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -2832,8 +3092,8 @@ packages: dev: true optional: true - /esbuild-linux-32/0.14.38: - resolution: {integrity: sha512-QfgfeNHRFvr2XeHFzP8kOZVnal3QvST3A0cgq32ZrHjSMFTdgXhMhmWdKzRXP/PKcfv3e2OW9tT9PpcjNvaq6g==} + /esbuild-linux-32/0.14.43: + resolution: {integrity: sha512-KoxoEra+9O3AKVvgDFvDkiuddCds6q71owSQEYwjtqRV7RwbPzKxJa6+uyzUulHcyGVq0g15K0oKG5CFBcvYDw==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -2841,8 +3101,8 @@ packages: dev: true optional: true - /esbuild-linux-64/0.14.38: - resolution: {integrity: sha512-uuZHNmqcs+Bj1qiW9k/HZU3FtIHmYiuxZ/6Aa+/KHb/pFKr7R3aVqvxlAudYI9Fw3St0VCPfv7QBpUITSmBR1Q==} + /esbuild-linux-64/0.14.43: + resolution: {integrity: sha512-EwINwGMyiJMgBby5/SbMqKcUhS5AYAZ2CpEBzSowsJPNBJEdhkCTtEjk757TN/wxgbu3QklqDM6KghY660QCUw==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -2850,8 +3110,8 @@ packages: dev: true optional: true - /esbuild-linux-arm/0.14.38: - resolution: {integrity: sha512-FiFvQe8J3VKTDXG01JbvoVRXQ0x6UZwyrU4IaLBZeq39Bsbatd94Fuc3F1RGqPF5RbIWW7RvkVQjn79ejzysnA==} + /esbuild-linux-arm/0.14.43: + resolution: {integrity: sha512-e6YzQUoDxxtyamuF12eVzzRC7bbEFSZohJ6igQB9tBqnNmIQY3fI6Cns3z2wxtbZ3f2o6idkD2fQnlvs2902Dg==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -2859,8 +3119,8 @@ packages: dev: true optional: true - /esbuild-linux-arm64/0.14.38: - resolution: {integrity: sha512-HlMGZTEsBrXrivr64eZ/EO0NQM8H8DuSENRok9d+Jtvq8hOLzrxfsAT9U94K3KOGk2XgCmkaI2KD8hX7F97lvA==} + /esbuild-linux-arm64/0.14.43: + resolution: {integrity: sha512-UlSpjMWllAc70zYbHxWuDS3FJytyuR/gHJYBr8BICcTNb/TSOYVBg6U7b3jZ3mILTrgzwJUHwhEwK18FZDouUQ==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -2868,8 +3128,8 @@ packages: dev: true optional: true - /esbuild-linux-mips64le/0.14.38: - resolution: {integrity: sha512-qd1dLf2v7QBiI5wwfil9j0HG/5YMFBAmMVmdeokbNAMbcg49p25t6IlJFXAeLzogv1AvgaXRXvgFNhScYEUXGQ==} + /esbuild-linux-mips64le/0.14.43: + resolution: {integrity: sha512-f+v8cInPEL1/SDP//CfSYzcDNgE4CY3xgDV81DWm3KAPWzhvxARrKxB1Pstf5mB56yAslJDxu7ryBUPX207EZA==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -2877,8 +3137,8 @@ packages: dev: true optional: true - /esbuild-linux-ppc64le/0.14.38: - resolution: {integrity: sha512-mnbEm7o69gTl60jSuK+nn+pRsRHGtDPfzhrqEUXyCl7CTOCLtWN2bhK8bgsdp6J/2NyS/wHBjs1x8aBWwP2X9Q==} + /esbuild-linux-ppc64le/0.14.43: + resolution: {integrity: sha512-5wZYMDGAL/K2pqkdIsW+I4IR41kyfHr/QshJcNpUfK3RjB3VQcPWOaZmc+74rm4ZjVirYrtz+jWw0SgxtxRanA==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -2886,8 +3146,8 @@ packages: dev: true optional: true - /esbuild-linux-riscv64/0.14.38: - resolution: {integrity: sha512-+p6YKYbuV72uikChRk14FSyNJZ4WfYkffj6Af0/Tw63/6TJX6TnIKE+6D3xtEc7DeDth1fjUOEqm+ApKFXbbVQ==} + /esbuild-linux-riscv64/0.14.43: + resolution: {integrity: sha512-lYcAOUxp85hC7lSjycJUVSmj4/9oEfSyXjb/ua9bNl8afonaduuqtw7hvKMoKuYnVwOCDw4RSfKpcnIRDWq+Bw==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -2895,8 +3155,8 @@ packages: dev: true optional: true - /esbuild-linux-s390x/0.14.38: - resolution: {integrity: sha512-0zUsiDkGJiMHxBQ7JDU8jbaanUY975CdOW1YDrurjrM0vWHfjv9tLQsW9GSyEb/heSK1L5gaweRjzfUVBFoybQ==} + /esbuild-linux-s390x/0.14.43: + resolution: {integrity: sha512-27e43ZhHvhFE4nM7HqtUbMRu37I/4eNSUbb8FGZWszV+uLzMIsHDwLoBiJmw7G9N+hrehNPeQ4F5Ujad0DrUKQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -2904,8 +3164,8 @@ packages: dev: true optional: true - /esbuild-netbsd-64/0.14.38: - resolution: {integrity: sha512-cljBAApVwkpnJZfnRVThpRBGzCi+a+V9Ofb1fVkKhtrPLDYlHLrSYGtmnoTVWDQdU516qYI8+wOgcGZ4XIZh0Q==} + /esbuild-netbsd-64/0.14.43: + resolution: {integrity: sha512-2mH4QF6hHBn5zzAfxEI/2eBC0mspVsZ6UVo821LpAJKMvLJPBk3XJO5xwg7paDqSqpl7p6IRrAenW999AEfJhQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -2913,8 +3173,8 @@ packages: dev: true optional: true - /esbuild-openbsd-64/0.14.38: - resolution: {integrity: sha512-CDswYr2PWPGEPpLDUO50mL3WO/07EMjnZDNKpmaxUPsrW+kVM3LoAqr/CE8UbzugpEiflYqJsGPLirThRB18IQ==} + /esbuild-openbsd-64/0.14.43: + resolution: {integrity: sha512-ZhQpiZjvqCqO8jKdGp9+8k9E/EHSA+zIWOg+grwZasI9RoblqJ1QiZqqi7jfd6ZrrG1UFBNGe4m0NFxCFbMVbg==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -2922,8 +3182,8 @@ packages: dev: true optional: true - /esbuild-sunos-64/0.14.38: - resolution: {integrity: sha512-2mfIoYW58gKcC3bck0j7lD3RZkqYA7MmujFYmSn9l6TiIcAMpuEvqksO+ntBgbLep/eyjpgdplF7b+4T9VJGOA==} + /esbuild-sunos-64/0.14.43: + resolution: {integrity: sha512-DgxSi9DaHReL9gYuul2rrQCAapgnCJkh3LSHPKsY26zytYppG0HgkgVF80zjIlvEsUbGBP/GHQzBtrezj/Zq1Q==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -2931,8 +3191,8 @@ packages: dev: true optional: true - /esbuild-windows-32/0.14.38: - resolution: {integrity: sha512-L2BmEeFZATAvU+FJzJiRLFUP+d9RHN+QXpgaOrs2klshoAm1AE6Us4X6fS9k33Uy5SzScn2TpcgecbqJza1Hjw==} + /esbuild-windows-32/0.14.43: + resolution: {integrity: sha512-Ih3+2O5oExiqm0mY6YYE5dR0o8+AspccQ3vIAtRodwFvhuyGLjb0Hbmzun/F3Lw19nuhPMu3sW2fqIJ5xBxByw==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -2940,8 +3200,8 @@ packages: dev: true optional: true - /esbuild-windows-64/0.14.38: - resolution: {integrity: sha512-Khy4wVmebnzue8aeSXLC+6clo/hRYeNIm0DyikoEqX+3w3rcvrhzpoix0S+MF9vzh6JFskkIGD7Zx47ODJNyCw==} + /esbuild-windows-64/0.14.43: + resolution: {integrity: sha512-8NsuNfI8xwFuJbrCuI+aBqNTYkrWErejFO5aYM+yHqyHuL8mmepLS9EPzAzk8rvfaJrhN0+RvKWAcymViHOKEw==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -2949,8 +3209,8 @@ packages: dev: true optional: true - /esbuild-windows-arm64/0.14.38: - resolution: {integrity: sha512-k3FGCNmHBkqdJXuJszdWciAH77PukEyDsdIryEHn9cKLQFxzhT39dSumeTuggaQcXY57UlmLGIkklWZo2qzHpw==} + /esbuild-windows-arm64/0.14.43: + resolution: {integrity: sha512-7ZlD7bo++kVRblJEoG+cepljkfP8bfuTPz5fIXzptwnPaFwGS6ahvfoYzY7WCf5v/1nX2X02HDraVItTgbHnKw==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -2958,32 +3218,32 @@ packages: dev: true optional: true - /esbuild/0.14.38: - resolution: {integrity: sha512-12fzJ0fsm7gVZX1YQ1InkOE5f9Tl7cgf6JPYXRJtPIoE0zkWAbHdPHVPPaLi9tYAcEBqheGzqLn/3RdTOyBfcA==} + /esbuild/0.14.43: + resolution: {integrity: sha512-Uf94+kQmy/5jsFwKWiQB4hfo/RkM9Dh7b79p8yqd1tshULdr25G2szLz631NoH3s2ujnKEKVD16RmOxvCNKRFA==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - esbuild-android-64: 0.14.38 - esbuild-android-arm64: 0.14.38 - esbuild-darwin-64: 0.14.38 - esbuild-darwin-arm64: 0.14.38 - esbuild-freebsd-64: 0.14.38 - esbuild-freebsd-arm64: 0.14.38 - esbuild-linux-32: 0.14.38 - esbuild-linux-64: 0.14.38 - esbuild-linux-arm: 0.14.38 - esbuild-linux-arm64: 0.14.38 - esbuild-linux-mips64le: 0.14.38 - esbuild-linux-ppc64le: 0.14.38 - esbuild-linux-riscv64: 0.14.38 - esbuild-linux-s390x: 0.14.38 - esbuild-netbsd-64: 0.14.38 - esbuild-openbsd-64: 0.14.38 - esbuild-sunos-64: 0.14.38 - esbuild-windows-32: 0.14.38 - esbuild-windows-64: 0.14.38 - esbuild-windows-arm64: 0.14.38 + esbuild-android-64: 0.14.43 + esbuild-android-arm64: 0.14.43 + esbuild-darwin-64: 0.14.43 + esbuild-darwin-arm64: 0.14.43 + esbuild-freebsd-64: 0.14.43 + esbuild-freebsd-arm64: 0.14.43 + esbuild-linux-32: 0.14.43 + esbuild-linux-64: 0.14.43 + esbuild-linux-arm: 0.14.43 + esbuild-linux-arm64: 0.14.43 + esbuild-linux-mips64le: 0.14.43 + esbuild-linux-ppc64le: 0.14.43 + esbuild-linux-riscv64: 0.14.43 + esbuild-linux-s390x: 0.14.43 + esbuild-netbsd-64: 0.14.43 + esbuild-openbsd-64: 0.14.43 + esbuild-sunos-64: 0.14.43 + esbuild-windows-32: 0.14.43 + esbuild-windows-64: 0.14.43 + esbuild-windows-arm64: 0.14.43 dev: true /escalade/3.1.1: @@ -2992,7 +3252,7 @@ packages: dev: true /escape-string-regexp/1.0.5: - resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} dev: true @@ -3001,7 +3261,7 @@ packages: engines: {node: '>=10'} dev: true - /eslint-config-airbnb-base/15.0.0_gwd37gqv3vjv3xlpl7ju3ag2qu: + /eslint-config-airbnb-base/15.0.0_3yxiwxzsqipdmy4jwrlv6vgfmy: resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: @@ -3009,49 +3269,55 @@ packages: eslint-plugin-import: ^2.25.2 dependencies: confusing-browser-globals: 1.0.11 - eslint: 8.15.0 - eslint-plugin-import: [email protected] + eslint: 8.17.0 + eslint-plugin-import: 2.26.0_pv5w3e62ssxduf5aiwxbc3knra object.assign: 4.1.2 object.entries: 1.1.5 semver: 6.3.0 dev: true - /eslint-config-prettier/[email protected]: + /eslint-config-prettier/[email protected]: resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.15.0 + eslint: 8.17.0 dev: true - /eslint-config-react-app/7.0.1_hcfsmds2fshutdssjqluwm76uu: + /eslint-config-react-app/7.0.1_ud6rd4xtew5bv4yhvkvu24pzm4: resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} engines: {node: '>=14.0.0'} peerDependencies: eslint: ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: '@babel/core': 7.17.10 - '@babel/eslint-parser': 7.17.0_annt2i75qyqp7sfsklqkwkfeaa + '@babel/eslint-parser': 7.17.0_eko6nswhjkkmiiwhnyhdta6g74 '@rushstack/eslint-patch': 1.1.3 - '@typescript-eslint/eslint-plugin': 5.22.0_tal4xlmvnofklupd3hwjtzfb4q - '@typescript-eslint/parser': 5.22.0_hcfsmds2fshutdssjqluwm76uu + '@typescript-eslint/eslint-plugin': 5.27.1_aq7uryhocdbvbqum33pitcm3y4 + '@typescript-eslint/parser': 5.27.1_ud6rd4xtew5bv4yhvkvu24pzm4 babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 - eslint: 8.15.0 - eslint-plugin-flowtype: [email protected] - eslint-plugin-import: [email protected] - eslint-plugin-jest: 25.7.0_izigq5cravd5ahn2yqozpc2que - eslint-plugin-jsx-a11y: [email protected] - eslint-plugin-react: [email protected] - eslint-plugin-react-hooks: [email protected] - eslint-plugin-testing-library: 5.4.0_hcfsmds2fshutdssjqluwm76uu + eslint: 8.17.0 + eslint-plugin-flowtype: [email protected] + eslint-plugin-import: 2.26.0_pv5w3e62ssxduf5aiwxbc3knra + eslint-plugin-jest: 25.7.0_73r5ycrednkeozhd2eskx6x7ey + eslint-plugin-jsx-a11y: [email protected] + eslint-plugin-react: [email protected] + eslint-plugin-react-hooks: [email protected] + eslint-plugin-testing-library: 5.4.0_ud6rd4xtew5bv4yhvkvu24pzm4 + typescript: 4.7.3 transitivePeerDependencies: - '@babel/plugin-syntax-flow' - '@babel/plugin-transform-react-jsx' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack - jest - supports-color - - typescript dev: true /eslint-import-resolver-node/0.3.6: @@ -3059,17 +3325,37 @@ packages: dependencies: debug: 3.2.7 resolve: 1.22.0 + transitivePeerDependencies: + - supports-color dev: true - /eslint-module-utils/2.7.3: + /eslint-module-utils/2.7.3_5uhabtgzo3akfzi73a5jap3i6a: resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==} engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true dependencies: + '@typescript-eslint/parser': 5.27.1_ud6rd4xtew5bv4yhvkvu24pzm4 debug: 3.2.7 + eslint-import-resolver-node: 0.3.6 find-up: 2.1.0 + transitivePeerDependencies: + - supports-color dev: true - /eslint-plugin-flowtype/[email protected]: + /eslint-plugin-flowtype/[email protected]: resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -3077,24 +3363,29 @@ packages: '@babel/plugin-transform-react-jsx': ^7.14.9 eslint: ^8.1.0 dependencies: - eslint: 8.15.0 + eslint: 8.17.0 lodash: 4.17.21 string-natural-compare: 3.0.1 dev: true - /eslint-plugin-import/[email protected]: + /eslint-plugin-import/2.26.0_pv5w3e62ssxduf5aiwxbc3knra: resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} engines: {node: '>=4'} peerDependencies: + '@typescript-eslint/parser': '*' eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true dependencies: + '@typescript-eslint/parser': 5.27.1_ud6rd4xtew5bv4yhvkvu24pzm4 array-includes: 3.1.5 array.prototype.flat: 1.3.0 debug: 2.6.9 doctrine: 2.1.0 - eslint: 8.15.0 + eslint: 8.17.0 eslint-import-resolver-node: 0.3.6 - eslint-module-utils: 2.7.3 + eslint-module-utils: 2.7.3_5uhabtgzo3akfzi73a5jap3i6a has: 1.0.3 is-core-module: 2.9.0 is-glob: 4.0.3 @@ -3102,9 +3393,13 @@ packages: object.values: 1.1.5 resolve: 1.22.0 tsconfig-paths: 3.14.1 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color dev: true - /eslint-plugin-jest/25.7.0_izigq5cravd5ahn2yqozpc2que: + /eslint-plugin-jest/25.7.0_73r5ycrednkeozhd2eskx6x7ey: resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} peerDependencies: @@ -3117,42 +3412,21 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.22.0_tal4xlmvnofklupd3hwjtzfb4q - '@typescript-eslint/experimental-utils': 5.22.0_hcfsmds2fshutdssjqluwm76uu - eslint: 8.15.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /eslint-plugin-jest/26.1.5_izigq5cravd5ahn2yqozpc2que: - resolution: {integrity: sha512-su89aDuljL9bTjEufTXmKUMSFe2kZUL9bi7+woq+C2ukHZordhtfPm4Vg+tdioHBaKf8v3/FXW9uV0ksqhYGFw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - jest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - jest: - optional: true - dependencies: - '@typescript-eslint/eslint-plugin': 5.22.0_tal4xlmvnofklupd3hwjtzfb4q - '@typescript-eslint/utils': 5.22.0_hcfsmds2fshutdssjqluwm76uu - eslint: 8.15.0 + '@typescript-eslint/eslint-plugin': 5.27.1_aq7uryhocdbvbqum33pitcm3y4 + '@typescript-eslint/experimental-utils': 5.22.0_ud6rd4xtew5bv4yhvkvu24pzm4 + eslint: 8.17.0 transitivePeerDependencies: - supports-color - typescript dev: true - /eslint-plugin-jsx-a11y/[email protected]: + /eslint-plugin-jsx-a11y/[email protected]: resolution: {integrity: sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==} engines: {node: '>=4.0'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 aria-query: 4.2.2 array-includes: 3.1.5 ast-types-flow: 0.0.7 @@ -3160,24 +3434,24 @@ packages: axobject-query: 2.2.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.15.0 + eslint: 8.17.0 has: 1.0.3 jsx-ast-utils: 3.3.0 language-tags: 1.0.5 minimatch: 3.1.2 dev: true - /eslint-plugin-react-hooks/[email protected]: + /eslint-plugin-react-hooks/[email protected]: resolution: {integrity: sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.15.0 + eslint: 8.17.0 dev: true - /eslint-plugin-react/[email protected]: - resolution: {integrity: sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==} + /eslint-plugin-react/[email protected]: + resolution: {integrity: sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 @@ -3185,7 +3459,7 @@ packages: array-includes: 3.1.5 array.prototype.flatmap: 1.3.0 doctrine: 2.1.0 - eslint: 8.15.0 + eslint: 8.17.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.0 minimatch: 3.1.2 @@ -3199,22 +3473,22 @@ packages: string.prototype.matchall: 4.0.7 dev: true - /eslint-plugin-simple-import-sort/[email protected]: + /eslint-plugin-simple-import-sort/[email protected]: resolution: {integrity: sha512-U3vEDB5zhYPNfxT5TYR7u01dboFZp+HNpnGhkDB2g/2E4wZ/g1Q9Ton8UwCLfRV9yAKyYqDh62oHOamvkFxsvw==} peerDependencies: eslint: '>=5.0.0' dependencies: - eslint: 8.15.0 + eslint: 8.17.0 dev: true - /eslint-plugin-testing-library/5.4.0_hcfsmds2fshutdssjqluwm76uu: + /eslint-plugin-testing-library/5.4.0_ud6rd4xtew5bv4yhvkvu24pzm4: resolution: {integrity: sha512-XjxIf4g33KaZXxRNbR33+0WcRQ/zt8N0R58IY6/kkHnrY6zPsC1gs3u5cTZr5eUmCZN/sjoPak3uF5vHGKg2wg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} peerDependencies: eslint: ^7.5.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.22.0_hcfsmds2fshutdssjqluwm76uu - eslint: 8.15.0 + '@typescript-eslint/utils': 5.27.0_ud6rd4xtew5bv4yhvkvu24pzm4 + eslint: 8.17.0 transitivePeerDependencies: - supports-color - typescript @@ -3236,13 +3510,13 @@ packages: estraverse: 5.3.0 dev: true - /eslint-utils/[email protected]: + /eslint-utils/[email protected]: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: - eslint: 8.15.0 + eslint: 8.17.0 eslint-visitor-keys: 2.1.0 dev: true @@ -3256,12 +3530,12 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/8.15.0: - resolution: {integrity: sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==} + /eslint/8.17.0: + resolution: {integrity: sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint/eslintrc': 1.2.3 + '@eslint/eslintrc': 1.3.0 '@humanwhocodes/config-array': 0.9.5 ajv: 6.12.6 chalk: 4.1.2 @@ -3270,7 +3544,7 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-utils: [email protected] + eslint-utils: [email protected] eslint-visitor-keys: 3.3.0 espree: 9.3.2 esquery: 1.4.0 @@ -3279,7 +3553,7 @@ packages: file-entry-cache: 6.0.1 functional-red-black-tree: 1.0.1 glob-parent: 6.0.2 - globals: 13.13.0 + globals: 13.15.0 ignore: 5.2.0 import-fresh: 3.3.0 imurmurhash: 0.1.4 @@ -3369,7 +3643,7 @@ packages: dev: true /fast-levenshtein/2.0.6: - resolution: {integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=} + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true /fastq/1.13.0: @@ -3388,7 +3662,7 @@ packages: /filelist/1.0.3: resolution: {integrity: sha512-LwjCsruLWQULGYKy7TX0OPtrL9kLpojOFKc5VCTxdFTV7w5zbsgqVKfnkKG7Qgjtq50gKfO56hJv88OfcGb70Q==} dependencies: - minimatch: 5.0.1 + minimatch: 5.1.0 dev: true /fill-range/7.0.1: @@ -3421,8 +3695,8 @@ packages: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} dev: true - /framer-motion/6.3.3_ef5jwxihqo6n7gxfmzogljlgcm: - resolution: {integrity: sha512-wo0dCnoq5vn4L8YVOPO9W54dliH78vDaX0Lj+bSPUys6Nt5QaehrS3uaYa0q5eVeikUgtTjz070UhQ94thI5Sw==} + /framer-motion/6.3.11_ef5jwxihqo6n7gxfmzogljlgcm: + resolution: {integrity: sha512-xQLk+ZSklNs5QNCUmdWPpKMOuWiB8ZETsvcIOWw8xvri9K3TamuifgCI/B6XpaEDR0/V2ZQF2Wm+gUAZrXo+rw==} peerDependencies: react: '>=16.8 || ^17.0.0 || ^18.0.0' react-dom: '>=16.8 || ^17.0.0 || ^18.0.0' @@ -3480,7 +3754,7 @@ packages: dev: true /functional-red-black-tree/1.0.1: - resolution: {integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=} + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} dev: true /functions-have-names/1.2.3: @@ -3535,14 +3809,25 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 + dev: true + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 /globals/11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} dev: true - /globals/13.13.0: - resolution: {integrity: sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==} + /globals/13.15.0: + resolution: {integrity: sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -3614,7 +3899,7 @@ packages: /history/5.3.0: resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==} dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 dev: false /html-escaper/2.0.2: @@ -3630,21 +3915,21 @@ packages: /i18next-browser-languagedetector/6.1.4: resolution: {integrity: sha512-wukWnFeU7rKIWT66VU5i8I+3Zc4wReGcuDK2+kuFhtoxBRGWGdvYI9UQmqNL/yQH1KogWwh+xGEaIPH8V/i2Zg==} dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 dev: false - /i18next-http-backend/1.4.0: - resolution: {integrity: sha512-wsvx7E/CT1pHmBM99Vu57YLJpsrHbVjxGxf25EIJ/6oTjsvCkZZ6c3SA4TejcK5jIHfv9oLxQX8l+DFKZHZ0Gg==} + /i18next-http-backend/1.4.1: + resolution: {integrity: sha512-s4Q9hK2jS29iyhniMP82z+yYY8riGTrWbnyvsSzi5TaF7Le4E7b5deTmtuaRuab9fdDcYXtcwdBgawZG+JCEjA==} dependencies: cross-fetch: 3.1.5 transitivePeerDependencies: - encoding dev: false - /i18next/21.7.1: - resolution: {integrity: sha512-uNt0BM+HV7wgWrrTE+Z4qinQFTONB21hK3I5V/LayhquPv78WchnO4hjF2PWY/OZocahHBDbzbe0/o1rp/RcWQ==} + /i18next/21.8.9: + resolution: {integrity: sha512-PY9a/8ADVmnju1tETeglbbVQi+nM5pcJQWm9kvKMTE3GPgHHtpDsHy5HQ/hccz2/xtW7j3vuso23JdQSH0EttA==} dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 dev: false /idb/6.1.5: @@ -3655,12 +3940,12 @@ packages: engines: {node: '>= 4'} dev: true - /immer/9.0.12: - resolution: {integrity: sha512-lk7UNmSbAukB5B6dh9fnh5D0bJTOFKxVg2cyJWTYrWRfhLrLMBquONcUs3aFq507hNoIZEDDh8lb8UtOizSMhA==} + /immer/9.0.14: + resolution: {integrity: sha512-ubBeqQutOSLIFCUBN03jGeOS6a3DoYlSYwYJTa+gSKEZKU5redJIqkIdZ3JVv/4RZpfcXdAWH5zCNLWPRv2WDw==} dev: false - /immutable/4.0.0: - resolution: {integrity: sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==} + /immutable/4.1.0: + resolution: {integrity: sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==} dev: true /import-fresh/3.3.0: @@ -3672,7 +3957,7 @@ packages: dev: true /imurmurhash/0.1.4: - resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} dev: true @@ -3826,7 +4111,7 @@ packages: dev: true /isexe/2.0.0: - resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true /jake/10.8.5: @@ -3840,31 +4125,6 @@ packages: minimatch: 3.1.2 dev: true - /jest-diff/27.5.1: - resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 27.5.1 - jest-get-type: 27.5.1 - pretty-format: 27.5.1 - dev: true - - /jest-get-type/27.5.1: - resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: true - - /jest-matcher-utils/27.5.1: - resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - chalk: 4.1.2 - jest-diff: 27.5.1 - jest-get-type: 27.5.1 - pretty-format: 27.5.1 - dev: true - /jest-worker/26.6.2: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} @@ -3916,7 +4176,7 @@ packages: dev: true /json-stable-stringify-without-jsonify/1.0.1: - resolution: {integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=} + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true /json5/1.0.1: @@ -4002,7 +4262,7 @@ packages: dev: true /lodash.memoize/4.1.2: - resolution: {integrity: sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=} + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} dev: true /lodash.merge/4.6.2: @@ -4014,7 +4274,7 @@ packages: dev: true /lodash.uniq/4.5.0: - resolution: {integrity: sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=} + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} dev: true /lodash/4.17.21: @@ -4043,7 +4303,7 @@ packages: /match-sorter/6.3.1: resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 remove-accents: 0.4.2 dev: false @@ -4085,8 +4345,8 @@ packages: dependencies: brace-expansion: 1.1.11 - /minimatch/5.0.1: - resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} + /minimatch/5.1.0: + resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==} engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 @@ -4126,7 +4386,7 @@ packages: dev: true /natural-compare/1.4.0: - resolution: {integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=} + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true /node-fetch/2.6.7: @@ -4160,8 +4420,8 @@ packages: engines: {node: '>=10'} dev: true - /nth-check/2.0.1: - resolution: {integrity: sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==} + /nth-check/2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} dependencies: boolbase: 1.0.0 dev: true @@ -4174,6 +4434,10 @@ packages: resolution: {integrity: sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==} dev: true + /object-inspect/1.12.2: + resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} + dev: true + /object-keys/1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -4204,14 +4468,14 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.0 + es-abstract: 1.20.1 dev: true /object.hasown/1.1.1: resolution: {integrity: sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==} dependencies: define-properties: 1.1.4 - es-abstract: 1.20.0 + es-abstract: 1.20.1 dev: true /object.values/1.1.5: @@ -4326,17 +4590,17 @@ packages: tslib: 2.4.0 dev: false - /postcss-calc/[email protected]: + /postcss-calc/[email protected]: resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} peerDependencies: postcss: ^8.2.2 dependencies: - postcss: 8.4.13 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 postcss-value-parser: 4.2.0 dev: true - /postcss-colormin/[email protected]: + /postcss-colormin/[email protected]: resolution: {integrity: sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -4345,248 +4609,250 @@ packages: browserslist: 4.20.3 caniuse-api: 3.0.0 colord: 2.9.2 - postcss: 8.4.13 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: true - /postcss-convert-values/[email protected]: - resolution: {integrity: sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==} + /postcss-convert-values/[email protected]: + resolution: {integrity: sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.13 + browserslist: 4.20.3 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: true - /postcss-custom-media/[email protected]: - resolution: {integrity: sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==} - engines: {node: '>=10.0.0'} + /postcss-custom-media/[email protected]: + resolution: {integrity: sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: - postcss: ^8.1.0 + postcss: ^8.3 dependencies: - postcss: 8.4.13 + postcss: 8.4.14 + postcss-value-parser: 4.2.0 dev: true - /postcss-discard-comments/[email protected]: - resolution: {integrity: sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==} + /postcss-discard-comments/[email protected]: + resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.13 + postcss: 8.4.14 dev: true - /postcss-discard-duplicates/[email protected]: + /postcss-discard-duplicates/[email protected]: resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.13 + postcss: 8.4.14 dev: true - /postcss-discard-empty/[email protected]: + /postcss-discard-empty/[email protected]: resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.13 + postcss: 8.4.14 dev: true - /postcss-discard-overridden/[email protected]: + /postcss-discard-overridden/[email protected]: resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.13 + postcss: 8.4.14 dev: true - /postcss-import/[email protected]: + /postcss-import/[email protected]: resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} engines: {node: '>=10.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.13 + postcss: 8.4.14 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.0 dev: true - /postcss-merge-longhand/[email protected]: - resolution: {integrity: sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==} + /postcss-merge-longhand/[email protected]: + resolution: {integrity: sha512-NOG1grw9wIO+60arKa2YYsrbgvP6tp+jqc7+ZD5/MalIw234ooH2C6KlR6FEn4yle7GqZoBxSK1mLBE9KPur6w==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.13 + postcss: 8.4.14 postcss-value-parser: 4.2.0 - stylehacks: [email protected] + stylehacks: [email protected] dev: true - /postcss-merge-rules/[email protected]: - resolution: {integrity: sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==} + /postcss-merge-rules/[email protected]: + resolution: {integrity: sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: browserslist: 4.20.3 caniuse-api: 3.0.0 - cssnano-utils: [email protected] - postcss: 8.4.13 + cssnano-utils: [email protected] + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: true - /postcss-minify-font-values/[email protected]: + /postcss-minify-font-values/[email protected]: resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.13 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: true - /postcss-minify-gradients/[email protected]: + /postcss-minify-gradients/[email protected]: resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: colord: 2.9.2 - cssnano-utils: [email protected] - postcss: 8.4.13 + cssnano-utils: [email protected] + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: true - /postcss-minify-params/[email protected]: - resolution: {integrity: sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==} + /postcss-minify-params/[email protected]: + resolution: {integrity: sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: browserslist: 4.20.3 - cssnano-utils: [email protected] - postcss: 8.4.13 + cssnano-utils: [email protected] + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: true - /postcss-minify-selectors/[email protected]: - resolution: {integrity: sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==} + /postcss-minify-selectors/[email protected]: + resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.13 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: true - /postcss-normalize-charset/[email protected]: + /postcss-normalize-charset/[email protected]: resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.13 + postcss: 8.4.14 dev: true - /postcss-normalize-display-values/[email protected]: + /postcss-normalize-display-values/[email protected]: resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.13 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-positions/[email protected]: + /postcss-normalize-positions/[email protected]: resolution: {integrity: sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.13 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-repeat-style/[email protected]: + /postcss-normalize-repeat-style/[email protected]: resolution: {integrity: sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.13 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-string/[email protected]: + /postcss-normalize-string/[email protected]: resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.13 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-timing-functions/[email protected]: + /postcss-normalize-timing-functions/[email protected]: resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.13 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-unicode/[email protected]: + /postcss-normalize-unicode/[email protected]: resolution: {integrity: sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: browserslist: 4.20.3 - postcss: 8.4.13 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-url/[email protected]: + /postcss-normalize-url/[email protected]: resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: normalize-url: 6.1.0 - postcss: 8.4.13 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-whitespace/[email protected]: + /postcss-normalize-whitespace/[email protected]: resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.13 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: true - /postcss-ordered-values/[email protected]: - resolution: {integrity: sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==} + /postcss-ordered-values/[email protected]: + resolution: {integrity: sha512-wr2avRbW4HS2XE2ZCqpfp4N/tDC6GZKZ+SVP8UBTOVS8QWrc4TD8MYrebJrvVVlGPKszmiSCzue43NDiVtgDmg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: [email protected] - postcss: 8.4.13 + cssnano-utils: [email protected] + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: true - /postcss-reduce-initial/[email protected]: + /postcss-reduce-initial/[email protected]: resolution: {integrity: sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: @@ -4594,16 +4860,16 @@ packages: dependencies: browserslist: 4.20.3 caniuse-api: 3.0.0 - postcss: 8.4.13 + postcss: 8.4.14 dev: true - /postcss-reduce-transforms/[email protected]: + /postcss-reduce-transforms/[email protected]: resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.13 + postcss: 8.4.14 postcss-value-parser: 4.2.0 dev: true @@ -4615,33 +4881,33 @@ packages: util-deprecate: 1.0.2 dev: true - /postcss-simple-vars/[email protected]: + /postcss-simple-vars/[email protected]: resolution: {integrity: sha512-fkNn4Zio8vN4vIig9IFdb8lVlxWnYR769RgvxCM6YWlFKie/nQaOcaMMMFz/s4gsfHW4/5bJW+i57zD67mQU7g==} engines: {node: '>=10.0'} peerDependencies: postcss: ^8.2.1 dependencies: - postcss: 8.4.13 + postcss: 8.4.14 dev: true - /postcss-svgo/[email protected]: + /postcss-svgo/[email protected]: resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.13 + postcss: 8.4.14 postcss-value-parser: 4.2.0 svgo: 2.8.0 dev: true - /postcss-unique-selectors/[email protected]: + /postcss-unique-selectors/[email protected]: resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.13 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: true @@ -4649,8 +4915,8 @@ packages: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: true - /postcss/8.4.13: - resolution: {integrity: sha512-jtL6eTBrza5MPzy8oJLFuUscHDXTV5KcLlqAWHl5q5WYRfnNRGSmOZmOZ1T6Gy7A99mOZfqungmZMpMmCVJ8ZA==} + /postcss/8.4.14: + resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.4 @@ -4679,15 +4945,6 @@ packages: engines: {node: ^14.13.1 || >=16.0.0} dev: true - /pretty-format/27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - dev: true - /prop-types/15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} dependencies: @@ -4720,17 +4977,17 @@ packages: scheduler: 0.22.0 dev: false - /react-feather/[email protected]: - resolution: {integrity: sha512-yMfCGRkZdXwIs23Zw/zIWCJO3m3tlaUvtHiXlW+3FH7cIT6fiK1iJ7RJWugXq7Fso8ZaQyUm92/GOOHXvkiVUw==} + /react-feather/[email protected]: + resolution: {integrity: sha512-BLhukwJ+Z92Nmdcs+EMw6dy1Z/VLiJTzEQACDUEnWMClhYnFykJCGWQx+NmwP/qQHGX/5CzQ+TGi8ofg2+HzVQ==} peerDependencies: - react: ^16.8.6 || ^17 + react: '>=16.8.6' dependencies: prop-types: 15.8.1 react: 18.1.0 dev: false - /react-i18next/11.16.9_2xmduy7g43rnjce2rgborrjowa: - resolution: {integrity: sha512-euXxWvcEAvsY7ZVkwx9ztCq4butqtsGHEkpkuo0RMj8Ru09IF9o2KxCyN+zyv51Nr0aBh/elaTIiR6fMb8YfVg==} + /react-i18next/11.17.1_yu4sb4vmu5dvmheeaa2fohstne: + resolution: {integrity: sha512-4H4fK9vWsQtPP0iAdqzGfdPKLaSXpCjuh1xaGsejX/CO8tx8zCnrOnlQhMgrJf+OlUfzth5YaDPXYGp3RHxV1g==} peerDependencies: i18next: '>= 19.0.0' react: '>= 16.8.0' @@ -4742,16 +4999,16 @@ packages: react-native: optional: true dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 html-escaper: 2.0.2 html-parse-stringify: 3.0.1 - i18next: 21.7.1 + i18next: 21.8.9 react: 18.1.0 react-dom: [email protected] dev: false - /react-icons/[email protected]: - resolution: {integrity: sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ==} + /react-icons/[email protected]: + resolution: {integrity: sha512-fSbvHeVYo/B5/L4VhB7sBA1i2tS8MkT0Hb9t2H1AVPkwGfVHLJCqyr2Py9dKMxsyM63Eng1GkdZfbWj+Fmv8Rg==} peerDependencies: react: '*' dependencies: @@ -4761,10 +5018,6 @@ packages: /react-is/16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - /react-is/17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: true - /react-lifecycles-compat/3.0.4: resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} dev: false @@ -4784,8 +5037,8 @@ packages: warning: 4.0.3 dev: false - /react-query/3.38.1_ef5jwxihqo6n7gxfmzogljlgcm: - resolution: {integrity: sha512-CM9hsz6oib17hsBguGaMJr+a0swMzou2gvNHHjAusnXvkfTx6CTzx0Iwuplox1jI2j3WiY91BGrcIN6bp1n1Iw==} + /react-query/3.39.1_ef5jwxihqo6n7gxfmzogljlgcm: + resolution: {integrity: sha512-qYKT1bavdDiQZbngWZyPotlBVzcBjDYEJg5RQLBa++5Ix5jjfbEYJmHSZRZD+USVHUSvl/ey9Hu+QfF1QAK80A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: '*' @@ -4796,7 +5049,7 @@ packages: react-native: optional: true dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 broadcast-channel: 3.7.0 match-sorter: 6.3.1 react: 18.1.0 @@ -4829,21 +5082,21 @@ packages: react: 18.1.0 dev: false - /react-switch/6.0.0_ef5jwxihqo6n7gxfmzogljlgcm: - resolution: {integrity: sha512-QV3/6eRK5/5epdQzIqvDAHRoGLbCv/wDpHUi6yBMXY1Xco5XGuIZxvB49PHoV1v/SpEgOCJLD/Zo43iic+aEIw==} + /react-switch/7.0.0_ef5jwxihqo6n7gxfmzogljlgcm: + resolution: {integrity: sha512-KkDeW+cozZXI6knDPyUt3KBN1rmhoVYgAdCJqAh7st7tk8YE6N0iR89zjCWO8T8dUTeJGTR0KU+5CHCRMRffiA==} peerDependencies: - react: ^15.3.0 || ^16.0.0 || ^17.0.0 - react-dom: ^15.3.0 || ^16.0.0 || ^17.0.0 + react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 dependencies: prop-types: 15.8.1 react: 18.1.0 react-dom: [email protected] dev: false - /react-table/[email protected]: - resolution: {integrity: sha512-jBlj70iBwOTvvImsU9t01LjFjy4sXEtclBovl3mTiqjz23Reu0DKnRza4zlLtOPACx6j2/7MrQIthIK1Wi+LIA==} + /react-table/[email protected]: + resolution: {integrity: sha512-hNaz4ygkZO4bESeFfnfOft73iBUj8K5oKi1EcSHPAibEydfsX2MyU6Z8KCr3mv3C9Kqqh71U+DhZkFvibbnPbA==} peerDependencies: - react: ^16.8.3 || ^17.0.0-0 + react: ^16.8.3 || ^17.0.0-0 || ^18.0.0 dependencies: react: 18.1.0 dev: false @@ -4874,7 +5127,7 @@ packages: react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 memoize-one: 5.2.1 react: 18.1.0 react-dom: [email protected] @@ -4900,8 +5153,8 @@ packages: picomatch: 2.3.1 dev: true - /recoil/0.7.3-alpha.1_ef5jwxihqo6n7gxfmzogljlgcm: - resolution: {integrity: sha512-jIcHieOD2F8pStmBCtAVqQPlKKAYkBF4lM5hXrrZrN83+uvdyJIXgBLz1iZ0ozkUqibN65Z8OsBUnB2nQM9q5g==} + /recoil/0.7.3_ef5jwxihqo6n7gxfmzogljlgcm: + resolution: {integrity: sha512-WaPppk3Hz5/V9nOVmu1X/o3cJyf/rLXw/YsEENvMzEDk+LKqMiGfFgZ3Gg51TKWccpCZCyrSBXn2O4L1E2WDPQ==} peerDependencies: react: '>=16.13.1' react-dom: '*' @@ -4934,7 +5187,7 @@ packages: /regenerator-transform/0.15.0: resolution: {integrity: sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==} dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 dev: true /regexp.prototype.flags/1.4.3: @@ -4983,8 +5236,8 @@ packages: engines: {node: '>=0.10.0'} dev: true - /reselect/4.1.5: - resolution: {integrity: sha512-uVdlz8J7OO+ASpBYoz1Zypgx0KasCY20H+N8JD13oUMtPvSHQuscrHop4KbXrbsBcdB9Ds7lVK7eRkBIfO43vQ==} + /reselect/4.1.6: + resolution: {integrity: sha512-ZovIuXqto7elwnxyXbBtCPo9YFEr3uJqj2rRbcOOog1bmu2Ag85M4hixSwFWyaBMKXNgvPaJ9OSu9SkBPIeJHQ==} dev: false /resize-observer-polyfill/1.5.1: @@ -5021,7 +5274,7 @@ packages: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: - glob: 7.2.0 + glob: 7.2.3 /rollup-plugin-terser/[email protected]: resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} @@ -5043,6 +5296,14 @@ packages: fsevents: 2.3.2 dev: true + /rollup/2.75.6: + resolution: {integrity: sha512-OEf0TgpC9vU6WGROJIk1JA3LR5vk/yvqlzxqdrE2CzzXnqKXNzbAwlWUXis8RS3ZPe7LAq+YUxsRa0l3r27MLA==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + /run-parallel/1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: @@ -5057,13 +5318,13 @@ packages: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: true - /sass/1.51.0: - resolution: {integrity: sha512-haGdpTgywJTvHC2b91GSq+clTKGbtkkZmVAb82jZQN/wTy6qs8DdFm2lhEQbEwrY0QDRgSQ3xDurqM977C3noA==} + /sass/1.52.3: + resolution: {integrity: sha512-LNNPJ9lafx+j1ArtA7GyEJm9eawXN8KlA1+5dF6IZyoONg1Tyo/g+muOsENWJH/2Q1FHbbV4UwliU0cXMa/VIA==} engines: {node: '>=12.0.0'} hasBin: true dependencies: chokidar: 3.5.3 - immutable: 4.0.0 + immutable: 4.1.0 source-map-js: 1.0.2 dev: true @@ -5163,7 +5424,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.0 + es-abstract: 1.20.1 get-intrinsic: 1.1.1 has-symbols: 1.0.3 internal-slot: 1.0.3 @@ -5225,14 +5486,14 @@ packages: tslib: 2.4.0 dev: false - /stylehacks/[email protected]: + /stylehacks/[email protected]: resolution: {integrity: sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: browserslist: 4.20.3 - postcss: 8.4.13 + postcss: 8.4.14 postcss-selector-parser: 6.0.10 dev: true @@ -5342,14 +5603,14 @@ packages: resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} dev: false - /tsutils/[email protected]: + /tsutils/[email protected]: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 4.6.4 + typescript: 4.7.3 dev: true /type-check/0.4.0: @@ -5369,8 +5630,8 @@ packages: engines: {node: '>=10'} dev: true - /typescript/4.6.4: - resolution: {integrity: sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==} + /typescript/4.7.3: + resolution: {integrity: sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==} engines: {node: '>=4.2.0'} hasBin: true dev: true @@ -5422,7 +5683,7 @@ packages: /unload/2.2.0: resolution: {integrity: sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==} dependencies: - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 detect-node: 2.1.0 dev: false @@ -5454,7 +5715,7 @@ packages: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true - /vite-plugin-pwa/[email protected]: + /vite-plugin-pwa/[email protected]: resolution: {integrity: sha512-KYD+cnS5ExLF3T28NkfzBLZ53ehHlp+qMhHGFNh0zlVGpFHrJkL2v9wd4AMi7ZkBTffgeNatIFiv8rhCsMSxBQ==} peerDependencies: vite: ^2.0.0 @@ -5463,7 +5724,7 @@ packages: fast-glob: 3.2.11 pretty-bytes: 6.0.0 rollup: 2.72.1 - vite: [email protected] + vite: [email protected] workbox-build: 6.5.3 workbox-window: 6.5.3 transitivePeerDependencies: @@ -5471,8 +5732,8 @@ packages: - supports-color dev: true - /vite/[email protected]: - resolution: {integrity: sha512-zsBGwn5UT3YS0NLSJ7hnR54+vUKfgzMUh/Z9CxF1YKEBVIe213+63jrFLmZphgGI5zXwQCSmqIdbPuE8NJywPw==} + /vite/[email protected]: + resolution: {integrity: sha512-suxC36dQo9Rq1qMB2qiRorNJtJAdxguu5TMvBHOc/F370KvqAe9t48vYp+/TbPKRNrMh/J55tOUmkuIqstZaew==} engines: {node: '>=12.2.0'} hasBin: true peerDependencies: @@ -5487,11 +5748,11 @@ packages: stylus: optional: true dependencies: - esbuild: 0.14.38 - postcss: 8.4.13 + esbuild: 0.14.43 + postcss: 8.4.14 resolve: 1.22.0 - rollup: 2.72.1 - sass: 1.51.0 + rollup: 2.75.6 + sass: 1.52.3 optionalDependencies: fsevents: 2.3.2 dev: true @@ -5573,7 +5834,7 @@ packages: '@apideck/better-ajv-errors': [email protected] '@babel/core': 7.17.10 '@babel/preset-env': 7.17.10_@[email protected] - '@babel/runtime': 7.17.9 + '@babel/runtime': 7.18.3 '@rollup/plugin-babel': 5.3.1_ddp4whfhauf2n5cf6yj7gaerwe '@rollup/plugin-node-resolve': [email protected] '@rollup/plugin-replace': [email protected] diff --git a/src/api/configs.ts b/src/api/configs.ts index 3734958..8a9b339 100644 --- a/src/api/configs.ts +++ b/src/api/configs.ts @@ -24,10 +24,7 @@ function configsPatchWorkaround(o: ClashConfigPartial) { return o; } -export async function updateConfigs( - apiConfig: ClashAPIConfig, - o: ClashConfigPartial -) { +export async function updateConfigs(apiConfig: ClashAPIConfig, o: ClashConfigPartial) { const { url, init } = getURLAndInit(apiConfig); const body = JSON.stringify(configsPatchWorkaround(o)); return await fetch(url + endpoint, { ...init, body, method: 'PATCH' }); diff --git a/src/api/connections.ts b/src/api/connections.ts index cedb227..6690f30 100644 --- a/src/api/connections.ts +++ b/src/api/connections.ts @@ -53,10 +53,7 @@ function appendData(s: string) { type UnsubscribeFn = () => void; let wsState: number; -export function fetchData( - apiConfig: ClashAPIConfig, - listener: unknown -): UnsubscribeFn | void { +export function fetchData(apiConfig: ClashAPIConfig, listener: unknown): UnsubscribeFn | void { if (fetched || wsState === 1) { if (listener) return subscribe(listener); } diff --git a/src/api/proxies.ts b/src/api/proxies.ts index 079106b..be09d7c 100644 --- a/src/api/proxies.ts +++ b/src/api/proxies.ts @@ -1,3 +1,5 @@ +import { ClashAPIConfig } from '$src/types'; + import { getURLAndInit } from '../misc/request-helper'; const endpoint = '/proxies'; @@ -14,16 +16,21 @@ $ curl "http://127.0.0.1:8080/proxies/GLOBAL" -XPUT -d '{ "name": "Proxy" }' -i HTTP/1.1 204 No Content */ -export async function fetchProxies(config) { +export async function fetchProxies(config: ClashAPIConfig) { const { url, init } = getURLAndInit(config); const res = await fetch(url + endpoint, init); return await res.json(); } -export async function requestToSwitchProxy(apiConfig, name1, name2) { - const body = { name: name2 }; +export async function requestToSwitchProxy( + apiConfig: ClashAPIConfig, + groupName: string, + name: string +) { + const body = { name }; const { url, init } = getURLAndInit(apiConfig); - const fullURL = `${url}${endpoint}/${name1}`; + const group = encodeURIComponent(groupName); + const fullURL = `${url}${endpoint}/${group}`; return await fetch(fullURL, { ...init, method: 'PUT', @@ -32,12 +39,12 @@ export async function requestToSwitchProxy(apiConfig, name1, name2) { } export async function requestDelayForProxy( - apiConfig, - name, + apiConfig: ClashAPIConfig, + name: string, latencyTestUrl = 'http://www.gstatic.com/generate_204' ) { const { url, init } = getURLAndInit(apiConfig); - const qs = `timeout=5000&url=${latencyTestUrl}`; + const qs = `timeout=5000&url=${encodeURIComponent(latencyTestUrl)}`; const fullURL = `${url}${endpoint}/${encodeURIComponent(name)}/delay?${qs}`; return await fetch(fullURL, init); } @@ -62,17 +69,14 @@ export async function fetchProviderProxies(config) { return await res.json(); } -export async function updateProviderByName(config, name) { +export async function updateProviderByName(config: ClashAPIConfig, name: string) { const { url, init } = getURLAndInit(config); const options = { ...init, method: 'PUT' }; return await fetch(url + '/providers/proxies/' + name, options); } -export async function healthcheckProviderByName(config, name) { +export async function healthcheckProviderByName(config: ClashAPIConfig, name: string) { const { url, init } = getURLAndInit(config); const options = { ...init, method: 'GET' }; - return await fetch( - url + '/providers/proxies/' + name + '/healthcheck', - options - ); + return await fetch(url + '/providers/proxies/' + name + '/healthcheck', options); } diff --git a/src/api/rule-provider.ts b/src/api/rule-provider.ts index ec9fa7b..5ecd61e 100644 --- a/src/api/rule-provider.ts +++ b/src/api/rule-provider.ts @@ -31,10 +31,7 @@ function normalizeAPIResponse(data: RuleProviderAPIData) { return { byName, names }; } -export async function fetchRuleProviders( - endpoint: string, - apiConfig: ClashAPIConfig -) { +export async function fetchRuleProviders(endpoint: string, apiConfig: ClashAPIConfig) { const { url, init } = getURLAndInit(apiConfig); let data = { providers: {} }; diff --git a/src/api/rules.ts b/src/api/rules.ts index b57b0e3..4d18c23 100644 --- a/src/api/rules.ts +++ b/src/api/rules.ts @@ -12,9 +12,7 @@ type RuleAPIItem = { proxy: string; }; -function normalizeAPIResponse(json: { - rules: Array<RuleAPIItem>; -}): Array<RuleItem> { +function normalizeAPIResponse(json: { rules: Array<RuleAPIItem> }): Array<RuleItem> { invariant( json.rules && json.rules.length >= 0, 'there is no valid rules list in the rules API response' diff --git a/src/api/traffic.ts b/src/api/traffic.ts index cd18aac..aa9143c 100644 --- a/src/api/traffic.ts +++ b/src/api/traffic.ts @@ -27,7 +27,7 @@ const traffic = { this.subscribers.forEach((f) => f(o)); }, - subscribe(listener: (x:any) => void) { + subscribe(listener: (x: any) => void) { this.subscribers.push(listener); return () => { const idx = this.subscribers.indexOf(listener); diff --git a/src/components/APIConfig.tsx b/src/components/APIConfig.tsx index 6e11bc4..4a11c92 100644 --- a/src/components/APIConfig.tsx +++ b/src/components/APIConfig.tsx @@ -72,9 +72,9 @@ function APIConfig({ dispatch }) { const detectApiServer = async () => { // if there is already a clash API server at `/`, just use it as default value const res = await fetch('/'); - res.json().then(data => { + res.json().then((data) => { if (data['hello'] === 'clash') { - setBaseURL(window.location.origin) + setBaseURL(window.location.origin); } }); }; @@ -82,7 +82,6 @@ function APIConfig({ dispatch }) { detectApiServer(); }, []); - return ( // eslint-disable-next-line jsx-a11y/no-static-element-interactions <div className={s0.root} ref={contentEl} onKeyDown={handleContentOnKeyDown}> diff --git a/src/components/APIDiscovery.tsx b/src/components/APIDiscovery.tsx index f34c886..d211e04 100644 --- a/src/components/APIDiscovery.tsx +++ b/src/components/APIDiscovery.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { ThemeSwitcher } from 'src/components/shared/ThemeSwitcher'; -import { DOES_NOT_SUPPORT_FETCH, errors } from 'src/misc/errors'; +import { DOES_NOT_SUPPORT_FETCH, errors, YacdError } from 'src/misc/errors'; import { getClashAPIConfig } from 'src/store/app'; import { fetchConfigs } from 'src/store/configs'; import { closeModal } from 'src/store/modals'; @@ -16,9 +16,7 @@ const { useCallback, useEffect } = React; function APIDiscovery({ dispatch, apiConfig, modals }) { if (!window.fetch) { const { detail } = errors[DOES_NOT_SUPPORT_FETCH]; - const err = new Error(detail); - // @ts-expect-error ts-migrate(2339) FIXME: Property 'code' does not exist on type 'Error'. - err.code = DOES_NOT_SUPPORT_FETCH; + const err = new YacdError(detail, DOES_NOT_SUPPORT_FETCH); throw err; } diff --git a/src/components/BackendList.tsx b/src/components/BackendList.tsx index 8e0d906..9ad833c 100644 --- a/src/components/BackendList.tsx +++ b/src/components/BackendList.tsx @@ -2,10 +2,7 @@ import cx from 'clsx'; import * as React from 'react'; import { Eye, EyeOff, X as Close } from 'react-feather'; import { useToggle } from 'src/hooks/basic'; -import { - getClashAPIConfigs, - getSelectedClashAPIConfigIndex, -} from 'src/store/app'; +import { getClashAPIConfigs, getSelectedClashAPIConfigIndex } from 'src/store/app'; import { ClashAPIConfig } from 'src/types'; import s from './BackendList.module.scss'; @@ -113,8 +110,6 @@ function Item({ {secret ? ( <> <span className={s.secret}>{show ? secret : '***'}</span> - - {/* @ts-expect-error ts-migrate(2322) FIXME: Type 'boolean | (() => void)' is not assignable to... Remove this comment to see the full error message */} <Button onClick={toggle} className={s.eye}> <Icon size={20} /> </Button> @@ -137,11 +132,7 @@ function Button({ disabled?: boolean; }) { return ( - <button - disabled={disabled} - className={cx(className, s.btn)} - onClick={onClick} - > + <button disabled={disabled} className={cx(className, s.btn)} onClick={onClick}> {children} </button> ); diff --git a/src/components/Button.module.scss b/src/components/Button.module.scss index b46d79c..710d3ad 100644 --- a/src/components/Button.module.scss +++ b/src/components/Button.module.scss @@ -23,16 +23,16 @@ transform: scale(0.97); } - font-size: 0.75em; - padding: 4px 7px; - @media (--breakpoint-not-small) { - font-size: small; - padding: 6px 12px; + padding: 10px 13px; + + &.circular { + padding: 8px; } &.minimal { border-color: transparent; background: none; + padding: 6px 12px; &:focus { border-color: var(--color-focus-blue); } diff --git a/src/components/Button.tsx b/src/components/Button.tsx index 1725d1b..8125edc 100644 --- a/src/components/Button.tsx +++ b/src/components/Button.tsx @@ -17,7 +17,7 @@ type ButtonProps = { isLoading?: boolean; onClick?: (e: React.MouseEvent<HTMLButtonElement>) => unknown; disabled?: boolean; - kind?: 'primary' | 'minimal'; + kind?: 'primary' | 'minimal' | 'circular'; className?: string; title?: string; } & ButtonInternalProps; @@ -36,7 +36,7 @@ function Button(props: ButtonProps, ref: React.Ref<HTMLButtonElement>) { ...restProps } = props; const internalProps = { children, label, text, start }; - const internalOnClick = useCallback( + const internalOnClick = useCallback<React.MouseEventHandler<HTMLButtonElement>>( (e) => { if (isLoading) return; onClick && onClick(e); @@ -45,7 +45,7 @@ function Button(props: ButtonProps, ref: React.Ref<HTMLButtonElement>) { ); const btnClassName = cx( s0.btn, - { [s0.minimal]: kind === 'minimal' }, + { [s0.minimal]: kind === 'minimal', [s0.circular]: kind === 'circular' }, className ); return ( @@ -76,9 +76,7 @@ function ButtonInternal({ children, label, text, start }: ButtonInternalProps) { return ( <> {start ? ( - <span className={s0.btnStart}> - {typeof start === 'function' ? start() : start} - </span> + <span className={s0.btnStart}>{typeof start === 'function' ? start() : start}</span> ) : null} {children || label || text} </> diff --git a/src/components/Collapsible.tsx b/src/components/Collapsible.tsx index e9a1ee8..65284cd 100644 --- a/src/components/Collapsible.tsx +++ b/src/components/Collapsible.tsx @@ -1,17 +1,18 @@ -import React from 'react'; +import type { MutableRefObject } from 'react'; +import * as React from 'react'; import ResizeObserver from 'resize-observer-polyfill'; import { framerMotionResouce } from '../misc/motion'; const { memo, useState, useRef, useEffect } = React; -function usePrevious(value) { +function usePrevious(value: any) { const ref = useRef(); useEffect(() => void (ref.current = value), [value]); return ref.current; } -function useMeasure() { +function useMeasure(): [MutableRefObject<HTMLElement>, { height: number }] { const ref = useRef(); const [bounds, set] = useState({ height: 0 }); useEffect(() => { @@ -27,7 +28,7 @@ const variantsCollpapsibleWrap = { height: 'auto', transition: { duration: 0 }, }, - open: (height) => ({ + open: (height: number) => ({ height, opacity: 1, visibility: 'visible', @@ -50,30 +51,21 @@ const variantsCollpapsibleChildContainer = { }, }; -// @ts-expect-error ts-migrate(2339) FIXME: Property 'isOpen' does not exist on type '{ childr... Remove this comment to see the full error message -const Collapsible = memo(({ children, isOpen }) => { +type CollapsibleProps = { children: React.ReactNode; isOpen?: boolean }; + +const Collapsible = memo(({ children, isOpen }: CollapsibleProps) => { const module = framerMotionResouce.read(); const motion = module.motion; const previous = usePrevious(isOpen); - // @ts-expect-error ts-migrate(2339) FIXME: Property 'height' does not exist on type 'MutableR... Remove this comment to see the full error message const [refToMeature, { height }] = useMeasure(); return ( <div> <motion.div - animate={ - isOpen && previous === isOpen - ? 'initialOpen' - : isOpen - ? 'open' - : 'closed' - } + animate={isOpen && previous === isOpen ? 'initialOpen' : isOpen ? 'open' : 'closed'} custom={height} variants={variantsCollpapsibleWrap} > - <motion.div - variants={variantsCollpapsibleChildContainer} - ref={refToMeature} - > + <motion.div variants={variantsCollpapsibleChildContainer} ref={refToMeature}> {children} </motion.div> </motion.div> diff --git a/src/components/CollapsibleSectionHeader.tsx b/src/components/CollapsibleSectionHeader.tsx index 2d5ecd1..8b701e1 100644 --- a/src/components/CollapsibleSectionHeader.tsx +++ b/src/components/CollapsibleSectionHeader.tsx @@ -39,12 +39,7 @@ export default function Header({ name, type, toggle, isOpen, qty }: Props) { {typeof qty === 'number' ? <span className={s.qty}>{qty}</span> : null} - <Button - kind="minimal" - onClick={toggle} - className={s.btn} - title="Toggle collapsible section" - > + <Button kind="minimal" onClick={toggle} className={s.btn} title="Toggle collapsible section"> <span className={cx(s.arrow, { [s.isOpen]: isOpen })}> <ChevronDown size={20} /> </span> diff --git a/src/components/Config.tsx b/src/components/Config.tsx index ded79ad..804e87f 100644 --- a/src/components/Config.tsx +++ b/src/components/Config.tsx @@ -7,21 +7,8 @@ import Select from 'src/components/shared/Select'; import { ClashGeneralConfig, DispatchFn, State } from 'src/store/types'; import { ClashAPIConfig } from 'src/types'; -import { fetchVersion } from '$src/api/version'; - -import { - getClashAPIConfig, - getLatencyTestUrl, - getSelectedChartStyleIndex, -} from '../store/app'; -import { - fetchConfigs, - flushFakeIPPool, - getConfigs, - reloadConfigFile, - updateConfigs, - updateGeoDatabasesFile, -} from '../store/configs'; +import { getClashAPIConfig, getLatencyTestUrl, getSelectedChartStyleIndex } from '../store/app'; +import { fetchConfigs, getConfigs, updateConfigs } from '../store/configs'; import { openModal } from '../store/modals'; import Button from './Button'; import s0 from './Config.module.scss'; @@ -119,7 +106,7 @@ function ConfigImpl({ }, [dispatch]); const setConfigState = useCallback( - (name, val) => { + (name: keyof ClashGeneralConfig, val: ClashGeneralConfig[keyof ClashGeneralConfig]) => { setConfigStateInternal({ ...configState, [name]: val }); }, [configState] @@ -169,14 +156,14 @@ function ConfigImpl({ [apiConfig, dispatch, setConfigState, setTunConfigState] ); - const handleInputOnChange = useCallback( + const handleInputOnChange = useCallback<React.ChangeEventHandler<HTMLInputElement>>( (e) => handleChangeValue(e.target), [handleChangeValue] ); const { selectChartStyleIndex, updateAppConfig } = useStoreActions(); - const handleInputOnBlur = useCallback( + const handleInputOnBlur = useCallback<React.FocusEventHandler<HTMLInputElement>>( (e) => { const target = e.target; const { name, value } = target; @@ -232,7 +219,6 @@ function ConfigImpl({ name={f.key} value={configState[f.key]} onChange={handleInputOnChange} - // @ts-expect-error ts-migrate(2322) FIXME: Type '{ name: string; value: any; onChange: (e: an... Remove this comment to see the full error message onBlur={handleInputOnBlur} /> </div> @@ -243,10 +229,8 @@ function ConfigImpl({ <div className={s0.label}>Mode</div> <Select options={modeOptions} - selected={configState['mode']} - onChange={(e) => - handleChangeValue({ name: 'mode', value: e.target.value }) - } + selected={mode} + onChange={(e) => handleChangeValue({ name: 'mode', value: e.target.value })} /> </div> @@ -255,137 +239,4 @@ function ConfigImpl({ <Select options={logLeveOptions} selected={configState['log-level']} - onChange={(e) => - handleChangeValue({ name: 'log-level', value: e.target.value }) - } - /> - </div> - - <div> - <div className={s0.label}>{t('allow_lan')}</div> - <div className={s0.wrapSwitch}> - <Switch - name="allow-lan" - checked={configState['allow-lan']} - onChange={(value: boolean) => - handleChangeValue({ name: 'allow-lan', value: value }) - } - /> - </div> - </div> - { version.meta && - <div> - <div className={s0.label}>{t('tls_sniffing')}</div> - <div className={s0.wrapSwitch}> - <Switch - name="sniffing" - checked={configState['sniffing']} - onChange={(value: boolean) => - handleChangeValue({ name: 'sniffing', value: value }) - } - /> - </div> - </div>} - </div> - <div className={s0.sep} > - <div /> - </div> - { version.meta && - <> - <div className={s0.section}> - <div> - <div className={s0.label}>{t('enable_tun_device')}</div> - <div className={s0.wrapSwitch}> - <Switch - checked={configState['tun']?.enable} - onChange={(value: boolean) => - handleChangeValue({ name: 'enable', value: value }) - } - /> - </div> - </div> - <div> - <div className={s0.label}>TUN IP Stack</div> - <Select - options={tunStackOptions} - selected={configState['tun']?.stack} - onChange={(e) => - handleChangeValue({ name: 'stack', value: e.target.value }) - } - /> - </div> - </div> - <div className={s0.sep}> - <div /> - </div> - <div className={s0.section}> - <div> - <div className={s0.label}>Reload</div> - <Button - start={<RotateCw size={16} />} - label={t('reload_config_file')} - onClick={handleReloadConfigFile} /> - </div> - <div> - <div className={s0.label}>GEO Databases</div> - <Button - start={<DownloadCloud size={16} />} - label={t('update_geo_databases_file')} - onClick={handleUpdateGeoDatabasesFile} /> - </div> - <div> - <div className={s0.label}>FakeIP</div> - <Button - start={<Trash2 size={16} />} - label={t('flush_fake_ip_pool')} - onClick={handleFlushFakeIPPool} /> - </div> - </div> - <div className={s0.sep}> - <div /> - </div> - </>} - - <div className={s0.section}> - <div> - <div className={s0.label}>{t('latency_test_url')}</div> - <SelfControlledInput - name="latencyTestUrl" - type="text" - value={latencyTestUrl} - onBlur={handleInputOnBlur} - /> - </div> - <div> - <div className={s0.label}>{t('lang')}</div> - <div> - <Select - options={langOptions} - selected={i18n.language} - onChange={(e) => i18n.changeLanguage(e.target.value)} - /> - </div> - </div> - - <div> - <div className={s0.label}>{t('chart_style')}</div> - <Selection2 - OptionComponent={TrafficChartSample} - optionPropsList={propsList} - selectedIndex={selectedChartStyleIndex} - onChange={selectChartStyleIndex} - /> - </div> - - <div> - <div className={s0.label}>Action</div> - <Button - start={<LogOut size={16} />} - label="Switch backend" - onClick={openAPIConfigModal} - /> - </div> - </div> - </div> - ); -} + onChange={(e) => handleChangeValue({ name: 'log-level', value: e.target.value })} diff --git a/src/components/ConnectionTable.tsx b/src/components/ConnectionTable.tsx index a8ad827..879442a 100644 --- a/src/components/ConnectionTable.tsx +++ b/src/components/ConnectionTable.tsx @@ -71,11 +71,8 @@ function Table({ data }) { return ( <div {...headerGroup.getHeaderGroupProps()} className={s.tr}> {headerGroup.headers.map((column) => ( - <div - {...column.getHeaderProps(column.getSortByToggleProps())} - className={s.th} - > - <span>{t(column.render('Header'))}</span> + <div {...column.getHeaderProps(column.getSortByToggleProps())} className={s.th}> + <span>{column.render('Header')}</span> <span className={s.sortIconContainer}> {column.isSorted ? ( <span className={column.isSortedDesc ? '' : s.rotate180}> diff --git a/src/components/Connections.tsx b/src/components/Connections.tsx index 3769b32..a36031e 100644 --- a/src/components/Connections.tsx +++ b/src/components/Connections.tsx @@ -124,7 +124,7 @@ function renderTableOrPlaceholder(conns: FormattedConn[]) { ); } -function ConnQty({ qty }) { +function connQty({ qty }) { return qty < 100 ? '' + qty : '99+'; } @@ -194,17 +194,11 @@ function Conn({ apiConfig }) { <TabList> <Tab> <span>{t('Active')}</span> - <span className={s.connQty}> - {/* @ts-expect-error ts-migrate(2786) FIXME: 'ConnQty' cannot be used as a JSX component. */} - <ConnQty qty={filteredConns.length} /> - </span> + <span className={s.connQty}>{connQty({ qty: filteredConns.length })}</span> </Tab> <Tab> <span>{t('Closed')}</span> - <span className={s.connQty}> - {/* @ts-expect-error ts-migrate(2786) FIXME: 'ConnQty' cannot be used as a JSX component. */} - <ConnQty qty={filteredClosedConns.length} /> - </span> + <span className={s.connQty}>{connQty({ qty: filteredClosedConns.length })}</span> </Tab> </TabList> <div className={s.inputWrapper}> diff --git a/src/components/Input.tsx b/src/components/Input.tsx index c132a3b..efb5665 100644 --- a/src/components/Input.tsx +++ b/src/components/Input.tsx @@ -7,7 +7,8 @@ const { useState, useRef, useEffect, useCallback } = React; type InputProps = { value?: string | number; type?: string; - onChange?: (...args: any[]) => any; + onChange?: React.ChangeEventHandler<HTMLInputElement>; + onBlur?: React.FocusEventHandler<HTMLInputElement>; name?: string; placeholder?: string; }; @@ -26,17 +27,7 @@ export function SelfControlledInput({ value, ...restProps }) { } refValue.current = value; }, [value]); - const onChange = useCallback( - (e) => setInternalValue(e.target.value), - [setInternalValue] - ); + const onChange = useCallback((e) => setInternalValue(e.target.value), [setInternalValue]); - return ( - <input - className={s0.input} - value={internalValue} - onChange={onChange} - {...restProps} - /> - ); + return <input className={s0.input} value={internalValue} onChange={onChange} {...restProps} />; } diff --git a/src/components/Logs.tsx b/src/components/Logs.tsx index 1dd00a8..003ff0d 100644 --- a/src/components/Logs.tsx +++ b/src/components/Logs.tsx @@ -1,7 +1,8 @@ import * as React from 'react'; import { Pause, Play } from 'react-feather'; import { useTranslation } from 'react-i18next'; -import { fetchLogs, reconnect as reconnectLogs,stop as stopLogs } from 'src/api/logs'; +import { areEqual, FixedSizeList as List, ListChildComponentProps } from 'react-window'; +import { fetchLogs, reconnect as reconnectLogs, stop as stopLogs } from 'src/api/logs'; import ContentHeader from 'src/components/ContentHeader'; import LogSearch from 'src/components/LogSearch'; import { connect, useStoreActions } from 'src/components/StateProvider'; diff --git a/src/components/Root.scss b/src/components/Root.scss index 8a7a57c..0a7fc4f 100644 --- a/src/components/Root.scss +++ b/src/components/Root.scss @@ -90,6 +90,7 @@ body { --color-background: #202020; --color-background2: rgba(32, 32, 32, 0.3); --color-bg-card: #2d2d2d; + --card-hover-border-lightness: 30%; --color-text: #ddd; --color-text-secondary: #ccc; --color-text-highlight: #fff; @@ -118,6 +119,7 @@ body { --color-background: #eee; --color-background2: rgba(240, 240, 240, 0.3); --color-bg-card: #fafafa; + --card-hover-border-lightness: 80%; --color-text: #222; --color-text-secondary: #646464; --color-text-highlight: #040404; diff --git a/src/components/Rules.tsx b/src/components/Rules.tsx index e105edf..4b17a4b 100644 --- a/src/components/Rules.tsx +++ b/src/components/Rules.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import * as React from 'react'; import { useTranslation } from 'react-i18next'; import { areEqual, VariableSizeList } from 'react-window'; import { RuleProviderItem } from 'src/components/rules/RuleProviderItem'; @@ -7,7 +7,7 @@ import { RulesPageFab } from 'src/components/rules/RulesPageFab'; import { TextFilter } from 'src/components/shared/TextFitler'; import { ruleFilterText } from 'src/store/rules'; import { State } from 'src/store/types'; -import { ClashAPIConfig } from 'src/types'; +import { ClashAPIConfig, RuleType } from 'src/types'; import useRemainingViewPortHeight from '../hooks/useRemainingViewPortHeight'; import { getClashAPIConfig } from '../store/app'; @@ -41,15 +41,24 @@ function getItemSizeFactory({ provider }) { const providerQty = provider.names.length; if (idx < providerQty) { // provider - return 90; + return 110; } // rule return 60; }; } -// @ts-expect-error ts-migrate(2339) FIXME: Property 'index' does not exist on type '{ childre... Remove this comment to see the full error message -const Row = memo(({ index, style, data }) => { +type RowProps = { + index: number; + style: React.CSSProperties; + data: { + apiConfig: ClashAPIConfig; + rules: RuleType[]; + provider: { names: string[]; byName: any }; + }; +}; + +const Row = memo(({ index, style, data }: RowProps) => { const { rules, provider, apiConfig } = data; const providerQty = provider.names.length; diff --git a/src/components/Search.tsx b/src/components/Search.tsx index 6edc4a5..9762d8f 100644 --- a/src/components/Search.tsx +++ b/src/components/Search.tsx @@ -25,12 +25,7 @@ function RuleSearch({ dispatch, searchText, updateSearchText }) { <div className={s0.RuleSearch}> <div className={s0.RuleSearchContainer}> <div className={s0.inputWrapper}> - <input - type="text" - value={text} - onChange={onChange} - className={s0.input} - /> + <input type="text" value={text} onChange={onChange} className={s0.input} /> </div> <div className={s0.iconWrapper}> <SearchIcon size={20} /> diff --git a/src/components/SideBar.tsx b/src/components/SideBar.tsx index dbe7f0d..2c5ba0c 100644 --- a/src/components/SideBar.tsx +++ b/src/components/SideBar.tsx @@ -3,14 +3,7 @@ import cx from 'clsx'; import * as React from 'react'; import { Info } from 'react-feather'; import { useTranslation } from 'react-i18next'; -import { - FcAreaChart, - FcDocument, - FcGlobe, - FcLink, - FcRuler, - FcSettings, -} from 'react-icons/fc'; +import { FcAreaChart, FcDocument, FcGlobe, FcLink, FcRuler, FcSettings } from 'react-icons/fc'; import { Link, useLocation } from 'react-router-dom'; import { ThemeSwitcher } from 'src/components/shared/ThemeSwitcher'; diff --git a/src/components/StyleGuide.tsx b/src/components/StyleGuide.tsx index ee38697..910c538 100644 --- a/src/components/StyleGuide.tsx +++ b/src/components/StyleGuide.tsx @@ -4,6 +4,7 @@ import Loading from 'src/components/Loading'; import Button from './Button'; import Input from './Input'; +import { ZapAnimated } from './shared/ZapAnimated'; import SwitchThemed from './SwitchThemed'; import ToggleSwitch from './ToggleSwitch'; @@ -21,7 +22,9 @@ const optionsRule = [ { label: 'Direct', value: 'Direct' }, ]; -const Pane = ({ children, style }) => <div style={{ ...paneStyle, ...style }}>{children}</div>; +const Pane = ({ children, style }: { children: React.ReactNode; style?: React.CSSProperties }) => ( + <div style={{ ...paneStyle, ...style }}>{children}</div> +); function useToggle(initialState = false) { const [onoff, setonoff] = React.useState(initialState); @@ -40,19 +43,18 @@ class StyleGuide extends PureComponent { render() { return ( <div> - {/* @ts-expect-error ts-migrate(2741) FIXME: Property 'style' is missing in type '{ children: E... Remove this comment to see the full error message */} + <Pane> + <ZapAnimated /> + </Pane> <Pane> <SwitchExample /> </Pane> - {/* @ts-expect-error ts-migrate(2741) FIXME: Property 'style' is missing in type '{ children: E... Remove this comment to see the full error message */} <Pane> <Input /> </Pane> - {/* @ts-expect-error ts-migrate(2741) FIXME: Property 'style' is missing in type '{ children: E... Remove this comment to see the full error message */} <Pane> <ToggleSwitch name="test" options={optionsRule} value="Rule" onChange={noop} /> </Pane> - {/* @ts-expect-error ts-migrate(2741) FIXME: Property 'style' is missing in type '{ children: E... Remove this comment to see the full error message */} <Pane> <Button text="Test Lxatency" start={<Zap size={16} />} /> <Button text="Test Lxatency" start={<Zap size={16} />} isLoading /> diff --git a/src/components/SvgYacd.tsx b/src/components/SvgYacd.tsx index 49455e3..803936c 100644 --- a/src/components/SvgYacd.tsx +++ b/src/components/SvgYacd.tsx @@ -23,19 +23,24 @@ function SvgYacd({ }: Props) { const faceClasName = cx({ [s.path]: animate }); return ( - <svg xmlns="http://www.w3.org/2000/svg" version="1.2" viewBox="0 0 512 512" width={width} height={height}> - <path id="Layer" className={faceClasName} fill={c0} stroke={line} strokeLinecap="round" strokeWidth="4" - d="m280.8 182.4l119-108.3c1.9-1.7 4.3-2.7 6.8-2.4l39.5 4.1c2.1 0.3 3.9 2.2 3.9 4.4v251.1c0 2-1.5 3.9-3.5 4.4l-41.9 9c-0.5 0.3-1.2 0.3-1.9 0.3h-18.8c-2.4 0-4.4-2-4.4-4.4v-132.9c0-7.5-9-11.7-14.8-6.3l-59 53.4c-2.2 2.2-5.4 2.9-8.5 1.9-27.1-8-56.3-8-83.4 0-2.9 1-6.1 0.3-8.5-1.9l-59-53.4c-5.6-5.4-14.6-1.2-14.6 6.3v132.9c0 2.4-2.2 4.4-4.7 4.4h-18.7c-0.7 0-1.2 0-2-0.3l-41.6-9c-2-0.5-3.5-2.4-3.5-4.4v-251.1c0-2.2 1.8-4.1 3.9-4.4l39.5-4.1c2.5-0.3 4.9 0.7 6.9 2.4l115.7 105.3c2 1.7 4.6 2.5 7.1 2.2 15.3-2.2 31.4-1.9 46.5 0.8z"/> - <path id="Layer" className={faceClasName} fill={c0} stroke={line} strokeLinecap="round" strokeWidth="4" - d="m269.4 361.8l-7.1 13.4c-2.4 4.2-8.5 4.2-11 0l-7-13.4c-2.5-4.1 0.7-9.3 5.3-9h14.4c4.9 0 7.8 4.9 5.4 9z"/> - <path id="Layer" className={faceClasName} fill={c1} stroke={line} strokeLinecap="round" strokeWidth="4" - d="m160.7 362.5c3.6 0 6.8 3.2 6.8 6.9 0 3.6-3.2 6.5-6.8 6.5h-94.6c-3.6 0-6.8-2.9-6.8-6.5 0-3.7 3.2-6.9 6.8-6.9z" /> - <path id="Layer" className={faceClasName} fill={c1} stroke={line} strokeLinecap="round" strokeWidth="4" - d="m158.7 394.7c3.4-1 7.1 1 8.3 4.4 1 3.4-1 7.3-4.4 8.3l-92.8 31.7c-3.4 1.2-7.3-0.7-8.3-4.2-1.2-3.6 0.7-7.3 4.4-8.5z" /> - <path id="Layer" className={faceClasName} fill={c1} stroke={line} strokeLinecap="round" strokeWidth="4" - d="m446.1 426.4c3.4 1.2 5.3 4.9 4.3 8.5-1.2 3.5-4.8 5.4-8.2 4.2l-93.1-31.7c-3.5-1-5.4-4.9-4.2-8.3 1-3.4 4.9-5.4 8.3-4.4z" /> - <path id="Layer" className={faceClasName} fill={c1} stroke={line} strokeLinecap="round" strokeWidth="4" - d="m445.8 362.5c3.7 0 6.6 3.2 6.6 6.9 0 3.6-2.9 6.5-6.6 6.5h-94.8c-3.6 0-6.6-2.9-6.6-6.5 0-3.7 3-6.9 6.6-6.9z" /> + <svg width={width} height={height} viewBox="0 0 320 320" xmlns="http://www.w3.org/2000/svg"> + <g fill="none" fillRule="evenodd"> + {/* face */} + <path + d="M71.689 53.055c9.23-1.487 25.684 27.263 41.411 56.663 18.572-8.017 71.708-7.717 93.775 0 4.714-15.612 31.96-57.405 41.626-56.663 3.992.088 13.07 31.705 23.309 94.96 2.743 16.949 7.537 47.492 14.38 91.63-42.339 17.834-84.37 26.751-126.095 26.751-41.724 0-83.756-8.917-126.095-26.751C52.973 116.244 65.536 54.047 71.689 53.055z" + stroke={stroke} + strokeWidth="4" + strokeLinecap="round" + fill={c0} + className={faceClasName} + /> + <circle fill={eye} cx="216.5" cy="181.5" r="14.5" /> + <circle fill={eye} cx="104.5" cy="181.5" r="14.5" /> + {/* mouth */} + <g stroke={mouth} strokeLinecap="round" strokeWidth="4"> + <path d="M175.568 218.694c-2.494 1.582-5.534 2.207-8.563 1.508-3.029-.7-5.487-2.594-7.035-5.11M143.981 218.694c2.494 1.582 5.534 2.207 8.563 1.508 3.03-.7 5.488-2.594 7.036-5.11" /> + </g> + </g> </svg> ); } diff --git a/src/components/ToggleSwitch.tsx b/src/components/ToggleSwitch.tsx index 9eb1019..58400c9 100644 --- a/src/components/ToggleSwitch.tsx +++ b/src/components/ToggleSwitch.tsx @@ -10,10 +10,7 @@ type Props = { }; function ToggleSwitch({ options, value, name, onChange }: Props) { - const idxSelected = useMemo( - () => options.map((o) => o.value).indexOf(value), - [options, value] - ); + const idxSelected = useMemo(() => options.map((o) => o.value).indexOf(value), [options, value]); const getPortionPercentage = useCallback( (idx: number) => { diff --git a/src/components/TrafficChart.tsx b/src/components/TrafficChart.tsx index 0d67ae0..588049d 100644 --- a/src/components/TrafficChart.tsx +++ b/src/components/TrafficChart.tsx @@ -1,21 +1,17 @@ import * as React from 'react'; import { useTranslation } from 'react-i18next'; -import { State } from '$src/store/types'; +import { State } from '$src/store/types'; import { fetchData } from '../api/traffic'; import useLineChart from '../hooks/useLineChart'; -import { - chartJSResource, - chartStyles, - commonDataSetProps, -} from '../misc/chart'; +import { chartJSResource, chartStyles, commonDataSetProps } from '../misc/chart'; import { getClashAPIConfig, getSelectedChartStyleIndex } from '../store/app'; import { connect } from './StateProvider'; const { useMemo } = React; -const chartWrapperStyle = { +const chartWrapperStyle: React.CSSProperties = { // make chartjs chart responsive position: 'relative', maxWidth: 1000, @@ -51,13 +47,12 @@ function TrafficChart({ apiConfig, selectedChartStyleIndex }) { }, ], }), - [ traffic, selectedChartStyleIndex, t] + [traffic, selectedChartStyleIndex, t] ); useLineChart(ChartMod.Chart, 'trafficChart', data, traffic); return ( - // @ts-expect-error ts-migrate(2322) FIXME: Type '{ position: string; maxWidth: number; }' is ... Remove this comment to see the full error message <div style={chartWrapperStyle}> <canvas id="trafficChart" /> </div> diff --git a/src/components/TrafficNow.module.scss b/src/components/TrafficNow.module.scss index 4d47ad2..d86b993 100644 --- a/src/components/TrafficNow.module.scss +++ b/src/components/TrafficNow.module.scss @@ -6,10 +6,12 @@ justify-content: space-between; max-width: 1000px; + display: grid; + grid-template-columns: repeat(auto-fit, 180px); + grid-gap: 10px; + .sec { padding: 10px; - width: 19%; - margin: 3px; background-color: var(--color-bg-card); border-radius: 10px; box-shadow: 0px 1px 5px rgba(0, 0, 0, 0.1); diff --git a/src/components/about/About.tsx b/src/components/about/About.tsx index 864e42c..f59ce20 100644 --- a/src/components/about/About.tsx +++ b/src/components/about/About.tsx @@ -11,15 +11,7 @@ import s from './About.module.scss'; type Props = { apiConfig: ClashAPIConfig }; -function Version({ - name, - link, - version, -}: { - name: string; - link: string; - version: string; -}) { +function Version({ name, link, version }: { name: string; link: string; version: string }) { return ( <div className={s.root}> <h2>{name}</h2> @@ -28,12 +20,7 @@ function Version({ <span className={s.mono}>{version}</span> </p> <p> - <a - className={s.link} - href={link} - target="_blank" - rel="noopener noreferrer" - > + <a className={s.link} href={link} target="_blank" rel="noopener noreferrer"> <GitHub size={20} /> <span>Source</span> </a> @@ -50,17 +37,9 @@ function AboutImpl(props: Props) { <> <ContentHeader title="About" /> {version && version.version ? ( - <Version - name={version.meta?'Clash.Meta':'Clash'} - version={version.version} - link="https://github.com/metacubex/clash.meta" - /> + <Version name="Clash" version={version.version} link="https://github.com/Dreamacro/clash" /> ) : null} - <Version - name="Yacd" - version={__VERSION__} - link="https://github.com/metacubex/yacd" - /> + <Version name="Yacd" version={__VERSION__} link="https://github.com/haishanh/yacd" /> </> ); } diff --git a/src/components/proxies/ClosePrevConns.tsx b/src/components/proxies/ClosePrevConns.tsx index 5617efe..f26a5e9 100644 --- a/src/components/proxies/ClosePrevConns.tsx +++ b/src/components/proxies/ClosePrevConns.tsx @@ -10,10 +10,7 @@ type Props = { onClickSecondaryButton?: () => void; }; -export function ClosePrevConns({ - onClickPrimaryButton, - onClickSecondaryButton, -}: Props) { +export function ClosePrevConns({ onClickPrimaryButton, onClickSecondaryButton }: Props) { const primaryButtonRef = useRef<HTMLButtonElement>(null); const secondaryButtonRef = useRef<HTMLButtonElement>(null); useEffect(() => { @@ -33,8 +30,8 @@ export function ClosePrevConns({ <div onKeyDown={handleKeyDown}> <h2>Close Connections?</h2> <p> - Click "Yes" to close those connections that are still using the old - selected proxy in this group + Click "Yes" to close those connections that are still using the old selected proxy in this + group </p> <div style={{ height: 30 }} /> <FlexCenter> diff --git a/src/components/proxies/Proxies.tsx b/src/components/proxies/Proxies.tsx index c1606dd..12d3cb2 100644 --- a/src/components/proxies/Proxies.tsx +++ b/src/components/proxies/Proxies.tsx @@ -35,9 +35,7 @@ function Proxies({ apiConfig, showModalClosePrevConns, }) { - const refFetchedTimestamp = useRef<{ startAt?: number; completeAt?: number }>( - {} - ); + const refFetchedTimestamp = useRef<{ startAt?: number; completeAt?: number }>({}); const fetchProxiesHooked = useCallback(() => { refFetchedTimestamp.current.startAt = Date.now(); @@ -75,10 +73,7 @@ function Proxies({ return ( <> - <BaseModal - isOpen={isSettingsModalOpen} - onRequestClose={closeSettingsModal} - > + <BaseModal isOpen={isSettingsModalOpen} onRequestClose={closeSettingsModal}> <Settings /> </BaseModal> <div className={s0.topBar}> @@ -110,15 +105,8 @@ function Proxies({ </div> <ProxyProviderList items={proxyProviders} /> <div style={{ height: 60 }} /> - <ProxyPageFab - dispatch={dispatch} - apiConfig={apiConfig} - proxyProviders={proxyProviders} - /> - <BaseModal - isOpen={showModalClosePrevConns} - onRequestClose={closeModalClosePrevConns} - > + <ProxyPageFab dispatch={dispatch} apiConfig={apiConfig} proxyProviders={proxyProviders} /> + <BaseModal isOpen={showModalClosePrevConns} onRequestClose={closeModalClosePrevConns}> <ClosePrevConns onClickPrimaryButton={() => closePrevConnsAndTheModal(apiConfig)} onClickSecondaryButton={closeModalClosePrevConns} diff --git a/src/components/proxies/Proxy.module.scss b/src/components/proxies/Proxy.module.scss index 4507a07..72087cf 100644 --- a/src/components/proxies/Proxy.module.scss +++ b/src/components/proxies/Proxy.module.scss @@ -15,7 +15,7 @@ border: 1px solid var(--color-focus-blue); } - max-width: 280px; + max-width: 200px; @media (--breakpoint-not-small) { min-width: 200px; border-radius: 10px; @@ -34,7 +34,7 @@ transition: transform 0.2s ease-in-out; cursor: pointer; &:hover { - transform: translateY(-2px); + border-color: hsl(0deg, 0%, var(--card-hover-border-lightness)); } } } @@ -58,19 +58,37 @@ width: 100%; margin-bottom: 5px; font-size: 0.85em; - @media (--breakpoint-not-small) { - font-size: 0.85em; - } + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } .proxySmall { - width: 11px; - height: 11px; + --size: 13px; + width: var(--size); + height: var(--size); border-radius: 50%; - border: 1px solid var(--color-background); + position: relative; &.now { - border-color: var(--color-text-secondary); + --size: 15px; + &:before { + --size-dot: 7px; + content: ''; + position: absolute; + width: var(--size-dot); + height: var(--size-dot); + background-color: #fff; + // For non-primitive proxy type like "Selector", "LoadBalance", "DIRECT", etc. we are using a transparent + // background, and this selected indicator has a white background. In "light" them mode, the constrast + // between the bg of the indicator and the "background" is too small. In that case we want to add a + // border around this indicator so it's more distinguishable. + border: 1px solid var(--color-proxy-dot-selected-ind-bo); + border-radius: 4px; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } } &.selectable { diff --git a/src/components/proxies/Proxy.tsx b/src/components/proxies/Proxy.tsx index 424d320..47a3d54 100644 --- a/src/components/proxies/Proxy.tsx +++ b/src/components/proxies/Proxy.tsx @@ -1,6 +1,8 @@ +import { TooltipPopup, useTooltip } from '@reach/tooltip'; import cx from 'clsx'; import * as React from 'react'; -import { keyCodes } from 'src/misc/keycode'; + +import { State } from '$src/store/types'; import { getDelay, getProxies, NonProxyTypes } from '../../store/proxies'; import { connect } from '../StateProvider'; @@ -20,11 +22,7 @@ const colorMap = { na: '#909399', }; -function getLabelColor({ - number, -}: { - number?: number; -} = {}) { +function getLabelColor({ number }: { number?: number } = {}) { if (number === 0) { return colorMap.na; } else if (number < 200) { @@ -37,39 +35,25 @@ function getLabelColor({ return colorMap.na; } -function getProxyDotBackgroundColor( - latency: { - number?: number; - }, - proxyType: string -) { +function getProxyDotStyle(latency: { number?: number }, proxyType: string) { if (NonProxyTypes.indexOf(proxyType) > -1) { - return 'linear-gradient(135deg, white 15%, #999 15% 30%, white 30% 45%, #999 45% 60%, white 60% 75%, #999 75% 90%, white 90% 100%)'; + return { border: '1px dotted #777' }; } - return getLabelColor(latency); + const bg = getLabelColor(latency); + return { background: bg }; } type ProxyProps = { name: string; now?: boolean; proxy: any; - latency: any; + latency?: { number?: number }; isSelectable?: boolean; onClick?: (proxyName: string) => unknown; }; -function ProxySmallImpl({ - now, - name, - proxy, - latency, - isSelectable, - onClick, -}: ProxyProps) { - const color = useMemo(() => getProxyDotBackgroundColor(latency, proxy.type), [ - latency, - proxy, - ]); +function ProxySmallImpl({ now, name, proxy, latency, isSelectable, onClick }: ProxyProps) { + const style = useMemo(() => getProxyDotStyle(latency, proxy.type), [latency, proxy]); const title = useMemo(() => { let ret = name; if (latency && typeof latency.number === 'number') { @@ -83,17 +67,12 @@ function ProxySmallImpl({ }, [name, onClick, isSelectable]); const className = useMemo(() => { - return cx(s0.proxySmall, { - [s0.now]: now, - [s0.selectable]: isSelectable, - }); + return cx(s0.proxySmall, { [s0.now]: now, [s0.selectable]: isSelectable }); }, [isSelectable, now]); const handleKeyDown = React.useCallback( (e: React.KeyboardEvent) => { - if (e.keyCode === keyCodes.Enter) { - doSelect(); - } + if (e.key === 'Enter') doSelect(); }, [doSelect] ); @@ -102,7 +81,7 @@ function ProxySmallImpl({ <div title={title} className={className} - style={{ background: color }} + style={style} onClick={doSelect} onKeyDown={handleKeyDown} role={isSelectable ? 'menuitem' : ''} @@ -115,33 +94,46 @@ function formatProxyType(t: string) { return t; } -function ProxyImpl({ - now, - name, - proxy, - latency, - isSelectable, - onClick, -}: ProxyProps) { +const positionProxyNameTooltip = (triggerRect: { left: number; top: number }) => { + return { + left: triggerRect.left + window.scrollX - 5, + top: triggerRect.top + window.scrollY - 38, + }; +}; + +function ProxyNameTooltip({ children, label, 'aria-label': ariaLabel }) { + const [trigger, tooltip] = useTooltip(); + return ( + <> + {React.cloneElement(children, trigger)} + <TooltipPopup + {...tooltip} + label={label} + aria-label={ariaLabel} + position={positionProxyNameTooltip} + /> + </> + ); +} + +function ProxyImpl({ now, name, proxy, latency, isSelectable, onClick }: ProxyProps) { const color = useMemo(() => getLabelColor(latency), [latency]); const doSelect = React.useCallback(() => { isSelectable && onClick && onClick(name); }, [name, onClick, isSelectable]); const handleKeyDown = React.useCallback( (e: React.KeyboardEvent) => { - if (e.keyCode === keyCodes.Enter) { - doSelect(); - } + if (e.key === 'Enter') doSelect(); }, [doSelect] ); const className = useMemo(() => { return cx(s0.proxy, { [s0.now]: now, - [s0.error]: latency && latency.error, + // [s0.error]: latency && latency.error, [s0.selectable]: isSelectable, }); - }, [isSelectable, now, latency]); + }, [isSelectable, now]); return ( <div @@ -151,26 +143,26 @@ function ProxyImpl({ onKeyDown={handleKeyDown} role={isSelectable ? 'menuitem' : ''} > - <div className={s0.proxyName}>{name}</div> + <div className={s0.proxyName}> + <ProxyNameTooltip label={name} aria-label={'proxy name: ' + name}> + <span>{name}</span> + </ProxyNameTooltip> + </div> <div className={s0.row}> <span className={s0.proxyType} style={{ opacity: now ? 0.6 : 0.2 }}> {formatProxyType(proxy.type)} </span> - {latency && latency.number ? ( - <ProxyLatency number={latency.number} color={color} /> - ) : null} + <ProxyLatency number={latency?.number} color={color} /> </div> </div> ); } -const mapState = (s: any, { name }) => { +const mapState = (s: State, { name }) => { const proxies = getProxies(s); const delay = getDelay(s); - return { - proxy: proxies[name], - latency: delay[name], - }; + const proxy = proxies[name] || { name, type: 'Unknown', history: [] }; + return { proxy, latency: delay[name] }; }; export const Proxy = connect(mapState)(ProxyImpl); diff --git a/src/components/proxies/ProxyGroup.module.scss b/src/components/proxies/ProxyGroup.module.scss index 5409ea8..85b68b6 100644 --- a/src/components/proxies/ProxyGroup.module.scss +++ b/src/components/proxies/ProxyGroup.module.scss @@ -2,10 +2,12 @@ margin-bottom: 12px; } -.zapWrapper { - width: 20px; - height: 20px; +.groupHead { display: flex; + flex-wrap: wrap; align-items: center; - justify-content: center; +} + +.action { + margin: 0 5px; } diff --git a/src/components/proxies/ProxyGroup.tsx b/src/components/proxies/ProxyGroup.tsx index 633a4b9..e8ebadf 100644 --- a/src/components/proxies/ProxyGroup.tsx +++ b/src/components/proxies/ProxyGroup.tsx @@ -1,30 +1,37 @@ +import Tooltip from '@reach/tooltip'; import * as React from 'react'; -import { Zap } from 'react-feather'; -import { useQuery } from 'react-query'; -import * as proxiesAPI from '$src/api/proxies'; -import { fetchVersion } from '$src/api/version'; -import { getCollapsibleIsOpen, getHideUnavailableProxies, getProxySortBy } from '$src/store/app'; -import { fetchProxies, getProxies, switchProxy } from '$src/store/proxies'; +import { useState2 } from '$src/hooks/basic'; +import { DelayMapping, DispatchFn, ProxiesMapping, State } from '$src/store/types'; +import { ClashAPIConfig } from '$src/types'; +import { getCollapsibleIsOpen, getHideUnavailableProxies, getProxySortBy } from '../../store/app'; +import { fetchProxies, getProxies, switchProxy } from '../../store/proxies'; import Button from '../Button'; import CollapsibleSectionHeader from '../CollapsibleSectionHeader'; +import { ZapAnimated } from '../shared/ZapAnimated'; import { connect, useStoreActions } from '../StateProvider'; import { useFilteredAndSorted } from './hooks'; import s0 from './ProxyGroup.module.scss'; import { ProxyList, ProxyListSummaryView } from './ProxyList'; +import { fetchVersion } from '$src/api/version'; +import { useQuery } from 'react-query'; +const { createElement, useCallback, useMemo } = React; -const { createElement, useCallback, useMemo, useState } = React; - - -function ZapWrapper() { - return ( - <div className={s0.zapWrapper}> - <Zap size={16} /> - </div> - ); -} +type ProxyGroupImplProps = { + name: string; + all: string[]; + delay: DelayMapping; + hideUnavailableProxies: boolean; + proxySortBy: string; + proxies: ProxiesMapping; + type: string; + now: string; + isOpen: boolean; + apiConfig: ClashAPIConfig; + dispatch: DispatchFn; +}; function ProxyGroupImpl({ name, @@ -38,14 +45,8 @@ function ProxyGroupImpl({ isOpen, apiConfig, dispatch, -}) { - const all = useFilteredAndSorted( - allItems, - delay, - hideUnavailableProxies, - proxySortBy, - proxies - ); +}: ProxyGroupImplProps) { + const all = useFilteredAndSorted(allItems, delay, hideUnavailableProxies, proxySortBy, proxies); const { data: version } = useQuery(['/version', apiConfig], () => fetchVersion('/version',apiConfig) @@ -63,15 +64,17 @@ function ProxyGroupImpl({ }, [isOpen, updateCollapsibleIsOpen, name]); const itemOnTapCallback = useCallback( - (proxyName) => { + (proxyName: string) => { if (!isSelectable) return; dispatch(switchProxy(apiConfig, name, proxyName)); }, [apiConfig, dispatch, name, isSelectable] ); - const [isTestingLatency, setIsTestingLatency] = useState(false); + + const testingLatency = useState2(false); const testLatency = useCallback(async () => { - setIsTestingLatency(true); + if (testingLatency.value) return; + testingLatency.set(true); try { if (version.meta==true){ await proxiesAPI.requestDelayForProxyGroup(apiConfig,name); @@ -87,7 +90,7 @@ function ProxyGroupImpl({ return ( <div className={s0.group}> - <div style={{ display: 'flex', alignItems: 'center' }}> + <div className={s0.groupHead}> <CollapsibleSectionHeader name={name} type={type} @@ -95,14 +98,13 @@ function ProxyGroupImpl({ qty={all.length} isOpen={isOpen} /> - <Button - title="Test latency" - kind="minimal" - onClick={testLatency} - isLoading={isTestingLatency} - > - <ZapWrapper /> - </Button> + <div className={s0.action}> + <Tooltip label={'Test latency'}> + <Button kind="circular" onClick={testLatency}> + <ZapAnimated animate={testingLatency.value} size={16} /> + </Button> + </Tooltip> + </div> </div> {createElement(isOpen ? ProxyList : ProxyListSummaryView, { all, @@ -114,7 +116,7 @@ function ProxyGroupImpl({ ); } -export const ProxyGroup = connect((s, { name, delay }) => { +export const ProxyGroup = connect((s: State, { name, delay }) => { const proxies = getProxies(s); const collapsibleIsOpen = getCollapsibleIsOpen(s); const proxySortBy = getProxySortBy(s); @@ -133,3 +135,7 @@ export const ProxyGroup = connect((s, { name, delay }) => { isOpen: collapsibleIsOpen[`proxyGroup:${name}`], }; })(ProxyGroupImpl); +function setIsTestingLatency (arg0: boolean) { + throw new Error('Function not implemented.'); +} + diff --git a/src/components/proxies/ProxyLatency.tsx b/src/components/proxies/ProxyLatency.tsx index 48e55af..29036d5 100644 --- a/src/components/proxies/ProxyLatency.tsx +++ b/src/components/proxies/ProxyLatency.tsx @@ -3,14 +3,14 @@ import * as React from 'react'; import s0 from './ProxyLatency.module.scss'; type ProxyLatencyProps = { - number: number; + number?: number; color: string; }; export function ProxyLatency({ number, color }: ProxyLatencyProps) { return ( <span className={s0.proxyLatency} style={{ color }}> - <span>{number} ms</span> + {typeof number === 'number' && number !== 0 ? number + ' ms' : ' '} </span> ); } diff --git a/src/components/proxies/ProxyList.module.scss b/src/components/proxies/ProxyList.module.scss index 1814929..12fea7e 100644 --- a/src/components/proxies/ProxyList.module.scss +++ b/src/components/proxies/ProxyList.module.scss @@ -6,8 +6,10 @@ } .listSummaryView { - margin: 8px 0; + margin: 14px 0; display: grid; grid-template-columns: repeat(auto-fill, 13px); grid-gap: 10px; + place-items: center; + max-width: 900px; } diff --git a/src/components/proxies/ProxyList.tsx b/src/components/proxies/ProxyList.tsx index a86bb88..3856c68 100644 --- a/src/components/proxies/ProxyList.tsx +++ b/src/components/proxies/ProxyList.tsx @@ -11,12 +11,7 @@ type ProxyListProps = { show?: boolean; }; -export function ProxyList({ - all, - now, - isSelectable, - itemOnTapCallback, -}: ProxyListProps) { +export function ProxyList({ all, now, isSelectable, itemOnTapCallback }: ProxyListProps) { const proxies = all; return ( diff --git a/src/components/proxies/ProxyPageFab.tsx b/src/components/proxies/ProxyPageFab.tsx index 7cc6d03..44e446f 100644 --- a/src/components/proxies/ProxyPageFab.tsx +++ b/src/components/proxies/ProxyPageFab.tsx @@ -2,12 +2,7 @@ import * as React from 'react'; import { Zap } from 'react-feather'; import { useTranslation } from 'react-i18next'; import { useUpdateProviderItems } from 'src/components/proxies/proxies.hooks'; -import { - Action, - Fab, - IsFetching, - position as fabPosition, -} from 'src/components/shared/Fab'; +import { Action, Fab, IsFetching, position as fabPosition } from 'src/components/shared/Fab'; import { RotateIcon } from 'src/components/shared/RotateIcon'; import { requestDelayAll } from 'src/store/proxies'; import { DispatchFn, FormattedProxyProvider } from 'src/store/types'; diff --git a/src/components/proxies/ProxyProvider.module.scss b/src/components/proxies/ProxyProvider.module.scss index 534305b..bc66bca 100644 --- a/src/components/proxies/ProxyProvider.module.scss +++ b/src/components/proxies/ProxyProvider.module.scss @@ -5,21 +5,25 @@ } } -.body { +.main { padding: 10px 15px; @media (--breakpoint-not-small) { padding: 10px 40px; } } -.actionFooter { +.head { display: flex; - button { - margin: 0 5px; - &:first-child { - margin-left: 0; - } - } + align-items: center; + flex-wrap: wrap; +} + +.action { + margin: 0 5px; + display: grid; + grid-template-columns: auto auto; + gap: 10px; + place-items: center; } .refresh { diff --git a/src/components/proxies/ProxyProvider.tsx b/src/components/proxies/ProxyProvider.tsx index 055a572..7939190 100644 --- a/src/components/proxies/ProxyProvider.tsx +++ b/src/components/proxies/ProxyProvider.tsx @@ -1,8 +1,8 @@ +import Tooltip from '@reach/tooltip'; import { formatDistance } from 'date-fns'; import * as React from 'react'; -import { RotateCw, Zap } from 'react-feather'; +import { RotateCw } from 'react-feather'; import Button from 'src/components/Button'; -import Collapsible from 'src/components/Collapsible'; import CollapsibleSectionHeader from 'src/components/CollapsibleSectionHeader'; import { useUpdateProviderItem } from 'src/components/proxies/proxies.hooks'; import { connect, useStoreActions } from 'src/components/StateProvider'; @@ -14,17 +14,20 @@ import { getProxySortBy, } from 'src/store/app'; import { getDelay, healthcheckProviderByName } from 'src/store/proxies'; -import { DelayMapping } from 'src/store/types'; +import { DelayMapping, State } from 'src/store/types'; +import { useState2 } from '$src/hooks/basic'; + +import { ZapAnimated } from '../shared/ZapAnimated'; import { useFilteredAndSorted } from './hooks'; import { ProxyList, ProxyListSummaryView } from './ProxyList'; import s from './ProxyProvider.module.scss'; -const { useState, useCallback } = React; +const { useCallback } = React; type Props = { name: string; - proxies: Array<string>; + proxies: string[]; delay: DelayMapping; hideUnavailableProxies: boolean; proxySortBy: string; @@ -48,21 +51,17 @@ function ProxyProviderImpl({ dispatch, apiConfig, }: Props) { - const proxies = useFilteredAndSorted( - all, - delay, - hideUnavailableProxies, - proxySortBy - ); - const [isHealthcheckLoading, setIsHealthcheckLoading] = useState(false); + const proxies = useFilteredAndSorted(all, delay, hideUnavailableProxies, proxySortBy); + const checkingHealth = useState2(false); const updateProvider = useUpdateProviderItem({ dispatch, apiConfig, name }); - const healthcheckProvider = useCallback(async () => { - setIsHealthcheckLoading(true); - await dispatch(healthcheckProviderByName(apiConfig, name)); - setIsHealthcheckLoading(false); - }, [apiConfig, dispatch, name, setIsHealthcheckLoading]); + const healthcheckProvider = useCallback(() => { + if (checkingHealth.value) return; + checkingHealth.set(true); + const stop = () => checkingHealth.set(false); + dispatch(healthcheckProviderByName(apiConfig, name)).then(stop, stop); + }, [apiConfig, dispatch, name, checkingHealth]); const { app: { updateCollapsibleIsOpen }, @@ -74,34 +73,33 @@ function ProxyProviderImpl({ const timeAgo = formatDistance(new Date(updatedAt), new Date()); return ( - <div className={s.body}> - <CollapsibleSectionHeader - name={name} - toggle={toggle} - type={vehicleType} - isOpen={isOpen} - qty={proxies.length} - /> + <div className={s.main}> + <div className={s.head}> + <CollapsibleSectionHeader + name={name} + toggle={toggle} + type={vehicleType} + isOpen={isOpen} + qty={proxies.length} + /> + + <div className={s.action}> + <Tooltip label={'Update'}> + <Button kind="circular" onClick={updateProvider}> + <Refresh /> + </Button> + </Tooltip> + <Tooltip label={'Health Check'}> + <Button kind="circular" onClick={healthcheckProvider}> + <ZapAnimated animate={checkingHealth.value} size={16} /> + </Button> + </Tooltip> + </div> + </div> <div className={s.updatedAt}> <small>Updated {timeAgo} ago</small> </div> - {/* @ts-expect-error ts-migrate(2322) FIXME: Type '{ children: Element[]; isOpen: boolean; }' i... Remove this comment to see the full error message */} - <Collapsible isOpen={isOpen}> - <ProxyList all={proxies} /> - <div className={s.actionFooter}> - <Button text="Update" start={<Refresh />} onClick={updateProvider} /> - <Button - text="Health Check" - start={<Zap size={16} />} - onClick={healthcheckProvider} - isLoading={isHealthcheckLoading} - /> - </div> - </Collapsible> - {/* @ts-expect-error ts-migrate(2322) FIXME: Type '{ children: Element; isOpen: boolean; }' is ... Remove this comment to see the full error message */} - <Collapsible isOpen={!isOpen}> - <ProxyListSummaryView all={proxies} /> - </Collapsible> + {isOpen ? <ProxyList all={proxies} /> : <ProxyListSummaryView all={proxies} />} </div> ); } @@ -132,7 +130,7 @@ function Refresh() { ); } -const mapState = (s, { proxies, name }) => { +const mapState = (s: State, { proxies, name }) => { const hideUnavailableProxies = getHideUnavailableProxies(s); const delay = getDelay(s); const collapsibleIsOpen = getCollapsibleIsOpen(s); diff --git a/src/components/proxies/ProxyProviderList.tsx b/src/components/proxies/ProxyProviderList.tsx index 1528f37..754eeac 100644 --- a/src/components/proxies/ProxyProviderList.tsx +++ b/src/components/proxies/ProxyProviderList.tsx @@ -3,11 +3,7 @@ import ContentHeader from 'src/components/ContentHeader'; import { ProxyProvider } from 'src/components/proxies/ProxyProvider'; import { FormattedProxyProvider } from 'src/store/types'; -export function ProxyProviderList({ - items, -}: { - items: FormattedProxyProvider[]; -}) { +export function ProxyProviderList({ items }: { items: FormattedProxyProvider[] }) { if (items.length === 0) return null; return ( diff --git a/src/components/proxies/Settings.tsx b/src/components/proxies/Settings.tsx index 5e1ff98..55e18fe 100644 --- a/src/components/proxies/Settings.tsx +++ b/src/components/proxies/Settings.tsx @@ -2,11 +2,7 @@ import * as React from 'react'; import { useTranslation } from 'react-i18next'; import Select from 'src/components/shared/Select'; -import { - getAutoCloseOldConns, - getHideUnavailableProxies, - getProxySortBy, -} from '../../store/app'; +import { getAutoCloseOldConns, getHideUnavailableProxies, getProxySortBy } from '../../store/app'; import { connect, useStoreActions } from '../StateProvider'; import Switch from '../SwitchThemed'; import s from './Settings.module.scss'; diff --git a/src/components/proxies/hooks.tsx b/src/components/proxies/hooks.tsx index 861c0e5..a43dc0e 100644 --- a/src/components/proxies/hooks.tsx +++ b/src/components/proxies/hooks.tsx @@ -45,22 +45,14 @@ const getSortDelay = ( const ProxySortingFns = { Natural: (proxies: string[]) => proxies, - LatencyAsc: ( - proxies: string[], - delay: DelayMapping, - proxyMapping?: ProxiesMapping - ) => { + LatencyAsc: (proxies: string[], delay: DelayMapping, proxyMapping?: ProxiesMapping) => { return proxies.sort((a, b) => { const d1 = getSortDelay(delay[a], proxyMapping && proxyMapping[a]); const d2 = getSortDelay(delay[b], proxyMapping && proxyMapping[b]); return d1 - d2; }); }, - LatencyDesc: ( - proxies: string[], - delay: DelayMapping, - proxyMapping?: ProxiesMapping - ) => { + LatencyDesc: (proxies: string[], delay: DelayMapping, proxyMapping?: ProxiesMapping) => { return proxies.sort((a, b) => { const d1 = getSortDelay(delay[a], proxyMapping && proxyMapping[a]); const d2 = getSortDelay(delay[b], proxyMapping && proxyMapping[b]); diff --git a/src/components/proxies/proxies.hooks.tsx b/src/components/proxies/proxies.hooks.tsx index ec51c9b..20695ac 100644 --- a/src/components/proxies/proxies.hooks.tsx +++ b/src/components/proxies/proxies.hooks.tsx @@ -14,11 +14,10 @@ export function useUpdateProviderItem({ apiConfig: ClashAPIConfig; name: string; }) { - return useCallback(() => dispatch(updateProviderByName(apiConfig, name)), [ - apiConfig, - dispatch, - name, - ]); + return useCallback( + () => dispatch(updateProviderByName(apiConfig, name)), + [apiConfig, dispatch, name] + ); } export function useUpdateProviderItems({ diff --git a/src/components/rules/RuleProviderItem.module.scss b/src/components/rules/RuleProviderItem.module.scss index 532ec8a..c3e1f07 100644 --- a/src/components/rules/RuleProviderItem.module.scss +++ b/src/components/rules/RuleProviderItem.module.scss @@ -13,6 +13,7 @@ .middle { display: grid; + gap: 6px; grid-template-rows: 1fr auto auto; align-items: center; } @@ -21,13 +22,13 @@ color: #777; } -.refreshButtonWrapper { +.action { display: grid; - place-items: center; - opacity: 0; - transition: opacity 0.2s; + gap: 4px; + grid-template-columns: auto 1fr; + align-items: center; } -.RuleProviderItem:hover .refreshButtonWrapper { - opacity: 1; +.refreshBtn { + padding: 5px; } diff --git a/src/components/rules/RuleProviderItem.tsx b/src/components/rules/RuleProviderItem.tsx index fe4610e..c27e464 100644 --- a/src/components/rules/RuleProviderItem.tsx +++ b/src/components/rules/RuleProviderItem.tsx @@ -16,26 +16,22 @@ export function RuleProviderItem({ ruleCount, apiConfig, }) { - const [onClickRefreshButton, isRefreshing] = useUpdateRuleProviderItem( - name, - apiConfig - ); + const [onClickRefreshButton, isRefreshing] = useUpdateRuleProviderItem(name, apiConfig); const timeAgo = formatDistance(new Date(updatedAt), new Date()); return ( <div className={s.RuleProviderItem}> <span className={s.left}>{idx}</span> <div className={s.middle}> <SectionNameType name={name} type={`${vehicleType} / ${behavior}`} /> - <div className={s.gray}> - {ruleCount < 2 ? `${ruleCount} rule` : `${ruleCount} rules`} + <div className={s.gray}>{ruleCount < 2 ? `${ruleCount} rule` : `${ruleCount} rules`}</div> + <div className={s.action}> + <Button onClick={onClickRefreshButton} disabled={isRefreshing} className={s.refreshBtn}> + <RotateIcon isRotating={isRefreshing} size={13} /> + <span className="visually-hidden">Refresh</span> + </Button> + <small className={s.gray}>Updated {timeAgo} ago</small> </div> - <small className={s.gray}>Updated {timeAgo} ago</small> </div> - <span className={s.refreshButtonWrapper}> - <Button onClick={onClickRefreshButton} disabled={isRefreshing}> - <RotateIcon isRotating={isRefreshing} /> - </Button> - </span> </div> ); } diff --git a/src/components/shared/Fab.tsx b/src/components/shared/Fab.tsx index 832306e..8e72432 100644 --- a/src/components/shared/Fab.tsx +++ b/src/components/shared/Fab.tsx @@ -28,8 +28,7 @@ const AB: React.FC<ABProps> = ({ children, ...p }) => ( </button> ); -interface MBProps - extends Omit<React.HTMLAttributes<HTMLButtonElement>, 'tabIndex'> { +interface MBProps extends Omit<React.HTMLAttributes<HTMLButtonElement>, 'tabIndex'> { tabIndex?: number; } @@ -77,10 +76,7 @@ const Fab: React.FC<FabProps> = ({ return event === 'click' ? (isOpen ? close() : open()) : null; }; - const actionOnClick = ( - e: React.FormEvent, - userFunc: (e: React.FormEvent) => void - ) => { + const actionOnClick = (e: React.FormEvent, userFunc: (e: React.FormEvent) => void) => { e.persist(); setIsOpen(false); setTimeout(() => { @@ -141,9 +137,7 @@ const Fab: React.FC<FabProps> = ({ </MB> {text && ( <span - className={`${'right' in style ? 'right' : ''} ${ - alwaysShowTitle ? 'always-show' : '' - }`} + className={`${'right' in style ? 'right' : ''} ${alwaysShowTitle ? 'always-show' : ''}`} aria-hidden={ariaHidden} > {text} diff --git a/src/components/shared/RotateIcon.tsx b/src/components/shared/RotateIcon.tsx index 7e3ceae..d291ece 100644 --- a/src/components/shared/RotateIcon.tsx +++ b/src/components/shared/RotateIcon.tsx @@ -4,13 +4,12 @@ import { RotateCw } from 'react-feather'; import s from './RotateIcon.module.scss'; -export function RotateIcon({ isRotating }: { isRotating: boolean }) { - const cls = cx(s.rotate, { - [s.isRotating]: isRotating, - }); +export function RotateIcon(props: { isRotating: boolean; size?: number }) { + const size = props.size || 16; + const cls = cx(s.rotate, { [s.isRotating]: props.isRotating }); return ( <span className={cls}> - <RotateCw width={16} /> + <RotateCw size={size} /> </span> ); } diff --git a/src/components/shared/TextFitler.tsx b/src/components/shared/TextFitler.tsx index e4a4a88..7af61ac 100644 --- a/src/components/shared/TextFitler.tsx +++ b/src/components/shared/TextFitler.tsx @@ -4,10 +4,7 @@ import { useTextInut } from 'src/hooks/useTextInput'; import s from './TextFitler.module.scss'; -export function TextFilter(props: { - textAtom: RecoilState<string>; - placeholder?: string; -}) { +export function TextFilter(props: { textAtom: RecoilState<string>; placeholder?: string }) { const [onChange, text] = useTextInut(props.textAtom); return ( <input diff --git a/src/components/shared/ThemeSwitcher.module.scss b/src/components/shared/ThemeSwitcher.module.scss index c5de126..951376a 100644 --- a/src/components/shared/ThemeSwitcher.module.scss +++ b/src/components/shared/ThemeSwitcher.module.scss @@ -29,7 +29,8 @@ height: var(--sz); select { cursor: pointer; - padding-left: var(--sz); + padding-left: calc(var(--sz) - 2px); + font-size: 0; width: var(--sz); height: var(--sz); appearance: none; diff --git a/src/components/shared/ZapAnimated.module.scss b/src/components/shared/ZapAnimated.module.scss new file mode 100644 index 0000000..e4cb37b --- /dev/null +++ b/src/components/shared/ZapAnimated.module.scss @@ -0,0 +1,12 @@ +.animate { + --saturation: 70%; + stroke: hsl(46deg var(--saturation) 45%); + animation: zap-pulse 0.7s 0s ease-in-out none normal infinite; +} + +// prettier-ignore +@keyframes zap-pulse { + 0% { stroke: hsl(46deg var(--saturation) 45%); } + 50% { stroke: hsl(46deg var(--saturation) 95%); } + 100% { stroke: hsl(46deg var(--saturation) 45%); } +} diff --git a/src/components/shared/ZapAnimated.tsx b/src/components/shared/ZapAnimated.tsx new file mode 100644 index 0000000..e3b153a --- /dev/null +++ b/src/components/shared/ZapAnimated.tsx @@ -0,0 +1,25 @@ +import cx from 'clsx'; +import * as React from 'react'; + +import s from './ZapAnimated.module.scss'; + +export function ZapAnimated(props: { size?: number; animate?: boolean }) { + const size = props.size || 24; + const cls = cx({ [s.animate]: props.animate }); + return ( + <svg + className={cls} + xmlns="http://www.w3.org/2000/svg" + width={size} + height={size} + viewBox="0 0 24 24" + fill="none" + stroke="currentColor" + strokeWidth="2" + strokeLinecap="round" + strokeLinejoin="round" + > + <polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2" /> + </svg> + ); +} diff --git a/src/components/svg/Equalizer.tsx b/src/components/svg/Equalizer.tsx index 274720f..ae3c858 100644 --- a/src/components/svg/Equalizer.tsx +++ b/src/components/svg/Equalizer.tsx @@ -5,10 +5,7 @@ type Props = { color?: string; }; -export default function Equalizer({ - color = 'currentColor', - size = 24, -}: Props) { +export default function Equalizer({ color = 'currentColor', size = 24 }: Props) { return ( <svg fill="none" diff --git a/src/hooks/basic.ts b/src/hooks/basic.ts index 587d92d..1e8aeae 100644 --- a/src/hooks/basic.ts +++ b/src/hooks/basic.ts @@ -1,9 +1,14 @@ -import React from 'react'; +import * as React from 'react'; const { useState, useCallback } = React; -export function useToggle(initialValue = false) { +export function useToggle(initialValue = false): [boolean, () => void] { const [isOn, setState] = useState(initialValue); const toggle = useCallback(() => setState((x) => !x), []); return [isOn, toggle]; } + +export function useState2<T>(v: T) { + const [value, set] = useState(v); + return { value, set }; +} diff --git a/src/hooks/useRemainingViewPortHeight.ts b/src/hooks/useRemainingViewPortHeight.ts index 9f3470d..2c920c2 100644 --- a/src/hooks/useRemainingViewPortHeight.ts +++ b/src/hooks/useRemainingViewPortHeight.ts @@ -9,9 +9,10 @@ const { useState, useRef, useCallback, useLayoutEffect } = React; * to the bottom of the view port * */ -export default function useRemainingViewPortHeight< - ElementType extends HTMLDivElement ->(): [React.MutableRefObject<ElementType>, number] { +export default function useRemainingViewPortHeight<ElementType extends HTMLDivElement>(): [ + React.MutableRefObject<ElementType>, + number +] { const ref = useRef<ElementType>(null); const [containerHeight, setContainerHeight] = useState(200); const updateContainerHeight = useCallback(() => { diff --git a/src/hooks/useTextInput.ts b/src/hooks/useTextInput.ts index 1fa19f7..853044c 100644 --- a/src/hooks/useTextInput.ts +++ b/src/hooks/useTextInput.ts @@ -9,9 +9,7 @@ export function useTextInut( ): [(e: React.ChangeEvent<HTMLInputElement>) => void, string] { const [, setTextGlobal] = useRecoilState(x); const [text, setText] = useState(''); - const setTextDebounced = useMemo(() => debounce(setTextGlobal, 300), [ - setTextGlobal, - ]); + const setTextDebounced = useMemo(() => debounce(setTextGlobal, 300), [setTextGlobal]); const onChange = useCallback( (e: React.ChangeEvent<HTMLInputElement>) => { setText(e.target.value); diff --git a/src/misc/chart.ts b/src/misc/chart.ts index c62fa06..56e05a2 100644 --- a/src/misc/chart.ts +++ b/src/misc/chart.ts @@ -1,4 +1,4 @@ -import { createAsset } from "use-asset" +import { createAsset } from 'use-asset'; import prettyBytes from './pretty-bytes'; export const chartJSResource = createAsset(() => { @@ -11,7 +11,7 @@ export const commonChartOptions: import('chart.js').ChartOptions<'line'> = { responsive: true, maintainAspectRatio: true, plugins: { - legend: { labels: { boxWidth: 20 } } + legend: { labels: { boxWidth: 20 } }, }, scales: { x: { display: false, type: 'category' }, diff --git a/src/misc/errors.ts b/src/misc/errors.ts index 1bc369a..ec12b6a 100644 --- a/src/misc/errors.ts +++ b/src/misc/errors.ts @@ -1,5 +1,12 @@ export const DOES_NOT_SUPPORT_FETCH = 0; +export class YacdError extends Error { + constructor(public message: string, public code?: string | number) { + super(message); + Error.captureStackTrace(this, this.constructor); + } +} + export const errors = { [DOES_NOT_SUPPORT_FETCH]: { message: 'Browser not supported!', diff --git a/src/misc/i18n.ts b/src/misc/i18n.ts index cf1a4f2..eecd72a 100644 --- a/src/misc/i18n.ts +++ b/src/misc/i18n.ts @@ -8,10 +8,7 @@ const allLocales = { en: import('src/i18n/en'), }; -type BackendRequestCallback = ( - err: null, - result: { status: number; data: any } -) => void; +type BackendRequestCallback = (err: null, result: { status: number; data: any }) => void; i18next .use(HttpBackend) diff --git a/src/misc/motion.ts b/src/misc/motion.ts index 5f2fe50..7fac864 100644 --- a/src/misc/motion.ts +++ b/src/misc/motion.ts @@ -1,5 +1,3 @@ import { createResource } from './createResource'; -export const framerMotionResouce = createResource( - () => import('framer-motion') -); +export const framerMotionResouce = createResource(() => import('framer-motion')); diff --git a/src/misc/request-helper.ts b/src/misc/request-helper.ts index 3bc8476..c01b994 100644 --- a/src/misc/request-helper.ts +++ b/src/misc/request-helper.ts @@ -12,7 +12,7 @@ function genCommonHeaders({ secret }: { secret?: string }) { return h; } function buildWebSocketURLBase(baseURL: string, params: URLSearchParams, endpoint: string) { - const qs = '?' + params.toString() + const qs = '?' + params.toString(); const url = new URL(baseURL); url.protocol === 'https:' ? (url.protocol = 'wss:') : (url.protocol = 'ws:'); return `${trimTrailingSlash(url.href)}${endpoint}${qs}`; @@ -32,7 +32,7 @@ export function buildWebSocketURL(apiConfig: ClashAPIConfig, endpoint: string) { token: secret, }); - return buildWebSocketURLBase(baseURL, params, endpoint) + return buildWebSocketURLBase(baseURL, params, endpoint); } export function buildLogsWebSocketURL(apiConfig: LogsAPIConfig, endpoint: string) { @@ -42,5 +42,5 @@ export function buildLogsWebSocketURL(apiConfig: LogsAPIConfig, endpoint: string level: logLevel, }); - return buildWebSocketURLBase(baseURL, params, endpoint) + return buildWebSocketURLBase(baseURL, params, endpoint); } diff --git a/src/misc/shallowEqual.ts b/src/misc/shallowEqual.ts index 241b725..937bc27 100644 --- a/src/misc/shallowEqual.ts +++ b/src/misc/shallowEqual.ts @@ -12,12 +12,7 @@ function is(x, y) { export default function shallowEqual(objA, objB) { if (is(objA, objB)) return true; - if ( - typeof objA !== 'object' || - objA === null || - typeof objB !== 'object' || - objB === null - ) { + if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) { return false; } diff --git a/src/misc/utils.ts b/src/misc/utils.ts index d3a7bfc..9497026 100644 --- a/src/misc/utils.ts +++ b/src/misc/utils.ts @@ -1,7 +1,4 @@ -export function throttle<T extends any[]>( - fn: (...args: T) => unknown, - timeout: number -) { +export function throttle<T extends any[]>(fn: (...args: T) => unknown, timeout: number) { let pending = false; return (...args: T) => { @@ -15,10 +12,7 @@ export function throttle<T extends any[]>( }; } -export function debounce<T extends any[]>( - fn: (...args: T) => unknown, - timeout: number -) { +export function debounce<T extends any[]>(fn: (...args: T) => unknown, timeout: number) { let timeoutId: ReturnType<typeof setTimeout>; return (...args: T) => { if (timeoutId) clearTimeout(timeoutId); diff --git a/src/store/app.ts b/src/store/app.ts index 7262b32..2789981 100644 --- a/src/store/app.ts +++ b/src/store/app.ts @@ -152,7 +152,7 @@ export function updateCollapsibleIsOpen(prefix: string, name: string, v: boolean const defaultClashAPIConfig = { baseURL: document.getElementById('app')?.getAttribute('data-base-url') ?? 'http://127.0.0.1:9090', secret: '', - addedAt: 0 + addedAt: 0, }; // type Theme = 'light' | 'dark'; const defaultState: StateApp = { @@ -169,7 +169,7 @@ const defaultState: StateApp = { proxySortBy: 'Natural', hideUnavailableProxies: false, autoCloseOldConns: false, - logStreamingPaused: false + logStreamingPaused: false, }; function parseConfigQueryString() { diff --git a/src/store/proxies.tsx b/src/store/proxies.tsx index e06d16c..5f4c0aa 100644 --- a/src/store/proxies.tsx +++ b/src/store/proxies.tsx @@ -1,9 +1,10 @@ import { atom } from 'recoil'; -/* import { ProxyItem, ProxiesMapping, DelayMapping } from 'src/store/types'; */ import { + DelayMapping, DispatchFn, FormattedProxyProvider, GetStateFn, + LatencyHistory, ProxiesMapping, ProxyItem, ProxyProvider, @@ -35,10 +36,10 @@ const noop = () => null; export const NonProxyTypes = [ 'Direct', - 'Fallback', 'Reject', - 'Pass', + 'Relay', 'Selector', + 'Fallback', 'URLTest', 'LoadBalance', 'Unknown', @@ -49,8 +50,20 @@ export const getDelay = (s: State) => s.proxies.delay; export const getProxyGroupNames = (s: State) => s.proxies.groupNames; export const getProxyProviders = (s: State) => s.proxies.proxyProviders || []; export const getDangleProxyNames = (s: State) => s.proxies.dangleProxyNames; -export const getShowModalClosePrevConns = (s: State) => - s.proxies.showModalClosePrevConns; +export const getShowModalClosePrevConns = (s: State) => s.proxies.showModalClosePrevConns; + +function mapLatency(names: string[], getProxy: (name: string) => { history: LatencyHistory }) { + const result: DelayMapping = {}; + for (const name of names) { + const p = getProxy(name) || { history: [] }; + const history = p.history; + const h = history[history.length - 1]; + if (h && typeof h.delay === 'number') { + result[name] = { number: h.delay }; + } + } + return result; +} export function fetchProxies(apiConfig: ClashAPIConfig) { return async (dispatch: any, getState: any) => { @@ -59,37 +72,28 @@ export function fetchProxies(apiConfig: ClashAPIConfig) { proxiesAPI.fetchProviderProxies(apiConfig), ]); - const { - providers: proxyProviders, - proxies: providerProxies, - } = formatProxyProviders(providersData.providers); - const proxies = { ...providerProxies, ...proxiesData.proxies }; - const [groupNames, proxyNames] = retrieveGroupNamesFrom(proxies); + const { proxyProviders, providerProxyRecord } = formatProxyProviders(providersData.providers); - const delayPrev = getDelay(getState()); - const delayNext = { ...delayPrev }; + const proxies = { ...providerProxyRecord, ...proxiesData.proxies }; + const [groupNames, proxyNames] = retrieveGroupNamesFrom(proxies); - for (let i = 0; i < proxyNames.length; i++) { - const name = proxyNames[i]; - const { history } = proxies[name] || { history: [] }; - const h = history[history.length - 1]; - if (h && typeof h.delay === 'number') { - delayNext[name] = { number: h.delay }; - } - } + const delayNext = { + ...getDelay(getState()), + ...mapLatency(Object.keys(proxies), (name) => proxies[name]), + }; // proxies that are not from a provider const dangleProxyNames = []; for (const v of proxyNames) { - if (!providerProxies[v]) dangleProxyNames.push(v); + if (!providerProxyRecord[v]) dangleProxyNames.push(v); } dispatch('store/proxies#fetchProxies', (s: State) => { s.proxies.proxies = proxies; s.proxies.groupNames = groupNames; + s.proxies.dangleProxyNames = dangleProxyNames; s.proxies.delay = delayNext; s.proxies.proxyProviders = proxyProviders; - s.proxies.dangleProxyNames = dangleProxyNames; }); }; } @@ -122,10 +126,7 @@ export function updateProviders(apiConfig: ClashAPIConfig, names: string[]) { }; } -async function healthcheckProviderByNameInternal( - apiConfig: ClashAPIConfig, - name: string -) { +async function healthcheckProviderByNameInternal(apiConfig: ClashAPIConfig, name: string) { try { await proxiesAPI.healthcheckProviderByName(apiConfig, name); } catch (x) { @@ -133,10 +134,7 @@ async function healthcheckProviderByNameInternal( } } -export function healthcheckProviderByName( - apiConfig: ClashAPIConfig, - name: string -) { +export function healthcheckProviderByName(apiConfig: ClashAPIConfig, name: string) { return async (dispatch: DispatchFn) => { await healthcheckProviderByNameInternal(apiConfig, name); // should be optimized @@ -169,16 +167,10 @@ async function closeGroupConns( } } - await Promise.all( - idsToClose.map((id) => connAPI.closeConnById(apiConfig, id).catch(noop)) - ); + await Promise.all(idsToClose.map((id) => connAPI.closeConnById(apiConfig, id).catch(noop))); } -function resolveChain( - proxies: ProxiesMapping, - groupName: string, - itemName: string -) { +function resolveChain(proxies: ProxiesMapping, groupName: string, itemName: string) { const chain = [itemName, groupName]; let child: ProxyItem; @@ -198,11 +190,7 @@ async function switchProxyImpl( itemName: string ) { try { - const res = await proxiesAPI.requestToSwitchProxy( - apiConfig, - groupName, - itemName - ); + const res = await proxiesAPI.requestToSwitchProxy(apiConfig, groupName, itemName); if (res.ok === false) { throw new Error(`failed to switch proxy: res.statusText`); } @@ -220,11 +208,6 @@ async function switchProxyImpl( // no wait closePrevConns(apiConfig, proxies, { groupName, itemName }); } - - /* dispatch('showModalClosePrevConns', (s: GlobalState) => { */ - /* s.proxies.showModalClosePrevConns = true; */ - /* s.proxies.switchProxyCtx = { to: { groupName, itemName } }; */ - /* }); */ } function closeModalClosePrevConns() { @@ -268,16 +251,10 @@ function closePrevConnsAndTheModal(apiConfig: ClashAPIConfig) { }; } -export function switchProxy( - apiConfig: ClashAPIConfig, - groupName: string, - itemName: string -) { +export function switchProxy(apiConfig: ClashAPIConfig, groupName: string, itemName: string) { return async (dispatch: DispatchFn, getState: GetStateFn) => { // switch proxy asynchronously - switchProxyImpl(dispatch, getState, apiConfig, groupName, itemName).catch( - noop - ); + switchProxyImpl(dispatch, getState, apiConfig, groupName, itemName).catch(noop); // optimistic UI update dispatch('store/proxies#switchProxy', (s) => { @@ -292,25 +269,13 @@ export function switchProxy( function requestDelayForProxyOnce(apiConfig: ClashAPIConfig, name: string) { return async (dispatch: DispatchFn, getState: GetStateFn) => { const latencyTestUrl = getLatencyTestUrl(getState()); - const res = await proxiesAPI.requestDelayForProxy( - apiConfig, - name, - latencyTestUrl - ); + const res = await proxiesAPI.requestDelayForProxy(apiConfig, name, latencyTestUrl); let error = ''; if (res.ok === false) { error = res.statusText; } const { delay } = await res.json(); - - const delayPrev = getDelay(getState()); - const delayNext = { - ...delayPrev, - [name]: { - error, - number: delay, - }, - }; + const delayNext = { ...getDelay(getState()), [name]: { error, number: delay } }; dispatch('requestDelayForProxyOnce', (s) => { s.proxies.delay = delayNext; @@ -324,17 +289,35 @@ export function requestDelayForProxy(apiConfig: ClashAPIConfig, name: string) { }; } -export function requestDelayForProxies( - apiConfig: ClashAPIConfig, - names: string[] -) { +export function requestDelayForProxies(apiConfig: ClashAPIConfig, names: string[]) { return async (dispatch: DispatchFn, getState: GetStateFn) => { - const proxyNames = getDangleProxyNames(getState()); + const proxies = getProxies(getState()); + const latencyTestUrl = getLatencyTestUrl(getState()); + + const proxyDedupMap = new Map<string, boolean>(); + const providerDedupMap = new Map<string, boolean>(); - const works = names - // remove names that are provided by proxy providers - .filter((p) => proxyNames.indexOf(p) > -1) - .map((p) => dispatch(requestDelayForProxy(apiConfig, p))); + const works = names.map((name) => { + const p = proxies[name]; + if (!p.__provider) { + if (proxyDedupMap.get(name)) { + return undefined; + } else { + proxyDedupMap.set(name, true); + return proxiesAPI.requestDelayForProxy(apiConfig, name, latencyTestUrl); + } + } else if (p.__provider) { + // this one is from a proxy provider + if (providerDedupMap.get(p.__provider)) { + return undefined; + } else { + providerDedupMap.set(p.__provider, true); + return healthcheckProviderByNameInternal(apiConfig, p.__provider); + } + } else { + return undefined; + } + }); await Promise.all(works); await dispatch(fetchProxies(apiConfig)); }; @@ -343,8 +326,9 @@ export function requestDelayForProxies( export function requestDelayAll(apiConfig: ClashAPIConfig) { return async (dispatch: DispatchFn, getState: GetStateFn) => { const proxyNames = getDangleProxyNames(getState()); + const latencyTestUrl = getLatencyTestUrl(getState()); await Promise.all( - proxyNames.map((p) => dispatch(requestDelayForProxy(apiConfig, p))) + proxyNames.map((p) => proxiesAPI.requestDelayForProxy(apiConfig, p, latencyTestUrl)) ); const proxyProviders = getProxyProviders(getState()); // one by one @@ -364,7 +348,7 @@ function retrieveGroupNamesFrom(proxies: Record<string, ProxyItem>) { if (p.all && Array.isArray(p.all)) { groupNames.push(prop); if (prop === 'GLOBAL') { - globalAll = p.all; + globalAll = Array.from(p.all); } } else if (NonProxyTypes.indexOf(p.type) < 0) { proxyNames.push(prop); @@ -386,15 +370,14 @@ type ProvidersRaw = { [key: string]: ProxyProvider; }; -function formatProxyProviders( - providersInput: ProvidersRaw -): { - providers: Array<FormattedProxyProvider>; - proxies: { [key: string]: ProxyItem }; +function formatProxyProviders(providersInput: ProvidersRaw): { + proxyProviders: Array<FormattedProxyProvider>; + providerProxyRecord: ProxiesMapping; } { const keys = Object.keys(providersInput); - const providers = []; - const proxies = {}; + const proxyProviders = []; + const providerProxyRecord: ProxiesMapping = {}; + for (let i = 0; i < keys.length; i++) { const provider: ProxyProvider = providersInput[keys[i]]; if (provider.name === 'default' || provider.vehicleType === 'Compatible') { @@ -404,19 +387,16 @@ function formatProxyProviders( const names = []; for (let j = 0; j < proxiesArr.length; j++) { const proxy = proxiesArr[j]; - proxies[proxy.name] = proxy; + providerProxyRecord[proxy.name] = { ...proxy, __provider: provider.name }; names.push(proxy.name); } // mutate directly provider.proxies = names; - providers.push(provider); + proxyProviders.push(provider); } - return { - providers, - proxies, - }; + return { proxyProviders, providerProxyRecord }; } export const actions = { diff --git a/src/store/types.ts b/src/store/types.ts index 3a3e412..faf8a92 100644 --- a/src/store/types.ts +++ b/src/store/types.ts @@ -44,39 +44,45 @@ export type TunPartial<T> = { ///// store.proxies -type LatencyHistory = Array<{ time: string; delay: number }>; -type PrimitiveProxyType = 'Shadowsocks' | 'Snell' | 'Socks5' | 'Http' | 'Vmess'; +type LatencyHistoryItem = { time: string; delay: number }; +export type LatencyHistory = LatencyHistoryItem[]; + export type ProxyItem = { name: string; - type: PrimitiveProxyType; + type: string; history: LatencyHistory; all?: string[]; now?: string; + + __provider?: string; }; + +export type ProxyDelayItem = { + number?: number; +}; + export type ProxiesMapping = Record<string, ProxyItem>; -export type DelayMapping = Record<string, { number?: number }>; +export type DelayMapping = Record<string, ProxyDelayItem>; export type ProxyProvider = { name: string; type: 'Proxy'; updatedAt: string; vehicleType: 'HTTP' | 'File' | 'Compatible'; - proxies: Array<ProxyItem>; + proxies: ProxyItem[]; }; -export type FormattedProxyProvider = Omit<ProxyProvider, 'proxies'> & { - proxies: string[]; -}; +export type FormattedProxyProvider = Omit<ProxyProvider, 'proxies'> & { proxies: string[] }; export type SwitchProxyCtxItem = { groupName: string; itemName: string }; -type SwitchProxyCtx = { - to: SwitchProxyCtxItem; -}; +type SwitchProxyCtx = { to: SwitchProxyCtxItem }; + export type StateProxies = { - proxies: ProxiesMapping; - delay: DelayMapping; groupNames: string[]; proxyProviders?: FormattedProxyProvider[]; + + proxies: ProxiesMapping; + delay: DelayMapping; dangleProxyNames?: string[]; showModalClosePrevConns: boolean; @@ -53,8 +53,7 @@ registerRoute( // precache, in this case same-origin .png requests like those from in public/ registerRoute( // Add in any other file extensions or routing criteria as needed. - ({ url }) => - url.origin === self.location.origin && url.pathname.endsWith('.png'), + ({ url }) => url.origin === self.location.origin && url.pathname.endsWith('.png'), // Customize this strategy as needed, e.g., by changing to CacheFirst. new StaleWhileRevalidate({ cacheName: 'images', diff --git a/src/swRegistration.ts b/src/swRegistration.ts index 55ceb0b..0a684a8 100644 --- a/src/swRegistration.ts +++ b/src/swRegistration.ts @@ -3,9 +3,7 @@ const isLocalhost = Boolean( // [::1] is the IPv6 localhost address. window.location.hostname === '[::1]' || // 127.0.0.0/8 are considered localhost for IPv4. - window.location.hostname.match( - /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ - ) + window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/) ); type Config = { @@ -34,9 +32,7 @@ export function register(config?: Config) { // Add some additional logging to localhost, pointing developers to the // service worker/PWA documentation. navigator.serviceWorker.ready.then(() => { - console.log( - 'This web app is being served cache-first by a service worker' - ); + console.log('This web app is being served cache-first by a service worker'); }); } else { // Is not localhost. Just register service worker @@ -114,9 +110,7 @@ function checkValidServiceWorker(swUrl: string, config?: Config) { } }) .catch(() => { - console.log( - 'No internet connection found. App is running in offline mode.' - ); + console.log('No internet connection found. App is running in offline mode.'); }); } diff --git a/src/types.ts b/src/types.ts index 694289b..8a07865 100644 --- a/src/types.ts +++ b/src/types.ts @@ -3,4 +3,6 @@ export type ClashAPIConfig = { secret?: string; }; -export type LogsAPIConfig = ClashAPIConfig & { logLevel: string };
\ No newline at end of file +export type LogsAPIConfig = ClashAPIConfig & { logLevel: string }; + +export type RuleType = { id?: number; type?: string; payload?: string; proxy?: string }; |
