diff --git a/.circleci/config.yml b/.circleci/config.yml index b64b3e82..3f522d3c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,13 +1,14 @@ version: 2.1 orbs: codecov: codecov/codecov@3.2.2 - gh: circleci/github-cli@1.0.3 - browser-tools: circleci/browser-tools@1.2.4 + gh: circleci/github-cli@2.2.0 + browser-tools: circleci/browser-tools@1.4.3 + jobs: - build_login_workflow: - working_directory: ~/login-workflow + install_dependencies: docker: - - image: cimg/node:14.19.0-browsers + - image: cimg/node:18.17.0-browsers + working_directory: ~/login-workflow resource_class: large steps: - checkout @@ -24,21 +25,90 @@ jobs: paths: - node_modules key: v2-dependencies-{{ checksum "login-workflow/yarn.lock" }} + + prettier_check: + docker: + - image: cimg/node:18.17.0-browsers + working_directory: ~/login-workflow + resource_class: large + steps: + - checkout + - restore_cache: + keys: + - v2-dependencies-{{ checksum "login-workflow/yarn.lock" }} + - run: + name: Install Dependencies + command: | + cd login-workflow + yarn install --frozen-lockfile - run: name: Prettier Check command: | cd login-workflow yarn prettier:check + + lint_check: + docker: + - image: cimg/node:18.17.0-browsers + environment: + NODE_OPTIONS=--max-old-space-size=5120 + working_directory: ~/login-workflow + resource_class: large + steps: + - checkout + - restore_cache: + keys: + - v2-dependencies-{{ checksum "login-workflow/yarn.lock" }} + - run: + name: Install Dependencies + command: | + cd login-workflow + yarn install --frozen-lockfile - run: name: Lint command: | cd login-workflow yarn lint + + store_test_results: + docker: + - image: cimg/node:18.17.0-browsers + parallelism: 4 + working_directory: ~/login-workflow + resource_class: large + steps: + - checkout + - restore_cache: + keys: + - v2-dependencies-{{ checksum "login-workflow/yarn.lock" }} + - run: + name: Install Dependencies + command: | + cd login-workflow + yarn install --frozen-lockfile - run: name: Tests command: | cd login-workflow - yarn test --maxWorkers=2 --coverage --watchAll=false + yarn test:ci --maxWorkers=2 --coverage --watchAll=false + + build_login_workflow: + docker: + - image: cimg/node:18.17.0-browsers + environment: + NODE_OPTIONS=--max-old-space-size=5120 + working_directory: ~/login-workflow + resource_class: large + steps: + - checkout + - restore_cache: + keys: + - v2-dependencies-{{ checksum "login-workflow/yarn.lock" }} + - run: + name: Install Dependencies + command: | + cd login-workflow + yarn install --frozen-lockfile - run: name: Build command: | @@ -50,63 +120,10 @@ jobs: - login-workflow/dist - login-workflow/coverage - cypress_tests: - working_directory: ~/login-workflow/example - parallelism: 2 - docker: - - image: cimg/node:14.19.0-browsers - resource_class: large - steps: - - checkout - - restore_cache: - keys: - - v2-dependencies-{{ checksum "login-workflow/yarn.lock" }} - - restore_cache: - keys: - - v2-dependencies-{{ checksum "login-workflow/example/yarn.lock" }} - - run: - name: Install Dependencies - command: | - cd login-workflow - yarn install --frozen-lockfile - - run: - name: Install Dependencies - command: | - cd login-workflow/example - yarn install --frozen-lockfile - - save_cache: - name: Save Cache - paths: - - ~/.cache - - node_modules - key: v2-dependencies-{{ checksum "login-workflow/yarn.lock" }} - - save_cache: - name: Save Cache - paths: - - ~/.cache - - node_modules - key: v2-dependencies-{{ checksum "login-workflow/example/yarn.lock" }} - - run: - name: Initialize link workflow - command: | - cd login-workflow - yarn cy:stage - - run: - name: Cypress E2E Tests - command: | - cd login-workflow - yarn cytest - - store_artifacts: - path: cypress/screenshots - - persist_to_workspace: - root: . - paths: - - login-workflow/cypress-coverage - coverage_report: working_directory: ~/login-workflow docker: - - image: cimg/node:14.19.0-browsers + - image: cimg/node:18.17.0-browsers steps: - checkout - attach_workspace: @@ -115,14 +132,10 @@ jobs: file: './login-workflow/coverage/clover.xml' flags: unit_tests token: CODECOV_TOKEN - - codecov/upload: - file: './login-workflow/cypress-coverage/clover.xml' - flags: ui_tests - token: CODECOV_TOKEN publish_login_workflow: docker: - - image: cimg/node:14.19.0-browsers + - image: cimg/node:18.17.0-browsers steps: - checkout - attach_workspace: @@ -137,30 +150,14 @@ jobs: command: | cd login-workflow && yarn publish:package -b $CIRCLE_BRANCH - tag_login_workflow: - docker: - - image: cimg/node:14.19.0-browsers - steps: - - checkout - - gh/setup - - run: - name: Tag @brightlayer-ui/react-auth-workflow - command: | - cd login-workflow && yarn tag:package -b $CIRCLE_BRANCH -s -blui-react-auth-workflow - workflows: - version: 2 react_workflows: jobs: + - install_dependencies + - prettier_check + - lint_check + - store_test_results - build_login_workflow - - cypress_tests: - requires: - - build_login_workflow - filters: - branches: - only: - - master - - dev - publish_login_workflow: requires: - build_login_workflow @@ -169,18 +166,11 @@ workflows: only: - master - dev - - tag_login_workflow: - requires: - - publish_login_workflow - filters: - branches: - only: - - master - coverage_report: requires: - build_login_workflow - - cypress_tests filters: branches: only: - master + - dev diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 00000000..8d92f108 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,34 @@ +--- +name: Bug Report +about: Report a bug with a Brightlayer UI resource +title: '' +labels: 'bug, needs-review, brightlayer-ui' +assignees: '' +--- + +#### Describe the bug / expected behavior + +#### What are the steps to reproduce? + +1. Go to... +2. Click on... + +#### Screenshots / Screen recording + +#### Code snippet / Link to minimum reproduction example + + + +``` +CODE HERE +``` + +#### Your environment information + + + +#### Suggested fix + + + +#### Anything else to add? diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 00000000..e2f2a18b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,15 @@ +--- +name: Feature Request +about: Suggest an idea for this resource +title: '' +labels: 'enhancement, needs-review, brightlayer-ui' +assignees: '' +--- + +#### Describe the desired feature/functionality + +#### Additional Context (where / how would this be used) + +#### Is this request related to a current issue? + +#### Suggested implementation details diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..abc913a0 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,29 @@ + + +Fixes # . + + + +#### Changes proposed in this Pull Request: + +- +- +- + + + +#### Screenshots / Screen Recording (if applicable) + +- + + + +#### To Test: + +- + + + +#### Any specific feedback you are looking for? + +- diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 87368fd7..e94e381f 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,21 +1,21 @@ version: 2 updates: - - package-ecosystem: "npm" - directory: "/login-workflow" - schedule: - interval: "weekly" - day: "wednesday" - open-pull-requests-limit: 1 - target-branch: "dev" - labels: - - "external-dependency" - - - package-ecosystem: "npm" - directory: "/login-workflow/example" - schedule: - interval: "weekly" - day: "wednesday" - open-pull-requests-limit: 1 - target-branch: "dev" - labels: - - "external-dependency" \ No newline at end of file + - package-ecosystem: 'npm' + directory: '/login-workflow' + schedule: + interval: 'monthly' + day: 'wednesday' + open-pull-requests-limit: 1 + target-branch: 'dev' + labels: + - 'external-dependency' + + - package-ecosystem: 'npm' + directory: '/login-workflow/example' + schedule: + interval: 'monthly' + day: 'wednesday' + open-pull-requests-limit: 1 + target-branch: 'dev' + labels: + - 'external-dependency' diff --git a/.github/pr-labeler.yml b/.github/pr-labeler.yml deleted file mode 100644 index 0af500b0..00000000 --- a/.github/pr-labeler.yml +++ /dev/null @@ -1,2 +0,0 @@ -master: ['hotfix/*', 'release/*', 'dev/*', 'dev*'] -external-dependency: ['combined/*', 'combined-dependabots/*'] \ No newline at end of file diff --git a/.github/workflows/blui-pr-actions.yml b/.github/workflows/blui-pr-actions.yml new file mode 100644 index 00000000..f87cf24b --- /dev/null +++ b/.github/workflows/blui-pr-actions.yml @@ -0,0 +1,18 @@ +name: blui-pr-actions +on: + pull_request_target: + types: + - opened + +permissions: + pull-requests: write + contents: read + +jobs: + pr-labels: + uses: etn-ccis/blui-automation/.github/workflows/blui-labels.yml@dev + secrets: inherit + + pr-comment: + uses: etn-ccis/blui-automation/.github/workflows/blui-comment.yml@dev + secrets: inherit \ No newline at end of file diff --git a/.github/workflows/firebase-hosting-merge.yml b/.github/workflows/firebase-hosting-merge.yml index 1c02a2f3..c14a7dac 100644 --- a/.github/workflows/firebase-hosting-merge.yml +++ b/.github/workflows/firebase-hosting-merge.yml @@ -3,19 +3,19 @@ name: Deploy to Firebase Hosting on merge 'on': - push: - branches: - - master + push: + branches: + - master jobs: - build_and_deploy: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - run: cd login-workflow && yarn initialize && yarn install:dependencies && yarn link:workflow && cd example && yarn && yarn build - - uses: FirebaseExtended/action-hosting-deploy@v0 - with: - entryPoint: "./login-workflow" - repoToken: '${{ secrets.GITHUB_TOKEN }}' - firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_BLUI_REACT_LOGIN }}' - channelId: live - projectId: blui-react-login + build_and_deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - run: cd login-workflow && yarn install:dependencies && yarn link:workflow && cd example && yarn && yarn build + - uses: FirebaseExtended/action-hosting-deploy@v0 + with: + entryPoint: './login-workflow' + repoToken: '${{ secrets.GITHUB_TOKEN }}' + firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_BLUI_REACT_LOGIN }}' + channelId: live + projectId: blui-react-login diff --git a/.github/workflows/firebase-hosting-pull-request.yml b/.github/workflows/firebase-hosting-pull-request.yml index 11526535..bd01a2a7 100644 --- a/.github/workflows/firebase-hosting-pull-request.yml +++ b/.github/workflows/firebase-hosting-pull-request.yml @@ -4,16 +4,16 @@ name: Deploy to Firebase Hosting on PR 'on': pull_request jobs: - build_and_preview: - if: '${{ github.event.pull_request.head.repo.full_name == github.repository }}' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - run: cd login-workflow && yarn initialize && yarn install:dependencies && yarn link:workflow && cd example && yarn && yarn build - - uses: FirebaseExtended/action-hosting-deploy@v0 - with: - entryPoint: "./login-workflow" - repoToken: '${{ secrets.GITHUB_TOKEN }}' - firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_BLUI_REACT_LOGIN }}' - expires: 2d - projectId: blui-react-login + build_and_preview: + if: '${{ github.event.pull_request.head.repo.full_name == github.repository }}' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - run: cd login-workflow && yarn install:dependencies && yarn link:workflow && cd example && yarn && yarn build + - uses: FirebaseExtended/action-hosting-deploy@v0 + with: + entryPoint: './login-workflow' + repoToken: '${{ secrets.GITHUB_TOKEN }}' + firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_BLUI_REACT_LOGIN }}' + expires: 2d + projectId: blui-react-login diff --git a/.github/workflows/pr-comment.yml b/.github/workflows/pr-comment.yml deleted file mode 100644 index 12a926d4..00000000 --- a/.github/workflows/pr-comment.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: 'Comment on PR' -on: - pull_request: - branches: - - master - -jobs: - example_comment_pr: - runs-on: ubuntu-latest - name: comment PR if needed - steps: - - name: Checkout - uses: actions/checkout@v3 - - name: Comment PR - uses: thollander/actions-comment-pull-request@v1 - with: - message: 'Thank you for the master pull request. 👍 Please be sure this pull request is for the master branch. The master branch is used for items that are ready for publishing. - The dev branch is our working branch for all issues and enhancements. Please read our [Contributing Guidelines](https://github.com/brightlayer-ui/.github/blob/dev/CONTRIBUTING.md) for more information.' - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/pr-labeler.yml b/.github/workflows/pr-labeler.yml deleted file mode 100644 index f02e521c..00000000 --- a/.github/workflows/pr-labeler.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: PR Labeler -on: - pull_request: - types: [opened] - -jobs: - pr-labeler: - runs-on: ubuntu-latest - steps: - - uses: TimonVS/pr-labeler-action@v3 - with: - configuration-path: .github/pr-labeler.yml - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/tagging.yml b/.github/workflows/tagging.yml new file mode 100644 index 00000000..ff4af848 --- /dev/null +++ b/.github/workflows/tagging.yml @@ -0,0 +1,17 @@ +name: Tagging + +env: + GH_TOKEN: ${{ github.token }} + CURRENT_BRANCH: ${{ github.ref_name }} + +on: + push: + branches: + - master + +jobs: + tag-package: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - run: cd login-workflow && yarn tag:package -b ${CURRENT_BRANCH} diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index fcc7270a..00000000 --- a/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule "login-workflow/shared-auth"] - path = login-workflow/shared-auth - url = https://github.com/brightlayer-ui/react-auth-shared - branch = dev \ No newline at end of file diff --git a/CODEOWNERS b/CODEOWNERS index 1cf2dd1a..04b1dcbb 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1 +1 @@ -* @emclaug2 @daileytj @jeffvg +* @surajeaton @ektaghag-eaton @JeffGreiner-eaton diff --git a/login-workflow/.gitignore b/login-workflow/.gitignore index 18c8e080..2e94fc5c 100644 --- a/login-workflow/.gitignore +++ b/login-workflow/.gitignore @@ -28,10 +28,6 @@ lib-cov # Coverage directory used by tools like istanbul /coverage -/cypress-coverage - -# nyc test coverage -.nyc_output # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) .grunt diff --git a/login-workflow/CHANGELOG.md b/login-workflow/CHANGELOG.md index 8f97e2b8..e94a25ab 100644 --- a/login-workflow/CHANGELOG.md +++ b/login-workflow/CHANGELOG.md @@ -5,15 +5,29 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## v4.0.0 (October 4, 2023) + +### Added + +- Reusable screen components. +- Support for custom react auth workflow injection. +- Support for router customizability. + +Learn more about migrating from v3 => v4 your existing application by reading our [Migrating Guide](https://github.com/etn-ccis/blui-react-workflows/blob/master/login-workflow/README.md#migrating-from-v3--v4). + +### Changed + +- Updated i18next and react-i18next packages to the latest. + ## v3.1.1 (December 14, 2022) ### Changed -- Removed dependency on @mui/styles ([#170](https://github.com/brightlayer-ui/react-workflows/issues/170)). +- Removed dependency on @mui/styles ([#170](https://github.com/etn-ccis/blui-react-workflows/issues/170)). ### Fixed -- Issue where password field displays two show password icons on Edge and IE ([#173](https://github.com/brightlayer-ui/react-workflows/issues/173)). +- Issue where password field displays two show password icons on Edge and IE ([#173](https://github.com/etn-ccis/blui-react-workflows/issues/173)). ## v3.1.0 (June 24, 2022) @@ -32,7 +46,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - We now use [Material UI v5](https://mui.com/) — you will need to update peerDependencies appropriately and make the [necessary changes](https://mui.com/guides/migration-v4/) to migrate your application to the new version. -- We now use [React Router v6](https://reactrouter.com/docs/en/v6/upgrading/v5) — this will likely require you to reconfigure how your application routes are set up. Routes must be passed directly into the `` element (see [Existing Project Integration ](https://github.com/brightlayer-ui/react-workflows/tree/master/login-workflow/docs/existing-project-integration.md) for examples). +- We now use [React Router v6](https://reactrouter.com/docs/en/v6/upgrading/v5) — this will likely require you to reconfigure how your application routes are set up. Routes must be passed directly into the `` element. ## v2.5.0 (March 14, 2022) @@ -42,7 +56,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed -- Import material-ui components via default imports instead of named imports to reduce overall bundle size ([#85](https://github.com/brightlayer-ui/react-workflows/issues/85)) +- Import material-ui components via default imports instead of named imports to reduce overall bundle size ([#85](https://github.com/etn-ccis/blui-react-workflows/issues/85)) ### Fixed diff --git a/login-workflow/LICENSES.json b/login-workflow/LICENSES.json index 5e9b7a6d..c7d426c3 100644 --- a/login-workflow/LICENSES.json +++ b/login-workflow/LICENSES.json @@ -1,20 +1,14 @@ { - "@brightlayer-ui/icons-mui@3.2.0": { + "@brightlayer-ui/icons-mui@3.4.0": { "licenses": "BSD-3-Clause", - "repository": "https://github.com/brightlayer-ui/icons", - "licenseUrl": "https://github.com/brightlayer-ui/icons/raw/master/LICENSE", + "repository": "https://github.com/etn-ccis/blui-icons", + "licenseUrl": "https://github.com/etn-ccis/blui-icons/raw/master/LICENSE", "parents": "example" }, - "@brightlayer-ui/react-auth-shared@3.7.3": { - "licenses": "BSD-3-Clause", - "repository": "https://github.com/brightlayer-ui/react-auth-shared/tree/master", - "licenseUrl": "https://github.com/brightlayer-ui/react-auth-shared/tree/master/raw/master/LICENSE.md", - "parents": "@brightlayer-ui/react-auth-workflow" - }, - "@testing-library/user-event@14.4.3": { + "@mui/material@5.13.2": { "licenses": "MIT", - "repository": "https://github.com/testing-library/user-event", - "licenseUrl": "https://github.com/testing-library/user-event/raw/master/LICENSE", + "repository": "https://github.com/mui/material-ui", + "licenseUrl": "https://github.com/mui/material-ui/raw/master/LICENSE", "parents": "example" }, "@types/node@17.0.45": { @@ -23,7 +17,13 @@ "licenseUrl": "https://github.com/DefinitelyTyped/DefinitelyTyped/raw/master/LICENSE", "parents": "example" }, - "dompurify@2.4.1": { + "@types/react@18.2.7": { + "licenses": "MIT", + "repository": "https://github.com/DefinitelyTyped/DefinitelyTyped", + "licenseUrl": "https://github.com/DefinitelyTyped/DefinitelyTyped/raw/master/LICENSE", + "parents": "example" + }, + "dompurify@2.4.5": { "licenses": "(MPL-2.0 OR Apache-2.0)", "repository": "https://github.com/cure53/DOMPurify", "licenseUrl": "https://github.com/cure53/DOMPurify/raw/master/LICENSE", @@ -35,18 +35,30 @@ "licenseUrl": "https://github.com/i18next/i18next-browser-languageDetector/raw/master/LICENSE", "parents": "@brightlayer-ui/react-auth-workflow" }, + "i18next@23.5.1": { + "licenses": "MIT", + "repository": "https://github.com/i18next/i18next", + "licenseUrl": "https://github.com/i18next/i18next/raw/master/LICENSE", + "parents": "example" + }, "react-app-polyfill@3.0.0": { "licenses": "MIT", "repository": "https://github.com/facebook/create-react-app", "licenseUrl": "https://github.com/facebook/create-react-app/raw/master/LICENSE", "parents": "example" }, - "react-i18next@12.0.0": { + "react-i18next@13.2.2": { "licenses": "MIT", "repository": "https://github.com/i18next/react-i18next", "licenseUrl": "https://github.com/i18next/react-i18next/raw/master/LICENSE", "parents": "example" }, + "react-router-dom@6.11.2": { + "licenses": "MIT", + "repository": "https://github.com/remix-run/react-router", + "licenseUrl": "https://github.com/remix-run/react-router/raw/master/LICENSE.md", + "parents": "example" + }, "react-scripts@5.0.1": { "licenses": "MIT", "repository": "https://github.com/facebook/create-react-app", diff --git a/login-workflow/README.md b/login-workflow/README.md index f2ab1f91..9785e4fe 100644 --- a/login-workflow/README.md +++ b/login-workflow/README.md @@ -1,104 +1,122 @@ -# React Auth Workflow -![npm (scoped)](https://img.shields.io/npm/v/@brightlayer-ui/react-auth-workflow) +# React Auth Workflow -The React Auth Workflow package provides a consistent authentication and registration experience across Eaton web applications using React. +[![](https://img.shields.io/circleci/project/github/etn-ccis/blui-react-workflows/master.svg?style=flat)](https://circleci.com/gh/etn-ccis/blui-react-workflows/tree/master) ![npm (scoped)](https://img.shields.io/npm/v/@brightlayer-ui/react-auth-workflow) [![codecov](https://codecov.io/gh/etn-ccis/blui-react-workflows/branch/master/graph/badge.svg?token=H18T75WBFS)](https://codecov.io/gh/etn-ccis/blui-react-workflows) -This includes pre-built implementations of the screens for Login, Forgot Password, Contact Information, Self-Registration, Registration By Invitation, and a dialog for Change Password. +The React Auth Workflow package provides a consistent UI implementation of authentication-related capabilities for use in Eaton web applications built with React. -Integrating the user interface into your application is as easy as providing the API calls for the various authentication and registration actions performed by the user. The `AuthNavigationContainer` automatically handles the presentation of the non-secure (pre-authorization) and secure (custom application) portions of a mobile application. +The package is intended to provide a standard, out-of-the-box experience for capabilities such as: -![Login iOS](https://raw.githubusercontent.com/brightlayer-ui/react-workflows/master/login-workflow/media/login.png) ![Home iOS](https://raw.githubusercontent.com/brightlayer-ui/react-workflows/master/login-workflow/media/home.png) ![Password iOS](https://raw.githubusercontent.com/brightlayer-ui/react-workflows/master/login-workflow/media/password.png) +- Login +- Forgot / Reset Password +- Change Password +- Contact Support +- Self Registration +- Invitation-based Registration +This package is flexible, allowing you to use the Login and Registration flows independently or in combination (or simply use individual screen components), while also providing many opportunities to customize the flows if needed for your particular application. + +These workflows are back-end agnostic, meaning you can use them with any back-end API you wish. You simply need to provide an implementation for several key functions (actions) that are called at various points within the workflows based on user interaction. + +![Login](https://raw.githubusercontent.com/etn-ccis/blui-react-workflows/master/login-workflow/media/login.png) +![Password](https://raw.githubusercontent.com/etn-ccis/blui-react-workflows/master/login-workflow/media/password.png) # Installation + To install the latest version of this package, run: + ```shell npm install --save @brightlayer-ui/react-auth-workflow // or yarn add @brightlayer-ui/react-auth-workflow ``` -# Integration -You have two options for using this package in your application. You can manually integrate the package into an existing project, or you can start a project using the `/example` project. - -To integrate the package into an existing project, read our [Existing Project Integration ](https://github.com/brightlayer-ui/react-workflows/tree/master/login-workflow/docs/existing-project-integration.md) instructions. Even if you are starting from scratch, it may be useful for you to refer to the example project while getting started. +### Peer Dependencies -To use the example project as a starting point, read our [Sample Project Integration ](https://github.com/brightlayer-ui/react-workflows/tree/master/login-workflow/docs/sample-project-integration.md) instructions. +This package also has a number of peer dependency requirements that you will need to install in your project. To install the latest version of all of these peer dependencies, run the following command in your project root: - -# Usage (Security State) - -After setup, you are now able to access various security actions and state from within your application. Importing `useSecurityActions` and `useSecurityState` allows you use these hooks as follows: - -```ts -import {useSecurityActions, useSecurityState } from '@brightlayer-ui/react-auth-workflow'; - -const securityActions = useSecurityActions(); -const securityState = useSecurityState(); +``` +npm install --save @mui/material @emotion/react @emotion/styled @mui/icons-material @brightlayer-ui/react-components date-fns i18next react-i18next +// or +yarn add @mui/material @emotion/react @emotion/styled @mui/icons-material @brightlayer-ui/react-components date-fns i18next react-i18next ``` -The `securityActions` allows you to access actions related to user authentication and de-authentication. You can call `securityActions.onUserNotAuthenticated();` to un-authenticate (i.e., log user out) from the application. +# Usage -The `securityState` allows you to access state related to security, such as the currently authenticated user's email (`securityState.email`). +To use the package, read our [Integration](https://github.com/etn-ccis/blui-react-workflows/tree/master/login-workflow/docs/integration.md) instructions. Even if you are starting from scratch, it may be useful for you to refer to the [Example](https://github.com/etn-ccis/blui-react-workflows/tree/master/login-workflow/example) project while getting started. -More information about React Auth Workflow's exported objects can found in the [API](https://github.com/brightlayer-ui/react-workflows/tree/master/login-workflow/docs/API.md) documentation. +In short, you will need to: +- Add routes for each of the Login Workflow screens you wish to include +- Define a mechanism for tracking the authenticated state of the current user +- Add a registration route for the registration workflow component +- Configure route guards / protected routes to ensure users only have access to specific routes when appropriate +- Define actions files to integrate the workflow screens with your back-end API -# Routing -This library uses [React Router](https://reactrouter.com/) for routing. It includes a `` wrapping the entire application, so in your application, you may skip providing a Router and just render ``s. +> If you are starting a brand new project, the easiest way to get started with the React Auth Workflow is to use the [BLUI CLI](https://www.npmjs.com/package/@brightlayer-ui/cli) and select the Authentication template as your starting point. This will create a brand new project that exactly mirrors the example project from this repository. -The following is a list of the screens and their available query strings which a deep link may launch to. Some screens take optional query string parameters: +## Learn More -| Screen | Description | Default URL | Query String Params | -| ------------------- | ------------------------------------------------------ | ---------------------------- | ------------------- | -| Login | the login screen | `'/login'` | | -| Forgot Password | the forgot password screen | `'/forgot-password'` | | -| Reset Password | the reset password screen | `'/reset-password'` | `code`, `email` | -| Invite Registration | the first screen of the invite-based registration flow | `'/register/invite'` | `code`, `email` | -| Self Registration | the first screen of the self-registration flow | `'/register/create-account'` | `code`, `email` | -| Support | the contact/support screen | `'/support'` | | +- [Setting Up Routing](https://github.com/etn-ccis/blui-react-workflows/tree/master/login-workflow/docs/routing.md) +- [Language Support](https://github.com/etn-ccis/blui-react-workflows/tree/master/login-workflow/docs/language-support.md) +- [Adding an Authentication/Login Workflow](https://github.com/etn-ccis/blui-react-workflows/tree/master/login-workflow/docs/authentication-workflow.md) +- [Adding a Registration Workflow](https://github.com/etn-ccis/blui-react-workflows/tree/master/login-workflow/docs/registration-workflow.md) +- [Handling Errors](https://github.com/etn-ccis/blui-react-workflows/tree/master/login-workflow/docs/error-management.md) +- [Customizing Workflows](https://github.com/etn-ccis/blui-react-workflows/tree/master/login-workflow/docs/customization.md) +- [Components & APIs](https://github.com/etn-ccis/blui-react-workflows/tree/master/login-workflow/docs/components/README.md) +- [Screens](https://github.com/etn-ccis/blui-react-workflows/tree/master/login-workflow/docs/screens/README.md) -#### Testing Deep Links +# Migrating from v3 => v4 -- Open the sample URL in your browser `localhost:3000/register/invite?code=8k27jshInvite234Code` +We have listened to your feedback and version 4 of this library is a significant rewrite that aims to address many requests for greater flexibility and customization of the workflows. -Note that the base routes for each screen can be customized via a prop on the ``. +Some notable changes include: -# APIs -More information about React Auth Workflow's exported objects and functions can found in the [API](https://github.com/brightlayer-ui/react-workflows/tree/master/login-workflow/docs/API.md) documentation. +- Router independence — you now have full control over your routing library and its configuration +- Allowing you to manage the authentication status / mechanism (separating UI from business logic) +- Separation of Login and Registration workflows so they can be used independently +- Allow for re-ordering or adding/removing screens from workflows (utility components available to help you match our styling in custom screens) +- Exporting screens individually so you can build your own custom flows +- Simpler approach to translations (separating our internal translations from your application-level translations) +- Greater customization of screens through props (and moving customization properties to the screens they affect instead of handling all customizations through a monolithic wrapper component) +- Improved error management mechanism (customizable) -# Language Support -For information about supporting multiple languages, refer to our [Language Support](https://github.com/brightlayer-ui/react-workflows/tree/master/login-workflow/docs/language-support.md) guidelines. +Learn more about upgrading your existing application by reading our [Migrating Guide](https://github.com/etn-ccis/blui-react-workflows/tree/master/login-workflow/docs/migration-guide-3-4.md) # Contributors To work on this package as a contributor, first clone down the repository: + ```shell -git clone https://github.com/brightlayer-ui/react-workflows +git clone https://github.com/etn-ccis/blui-react-workflows cd react-workflows/login-workflow ``` You can install all necessary dependencies and run the demo project by running: + ```shell yarn start:example ``` If you make changes to the library components and want to link them to the running example project, you can run: + ```shell yarn link:workflow ``` You can build the library by running: + ```shell yarn build ``` You can run the lint checks, prettier formatter, unit tests, and build by running: + ```shell yarn precommit ``` You can update the auto-generated licenses.md file by running: + ```shell yarn generate:licenses ``` @@ -106,7 +124,3 @@ yarn generate:licenses ## Browser Support Brightlayer UI Login Workflow will work with any modern browser. For details refer to our [Browser Support](https://brightlayer-ui.github.io/development/frameworks-web/react#browser-support) documentation. - -## Customizing the Workflow - -The workflow allows for some customizations. For details refer to our [Customization](docs/customization.md) documentation. \ No newline at end of file diff --git a/login-workflow/codecov.yml b/login-workflow/codecov.yml index 10022562..7717ef29 100644 --- a/login-workflow/codecov.yml +++ b/login-workflow/codecov.yml @@ -38,13 +38,4 @@ flag_management: - type: project target: 20% - type: patch - target: 80% - - name: ui_tests - paths: - - ./login-workflow/example/src - carryforward: true - statuses: - - type: project - target: 20% - - type: patch - target: 80% \ No newline at end of file + target: 80% \ No newline at end of file diff --git a/login-workflow/docs/API.md b/login-workflow/docs/API.md index 5be3b886..70c6ed48 100644 --- a/login-workflow/docs/API.md +++ b/login-workflow/docs/API.md @@ -1,42 +1,40 @@ # API This document outlines the various exports and configuration options for the React Auth Workflow package. -The majority of the types and export used in this package come from @brightlayer-ui/react-auth-shared. You can read about those exported objects and functions in their [API](https://github.com/brightlayer-ui/react-auth-shared/tree/master/docs/API.md) documentation. +## RegistrationContextProviderProps +The `RegistrationContextProvider` manages the state of the registration workflow. It is a React Context Provider that wraps the entire registration workflow. It is responsible for managing the state of the registration workflow and providing the necessary actions to the various screens. The `RegistrationContextProviderProps` type is used to configure the `RegistrationContextProvider`. -## Components - -### AuthNavigationContainer -Container component which holds the authentication and navigation state and screens. This should be rendered at the root wrapping the whole app (except for the Context Provider components). The URL used for each screen in the authentication workflow can be customized - -#### Usage -```tsx -import { AuthNavigationContainer } from '@brightlayer-ui/react-auth-workflow'; - - - { /* ...contents */ } - -``` - -#### Available Props - -- **routeConfig** (optional): _`RouteConfig`_ - - Details the custom routes to use for any or all of the screens in the workflow. -- **extraRoutes** (optional): _`JSX.ELement[]`_ - - Additional routes that you would like to be accessible to the user without logging in (e.g. Terms of Service, etc.). Each child in the array should be an individual `` component. - -### ContactSupportContent -Contents used in the Contact/Support screen. These are exported so that you can present this same information elsewhere in the main content of your application if you so desire. - -#### Usage -```tsx -import { ContactSupportContent } from '@brightlayer-ui/react-auth-workflow'; +### Type Declaration +- **actions**: _`RegistrationUIActions`_ + - Returns an object of functions that are used to manage the registration workflow. See [RegistrationUIActions](#registrationuiactions) for more information. +- **language**: _`string`_ + - The language code to use for the registration workflow. This is used to determine which language to use for the UI and for the API calls. +- **navigate**: _`(url: string) => void`_ + - A function that is used to navigate to a new URL. This is used to navigate to the various screens of the registration workflow. +- **routeConfig**: _`RouteConfig`_ + - An object that defines the various routes for the registration workflow. See [RouteConfig](#routeconfig) for more information. +- **i18n**: (optional) _`i18n`_ + - An optional i18n object that is used to translate the UI. If not provided, the default i18n object will be used. +- **errorConfig**: (optional) _`ErrorContextProviderProps`_ + - An optional object that is used to configure the error handling of the registration workflow. See [ErrorContextProviderProps](#errorcontextproviderprops) for more information. - - - -``` +## RegistrationUIActions -# Type Definitions +### Type Declaration +- **loadEula**: _`(language: string) => Promise`_ + - A function that is used to load the EULA. This function will be called when the user lands on the EULA screen. +- **acceptEula**: _`() => Promise`_ + - A function that is used to accept the EULA. This function will be called when the user clicks the Next button on the EULA screen. +- **requestRegistrationCode**: _`(email: string) => Promise`_ + - A function that is used to request a registration code. This function will be called when the user lands on the Verify Code screen as well as when a user clicks the Resend Verification Code button. +- **validateUserRegistrationRequest**: _`(validationCode: string, validationEmail?: string) => Promise<{codeValid: boolean | string; accountExists?: boolean}>`_ + - A function that is used to validate a registration code. This function will be called when the user clicks the Next button on the Verify Code screen screen. +- **createPassword**: _`(password: string) => Promise`_ + - A function that is used to create a password. This function will be called when the user clicks the Next button on the Create Password screen. +- **setAccountDetails**: _`(details: AccountDetails) => Promise`_ + - A function that is used to set the account details. This function will be called when the user clicks the Next button on the Account Details screen. +- **completeRegistration**: _`(userData: any, validationCode: number | string, validationEmail: string) => Promise<{ email: string, organizationName: string }>`_ + - A function that is used to complete the registration. This function will be called when the user clicks the Next button on the final registration workflow screen. ## RouteConfig @@ -55,4 +53,65 @@ Type to represent the customizable route configuration of the authentication scr - **REGISTER_SELF**: (optional) _`string`_ - The URL path for the create account via self-registration screens - **SUPPORT**: (optional) _`string`_ - - The URL path for the Contact/Support screen \ No newline at end of file + - The URL path for the Contact/Support screen + +## ErrorContextProviderProps +The `ErrorContextProvider` manages the state of the error handling. It is a React Context Provider that is embedded into the entire authentication workflow. It is responsible for managing the state of the error handling and providing the necessary actions to the various screens. The `ErrorContextProviderProps` type is used to configure the `ErrorContextProvider`. + +### Type Declaration +- **mode**: (default: "dialog") _`"dialog" | "message-box" | "none"`_ + - The mode to use for displaying errors. If set to "dialog", errors will be displayed in a dialog. If set to "message-box", errors will be displayed in a message box. If set to "none", errors will not be displayed. +- **onClose**: (optional) _`() => void`_ + - A function that is called when the error dialog is closed. +- **dialogConfig**: (optional) _`{ title?: string, dismissLabel?: string }`_ + - An optional object that is used to configure the error dialog. See [DialogConfig](#dialogconfig) for more information. +- **messageBoxConfig**: (optional) _`{ dismissible?: boolean, position?: "top" | "bottom", fontColor?: string, backgroundColor?: string, sx?: SxProps }`_ + - An optional object that is used to configure the error message box. See [MessageBoxConfig](#messageboxconfig) for more information. + +## DialogConfig +Type to represent the customizable configuration of the error dialog. + +### Type Declaration +- **title**: (optional) _`string`_ + - The title to display in the error dialog. +- **dismissLabel**: (optional) _`string`_ + - The label to display on the dismiss button in the error dialog. + +## MessageBoxConfig +Type to represent the customizable configuration of the error message box. + +### Type Declaration +- **dismissible**: (default: true) _`boolean`_ + - Determines if the error message box can be dismissed. +- **position**: (default: "top") _`"top" | "bottom"`_ + - Determines if the error message box should be displayed at the top or bottom of the screen. +- **fontColor**: (default: "#ffffff") _`string`_ + - The font color to use for the error message box. +- **backgroundColor**: (default: theme.palette.error.main) _`string`_ + - The background color to use for the error message box. + +## Components + +Exported components that can be used to customize the auth workflow. + +- [BasicDialog](./components/basic-dialog.md) +- [ChangePasswordDialog](./components/change-password-dialog.md) +- [ErrorManager](./components/error-manager.md) +- [PasswordTextField](./components/password-text-field.md) +- [RegistrationWorkflow](./components/registration-workflow.md) +- [SetPassword](./components/set-password.md) +- [WorkflowCard](./components/workflow-card.md) +## Screens + +Exported screens that can be used to customize the auth workflow. + +- [AccountDetailsScreen](./screens/account-details.md) +- [ContactScreen](./screens/contact.md) +- [CreateAccountScreen](./screens/create-account.md) +- [CreatePasswordScreen](./screens/create-password.md) +- [EulaScreen](./screens/eula.md) +- [ForgotPasswordScreen](./screens/forgot-password.md) +- [LoginScreen](./screens/login.md) +- [ResetPasswordScreen](./screens/reset-password.md) +- [SuccessScreen](./screens/success.md) +- [VerifyCodeScreen](./screens/verify-code.md) \ No newline at end of file diff --git a/login-workflow/docs/authentication-workflow.md b/login-workflow/docs/authentication-workflow.md new file mode 100644 index 00000000..cbb7e3ab --- /dev/null +++ b/login-workflow/docs/authentication-workflow.md @@ -0,0 +1,101 @@ +# Login / Authentication Workflow Guide + +The authentication workflow includes screens related to user authentication including Login, Forgot Password, Reset Password, etc. + + +## AuthContextProvider + +The screens in this workflow access shared data / configuration / API definitions through an `AuthContextProvider` which should wrap all of the relevant routes / screens. + +You must supply the `AuthContextProvider` with the following props / data: +- `actions`: defines the API calls / functions to execute when certain actions are performed in the UI (such as pressing the Login button) +- `language`: configures the language displayed on the screens +- `navigate`: a function that can be called to navigate to a new route +- `routeConfig`: an object describing the URLs you are using for the relevant routes so the workflow can correctly navigate between screens + +More information about the required and optional props can found in the [API](#api) section. + +## Implement AuthUIActions + +Because this workflow package is back-end agnostic, you must provide an implementation for what happens when the user triggers certain behaviors in the UI. + +The example project includes a skeleton implementation of all required functions using mocks / sleeps. You will need to replace these implementations with appropriate calls to your APIs, caching the returned data, etc. depending on the requirements of your application. + +1. Create a `AuthUIActions.ts` file + - This file will handle the implementation of the authentication related actions (such as login and forgot password). + - You can copy this file directly from the [example](../example/src/actions/AuthUIActions.tsx) project as a starting point and then update the implementation details if you choose. +2. You might also want to copy over the `example/src/store` and `example/src/constants` folders, which provide a very basic mechanism for storing important data using LocalStorage + - You will want to switch this out for a more secure approach before going to production with your application. + +## Example + +Here is an example of how you would set up the Login workflow using our recommended routing solution ([React Router](https://reactrouter.com/)). + +Each feature/screen from the Auth Workflow that you wish to use should be rendered on a separate route. + +```tsx + + {/* Wrap all routes in a single shared AuthContextProvider */} + + + + } + > + {/* Routes for each workflow screen you want to include */} + + + + + + ... + +``` + +For a detailed explanation of setting up routes, see the [Routing](./routing.md) guide. + +## API + +### AuthContextProviderProps + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| actions* | `AuthUIActions` | An object of functions that are used to manage the authentication workflow. See [AuthUIActions](#authuiactions) for more information | | +| language* | `string` | The language code specifying which language to use for the UI | `'en'` | +| navigate* | `(url: string) => void` | A function that is used to navigate to a new URL. This is used to navigate to the various screens of the authentication workflow. | | +| routeConfig* | `RouteConfig` | An object that defines the various routes for the authentication workflow. See [RouteConfig](#routeconfig) for more information. | | +| i18n | `i18n` | An optional i18n object that is used to translate the UI. This is only needed if you want to use custom translation keys / languages inside any of the workflow screens | | +| rememberMeDetails | `{ email?: string, rememberMe?: boolean }` | An optional object that is used to initialize the data on the Login screen. If not provided, the email field will be empty and the remember me checkbox will be unchecked. | | +| errorConfig | `ErrorContextProviderProps` | An object that is used to configure error handling within the workflow. See [Error Management](./error-management.md) for more information. | | + + +### AuthUIActions + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| initiateSecurity | `() => Promise` | This function will be called when the AuthContext is first loaded. It's an opportunity for you to initialize the security state of the application. | | +| logIn | `(email: string, password: string, rememberMe: boolean) => Promise` | A function that is used to log in a user. This function will be called when the user clicks the Login button on the Login screen. | | +| forgotPassword | `(email: string) => Promise` | A function that is used to request a password reset code. This function will be called when the user clicks the Next button on the Forgot Password screen. | | +| verifyResetCode | `(code: string, email?: string) => Promise` | This function is called on the ResetPassword screen to validate the code passed in the URL | | +| setPassword | `(code: string, password: string, email?: string) => Promise` | A function that is used to set a new password. This function will be called when the user clicks the Next button on the Reset Password screen. | | +| changePassword | `(oldPassword: string, newPassword: string) => Promise` | A function that is used to change a user's password. This function will be called when the user clicks the Next button in the Change Password dialog. | | + +### RouteConfig Object + +The RouteConfig is an object that specifies the paths you are using for the routes / screens in your application to facilitate navigating between screens within the workflows. + +| Key | Type | Description | Default | +|---|---|---|---| +| LOGIN | `string` | The URL path for the Login screen | | +| FORGOT_PASSWORD | `string` | The URL path for the Forgot Password screen | | +| RESET_PASSWORD | `string` | The URL path for the Reset Password screen | | +| REGISTER_INVITE | `string` | The URL path for the invitation-based registration workflow | | +| REGISTER_SELF | `string` | The URL path for the self-registration workflow | | +| SUPPORT | `string` | The URL path for the Contact/Support screen | | \ No newline at end of file diff --git a/login-workflow/docs/components/README.md b/login-workflow/docs/components/README.md new file mode 100644 index 00000000..2e114191 --- /dev/null +++ b/login-workflow/docs/components/README.md @@ -0,0 +1,22 @@ +# Components + +There are a number of additional components that are exported by this workflow package, including Core components and Utility components. + +## Core Components + +Core components provide core functionality related to the workflows in this package. It's expected that you will use them in most cases. + +- [RegistrationWorkflow](./registration-workflow.md) +- [ChangePasswordDialog](./change-password-dialog.md) + +## Utility Components + +These utility components are used as sub-components to build some of our other screens and components. If you have a need for them elsewhere in your application, we export them for your convenience. These are most useful if you are creating custom screens to inject into the Registration Workflow. + + +- [BasicDialog](./basic-dialog.md) +- [ErrorManager](./error-manager.md) +- [PasswordTextField](./password-text-field.md) +- [SetPassword](./set-password.md) +- [WorkflowCard*](./workflow-card.md) + \ No newline at end of file diff --git a/login-workflow/docs/components/basic-dialog.md b/login-workflow/docs/components/basic-dialog.md new file mode 100644 index 00000000..bd3facba --- /dev/null +++ b/login-workflow/docs/components/basic-dialog.md @@ -0,0 +1,29 @@ +# BasicDialog + +Component that renders a basic dialog. This component provides a title, a body, and a close button. + +## Usage + +```tsx +import { BasicDialog } from '@brightlayer-ui/react-auth-workflow'; + +... + + console.log('close')} +/> +``` + +## API + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| open | `boolean` | Whether the dialog is open. | | +| title | `string` | The title to display in the dialog. | | +| body | `string` | The content to display in the body of the dialog | | +| onClose | `() => void` | A function that is called when the close button is clicked. | | +| dismissButtonText | `string` | The text to display in the close button. | `'Okay'` | + +Props from the underlying MUI [Dialog](https://mui.com/material-ui/react-dialog/) are also available. \ No newline at end of file diff --git a/login-workflow/docs/components/change-password-dialog.md b/login-workflow/docs/components/change-password-dialog.md new file mode 100644 index 00000000..81bf494b --- /dev/null +++ b/login-workflow/docs/components/change-password-dialog.md @@ -0,0 +1,52 @@ +# ChangePasswordDialog + +This component provides a form to enter the user's current password and a new password. The dialog will display an error if the new password does not meet the password requirements. This component must be used within an `AuthContextProvider`. + +![Change Password Dialog](../../media/screens/change-password.png) + +## Usage + +```tsx +import { AuthContextProvider, ChangePasswordDialog } from '@brightlayer-ui/react-auth-workflow'; + +... + + + +``` + +## API + +| Prop Name | Type | Description | Default | +| ----------------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | +| PasswordProps | `SetPasswordProps` | See [Set Password](./set-password.md) | | +| ErrorDialogProps | `BasicDialogProps` | Props to configure a nested error dialog if there are errors changing the password. See [Basic Dialog](./basic-dialog.md). | | +| dialogTitle | `string` | The title to display in the dialog. | `t('bluiAuth:CHANGE_PASSWORD_DIALOG.TITLE')` | +| dialogDescription | `string` | The description to display in the dialog. | `t('bluiAuth:CHANGE_PASSWORD_DIALOG.DESCRIPTION')` | +| currentPasswordLabel | `string` | The label to display for the current password field. | `t('bluiAuth:CHANGE_PASSWORD_DIALOG.CURRENT_PASSWORD_LABEL')` | +| previousLabel | `string` | The label to display for the previous/cancel button. | `t('bluiCommon:ACTIONS.BACK')` | +| nextLabel | `string` | The label to display for the next button. | `t('bluiCommon:ACTIONS.OKAY')` | +| currentPasswordChange | `(currentPassword: string) => void` | Callback called when the current password field input changes. | | +| enableButton | `boolean \| (() => boolean)` | True if the next button should be enabled. | `false` | +| onFinish | `() => void` | Called when the button is clicked on success screen. | | +| onSubmit | `() => void \| Promise` | Called when the next button is clicked. | | +| onPrevious | `() => void` | Callback called when the previous/back/cancel button is clicked. | | +| loading | `boolean` | Whether or not the dialog is loading. | | +| currentPasswordTextFieldProps | `TextFieldProps` | Props to pass to the current password input field. See MUI's [TextFieldProps API](https://mui.com/material-ui/api/text-field/). | | +| showSuccessScreen | `boolean` | Used to determine whether to show a success screen after the form is submitted. | | +| slots | `ChangePasswordDialogSlots` | Components to use in place of the defaults. See [ChangePasswordDialogSlots](#changepassworddialogslots) | | +| slotProps | `ChangePasswordDialogSlotsProps` | Props to pass to the custom slot components. See [ChangePasswordDialogSlotsProps](#changepassworddialogslotsprops) | | + +### ChangePasswordDialogSlots + +| Key | Type | Description | +| ------------- | -------------------------------------------- | ------------------------------------------------------------------------------ | +| SuccessScreen | `(props: SuccessScreenProps) => JSX.Element` | A custom success screen component to render. See [SuccessScreen](../screens/success.md) | + +### ChangePasswordDialogSlotsProps + +| Key | Type | Description | +| ------------- | -------------------- | --------------------------------------------------------------------------------------- | +| SuccessScreen | `SuccessScreenProps` | Props to pass to the custom success screen component. See [SuccessScreen](../screens/success.md) | + +Props from the underlying MUI [Dialog](https://mui.com/material-ui/react-dialog/) are also available. diff --git a/login-workflow/docs/components/error-manager.md b/login-workflow/docs/components/error-manager.md new file mode 100644 index 00000000..8e0dbf18 --- /dev/null +++ b/login-workflow/docs/components/error-manager.md @@ -0,0 +1,47 @@ +# ErrorManager + +Component that manages the display of error messages. Can be configured to display a dialog, a message box, or neither. This component must be used within an `AuthContextProvider` or a `RegistrationContextProvider` for default values to work. + +![Error Dialog](../../media/screens/error-dialog.png) +![Error Box](../../media/screens/error-box.png) + +## Usage +```tsx +import { ErrorManager } from '@brightlayer-ui/react-auth-workflow'; + +... + + + {/* When configured as a message-box, the box will appear before or after the elements passed as children */} + {children} + +``` + +## API + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| error | `string` | Error text to display. If string is empty, the error will not be shown. | | +| mode | `'dialog' \| 'message-box' \| 'none'` | Determines whether to display a dialog, a message box, or neither. | `'dialog'` | +| onClose | `() => void` | Function to call when the close/dismiss button is clicked. | | +| dialogConfig | `{title?: string, dismissLabel?: string}` | Configuration options for the dialog. See [DialogConfig Props](#dialogconfigprops) | | +| messageBoxConfig | `MessageBoxProps` | Configuration options for the message box. See [MessageBoxProps](#messageboxprops) | | +| children | `ReactNode` | Message box errors will appear before or after content passed as children. | | + +### DialogConfigProps + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| title | `string` | Text to show in the title of the dialog. | `t('bluiCommon:ERRORS.ERROR')` | +| dismissLabel | `string` | Label to show in the close button. | `t('bluiCommon:ACTIONS.CLOSE')` | + + +### MessageBoxProps + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| dismissible | `boolean` | Whether the message box can be dismissed. | `true` | +| position | `'top' \| 'bottom'` | Determines whether the message box should be displayed before or after children elements. | `'top'` | +| fontColor | `string` | The font color of the text inside the message box. | `'error.contrastText'` | +| backgroundColor | `string` | The background color of the message box. | `'error.main` | +| sx | `SxProps` | MUI sx style overrides object | | diff --git a/login-workflow/docs/components/password-text-field.md b/login-workflow/docs/components/password-text-field.md new file mode 100644 index 00000000..37f67a00 --- /dev/null +++ b/login-workflow/docs/components/password-text-field.md @@ -0,0 +1,20 @@ +# PasswordTextField + +Component that renders a text field with a visibility toggle. + +![Password Field](../../media/screens/password-field.png) + +## Usage + +```tsx +import { PasswordTextField } from '@brightlayer-ui/react-auth-workflow'; + +... + + +``` + +## API + +See MUI [TextFieldProps](https://mui.com/components/text-fields/). + diff --git a/login-workflow/docs/components/registration-workflow.md b/login-workflow/docs/components/registration-workflow.md new file mode 100644 index 00000000..9eba9dc2 --- /dev/null +++ b/login-workflow/docs/components/registration-workflow.md @@ -0,0 +1,29 @@ +# RegistrationWorkflow + +A multi-step registration workflow that guides a user through the process of registering a new account. The RegistrationWorkflow must be used within a `RegistrationContextProvider` . + +## Usage + +```tsx +import { RegistrationWorkflow } from '@brightlayer-ui/react-auth-workflow'; + +... + +// Default appearance and behaviors + + +// If you want to customize the workflow in any way, you must pass children + + {/* your registration screens here */} + +``` + +## API + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| initialScreenIndex | `number` | The initial screen index to start the registration workflow from. | `0` | +| successScreen | `JSX.Element` | Success screen to render when a new account is successfully created | | +| existingAccountSuccessScreen | `JSX.Element` | Success screen to render when an existing account is successfully registered | | +| isInviteRegistration | `boolean` | Indicated whether this workflow is for invitation-based registration. If true, several of the default screens will be skipped | `false` | +| children | `ReactNode[]` | The screens to render within the registration workflow (only required if you are making customizations) | Eula, CreateAccount, VerifyCode, CreatePassword, AccountDetails | diff --git a/login-workflow/docs/components/set-password.md b/login-workflow/docs/components/set-password.md new file mode 100644 index 00000000..092ef873 --- /dev/null +++ b/login-workflow/docs/components/set-password.md @@ -0,0 +1,39 @@ +# SetPassword + +Component that renders a change password form with a new password and confirm password inputs. It includes callbacks so you can respond to changes in the inputs. + +![Set Password](../../media/screens/set-password.png) + +## Usage + +```tsx +import { SetPassword } from '@brightlayer-ui/react-auth-workflow'; + +... + + +``` + +## API + +| Prop Name | Type | Description | Default | +| ----------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------- | ------- | +| onPasswordChange | `(passwords: { password: string; confirm: string }) => void` | Called when the new password or confirm new password fields value changes. | | +| newPasswordLabel | `string` | The label for the new password field. | | +| initialNewPasswordValue | `string` | The initial value for the new password field. | | +| confirmPasswordLabel | `string` | The label for the confirm password field. | | +| initialConfirmPasswordValue | `string` | The initial value for the confirm password field. | | +| passwordRequirements | `PasswordRequirement[]` | An array of password complexity requirements . See [PasswordRequirements](#PasswordRequirements) for more details. | | +| passwordRef | `MutableRefObject` | Optional ref to forward to the password input. | | +| confirmRef | `MutableRefObject` | Optional ref to forward to the confirm password input. | | +| passwordNotMatchError | `string` | Optional text for showing message when passwords not match. | | +| onSubmit | `() => void` | Callback function to fire when the Enter key is pressed in the confirm field. | | +| passwordTextFieldProps | `TextFieldProps` | Props to pass to the password input field. See MUI's [TextFieldProps API](https://mui.com/material-ui/api/text-field/). | | +| confirmPasswordTextFieldProps | `TextFieldProps` | Props to pass to the confirm password input field. See MUI's [TextFieldProps API](https://mui.com/material-ui/api/text-field/). | | + +### PasswordRequirements + +| Prop Name | Type | Description | Default | +| ----------- | -------- | --------------------------------------------------------- | ------- | +| description | `string` | The text description / label of the password requirement. | | +| regex | `RegExp` | The regex to compare the password against. | | diff --git a/login-workflow/docs/components/workflow-card.md b/login-workflow/docs/components/workflow-card.md new file mode 100644 index 00000000..5cca3fb5 --- /dev/null +++ b/login-workflow/docs/components/workflow-card.md @@ -0,0 +1,74 @@ +# WorkflowCard + +The WorkflowCard is a set of components that can be used to define custom screens within the workflows. Using these utility components will ensure that your custom screens match the style of the built-in screens for a seamless experience. + +![Workflow Card](../../media/screens/workflow-card.png) + +## Usage +```tsx +import { WorkflowCard, WorkflowCardHeader, WorkflowCardBody, WorkflowCardInstructions, WorkflowCardActions } from '@brightlayer-ui/react-auth-workflow'; + + + + + + {/* Your Screen Contents */} + + + +``` + +## API + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| WorkflowCardBaseProps | `WorkflowCardBaseProps` | See [WorkflowCardBase](#workflowcardbaseprops) for more details. | | +| WorkflowCardHeaderProps | `WorkflowCardHeaderProps` | See [WorkflowCardHeader](#workflowcardheader) for more details. | | +| WorkflowCardInstructionProps | `WorkflowCardInstructionProps` | See [WorkflowCardInstructions](#workflowcardinstructions) for more details. | | +| WorkflowCardActionsProps | `WorkflowCardActionsProps` | See [WorkflowCardActions](#workflowcardactions) for more details. | | + +### WorkflowCardBaseProps + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| loading | `boolean` | A boolean that indicates whether the loading spinner should be displayed. | `false` | +| backgroundImage | `string` | The background image to display behind the card. | | + +The properties of the underlying MUI [Box](https://mui.com/components/box/) component are also available. + +### WorkflowCardHeader + +See MUI [CardHeaderProps](https://mui.com/components/cards/#cardheader) for more details. + +### WorkflowCardBody + +This component is a simple wrapper that is used for layout. Instructions and your main screen contents should be children of this component. + +### WorkflowCardInstructions +| Prop Name | Type | Description | Default | +|---|---|---|---| +| instructions | `string \| JSX.Element` | The instructions to display in the card. | | +| divider | `boolean` | If true, a dividing line will be displayed below the instruction text | `true` | + +The properties of the underlying MUI [Typography](https://mui.com/components/typography/) component are also available. + +### WorkflowCardActions + +The WorkflowCardActions is used to configure the buttons that appear at the bottom of the card. + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| divider | `boolean` | If true, a dividing line will be displayed above the button panel | `true` | +| showPrevious | `boolean` | Indicates whether the previous button should be displayed | `true` | +| canGoPrevious | `boolean \| (() => boolean)` | A boolean or function that indicates whether the previous button should be enabled. | `true` | +| previousLabel | `string` | The label on the previous button | | +| onPrevious | `() => void` | A function that is called when the previous button is clicked. | | +| showNext | `boolean` | Indicates whether the next button should be displayed | `true` | +| canGoNext | `boolean \| (() => boolean)` | A boolean or function that indicates whether the next button should be enabled. | `true` | +| nextLabel | `string` | The label on the next button | | +| onNext | `() => void` | A function that is called when the next button is clicked. | | +| currentStep | `number` | Indicates the current step in a multi-step workflow | `0` | +| totalSteps | `number` | Indicates the total number of steps in the multi-step workflow | `0` | +| fullWidthButton | `boolean` | If true, buttons will expand to the full width of the panel (useful if you only have one button configured) | `false` | + +The properties of the underlying MUI [CardActions](https://mui.com/material-ui/api/card-actions/) component are also available. \ No newline at end of file diff --git a/login-workflow/docs/customization.md b/login-workflow/docs/customization.md index beb84ee0..eb224f79 100644 --- a/login-workflow/docs/customization.md +++ b/login-workflow/docs/customization.md @@ -1,119 +1,100 @@ -# Customizing the Workflow +# Customization Guide -## Login Screen +These workflows are designed to work out of the box without any additional configuration. However, we understand that you may need to customize certain aspects of the workflows to meet your needs. This guide will walk you through the various ways you can customize the workflow. -The Login screen supports some simple customization (via the `AuthUIContextProvider`) to suit the needs of your application. +## Customizing Screens -- You can pass in a custom header that will appear above the login form using the `loginHeader` prop. By default, we render your `productImage`. -- You can pass in a custom footer that will appear below the login form and registration links with any content you like (such as links to Privacy Policy, Terms of Service, etc.) using the `loginFooter` prop. -- You can customize the background of the workflow using the `background` prop including the color, tile image, etc. -- You can disable and hide various aspects of the workflow using the following props: `enableInviteRegistration`, `enableResetPassword`, `showContactSupport`, `showCybersecurityBadge`, `showRememberMe`, `showSelfRegistration`. +All of the screens in the workflow support various levels of customization. Refer to the [Screens](./screens/README.md) documentation for specific options available on each screen. -For more details, read the [full API details](https://github.com/brightlayer-ui/react-auth-shared/tree/master/docs/API.md). -## Additional Routes +## Customizing Registration Workflow -The authentication workflow hides your application content behind a private routing mechanism that does not allow unauthenticated users to access any parts of the application. - -If there are routes that you would like to be available without logging in (such as a Terms of Service page), you need to provide these to the `AuthNavigationContainer` through the `extraRoutes` property. The content passed in here will be publicly accessible. +The Registration is provided as a single component that will provide the default behavior without requiring any configuration or props. ```tsx -{/* Route Content */}, - {/* Route Content */}, - ]} - routeConfig={{ SUPPORT: '/custom-support-url' }} -> - - +// default appearance / behavior + ``` -You can also customize the URL used for the default routes by passing a configuration object to the `routeConfig` prop. - -For more details, read the [full API details](https://github.com/brightlayer-ui/react-auth-shared/tree/master/docs/API.md). - -## Registration Details - -By default, the user registration piece of the workflow will capture the minimum information that is required (i.e., First Name, Last Name, and email address). - -Many applications will need to collect additional information about their users during registration. This can be achieved by passing in additional form components to the `AuthUIContextProvider` via the `customAccountDetails` prop. - -### Syntax - -The `customAccountDetails` prop takes an array of `CustomRegistrationForm`s describing components that you would like to insert into the registration flow (title, instructions, and form component). - -The first form in the array will render below the default fields (first and last name). Subsequent forms will be rendered on new pages (one page per item in the array). If you do not want to render your custom elements below the default fields, you can pass `null` as the first item in the array. +If you wish to customize any aspects of the workflow screens, you will need to provide them as children in order to access their screen-level props. ```tsx -import { CustomDetailsScreen, CustomDetailsScreenTwo } from './path/to/file'; -... - + + + + + + + ``` -### Form Implementation +### Customizing the Screen Order -In order to work correctly, custom form components that you pass into the workflow must match the interface `ComponentType`, meaning your component must accept and hook up the following three props: - -- `initialDetails` (_`CustomAccountDetails`_): this is an object of key-value pairs representing the custom data that your form captures. Each key is the name of one of your custom properties and the value is the value of that property. You must use these values to initialize your form fields on render. -- `onDetailsChanged` (_`(details: CustomAccountDetails | null, valid: boolean) => void`_): this is a callback function that you must call whenever any of your custom properties change. You must include all your custom properties in the details object, even if some of them are unchanged. You must also include a `valid` argument that indicate whether the current values pass your required validation checks (if all fields are optional, you can simply pass `true`). -- `onSubmit` (_`() => void`_): this function should be called when a user presses the Enter key in the final input of your custom form. This will trigger the workflow to progress to the next page without having to manually click the button. +When passing children to the `RegistrationWorkflow` component, you can easily adjust the order of screens by simply placing them in the order you wish for them to appear. + +```tsx + + {/* Create Account screen will now come before the Eula screen */} + + + + + + +``` -You can see a sample implementation of the custom details forms in the `/example` project. +### Removing / Injecting Screens -> **NOTE:** If you are using a useEffect hook to call the `onDetailsChanged` function, you must make sure NOT to include the `onDetailsChanged` prop in your list of dependencies. This will cause an infinite update loop. +If you want to skip a particular screen in the workflow, simply omit it in the list of children. Likewise, if you wish to add your own custom screens into the workflow, you simply pass them as another child element. -### Custom Registration Success Screen +When passing custom children, it is important to match the look and feel of the other steps in the workflow. In order to support this, we provide several WorkflowCard components that you can use to create your custom screens. For more information on how to use these components, refer to our [WorkflowCard](./components/workflow-card.md) component documentation. -You can customize the success screen shown at the end of the Registration flows using the `registrationSuccessScreen` prop on the `AuthUIContextProvider`. This prop gives you access to a `registrationData` object that contains a user's `AccountDetailInformation` and email: +Your custom implementation, removing the EulaScreen and VerifyCodeScreen, and adding a custom screen, might look like this: -```tsx -registrationSuccessScreen={(registrationData) => +```jsx + + + + + {/* Skip the Create Password scree */} + {/* */} + + {/* Add a custom screen to collect more information */} + + ``` -#### Account Already Exists - -In the case when a user already has an existing account, a separate success screen is shown. You can customize this screen in the same way using the `accountAlreadyExistsScreen` prop on the `AuthUIContextProvider`. +### Customizing the Success Screen +You may provide a custom success screen to be shown upon successful completion of the [Registration Workflow](./components/registration-workflow.md). The [Success Screen](./screens/success.md) is used by default, but may be customized via props. If you wish to build your own success screen it may look something like this: -```tsx -accountAlreadyExistsScreen={() => } -``` +```jsx +import { SuccessScreenBase } from '@brightlayer-ui/react-auth-workflow'; -#### Error Message Display Options +const MyCustomSuccessScreen = () => { + return ( + + ); +}; -You can customize how login error messages are displayed using the `loginErrorDisplayConfig` prop on the `AuthUIContextProvider`. To show an error message you must throw an error with your message in the login function of `AuthUIActions`. Messages can be displayed in a dialog (default) or a message-box. - -If there is an error with credentials (i.e., wrong email or password), you should throw the `'LOGIN.INVALID_CREDENTIALS'` which will show input errors below those fields (this is the only error that should ever be shown in this style): +} /> +``` -![default login error display](https://raw.githubusercontent.com/brightlayer-ui/react-workflows/master/login-workflow/media/default-login-error.png) +A similar prop exists for `existingAccountSuccessScreen` which will be used if the account being registered already exists. -##### Usage -```diff - -``` +## Customizing the Language Support -```diff -// AuthUIActions.tsx +For information about supporting multiple languages and customizing the translations, refer to our [Language Support](./language-support.md) guidelines. -logIn: async (email: string, password: string, rememberMe: boolean): Promise => { - ... - // example app default -+ throw new Error('LOGIN.INVALID_CREDENTIALS'); +## Customizing Error Handling - // custom error message -+ throw new Error('My Custom Login Error'); - ... +For information about handling errors in your application, refer to our [Error Management](./error-management.md) documentation. -}, -``` +## Components +For more details on customizing our components, refer to our [Components](./components/README.md) documentation. -For more details, read the [full API details](https://github.com/brightlayer-ui/react-auth-shared/blob/master/docs/API.md#loginerrordisplayconfig) +## Screens +For more details on customizing our screens, refer to our [Screens](./screens/README.md) documentation. \ No newline at end of file diff --git a/login-workflow/docs/error-management.md b/login-workflow/docs/error-management.md new file mode 100644 index 00000000..22a9b434 --- /dev/null +++ b/login-workflow/docs/error-management.md @@ -0,0 +1,84 @@ +# Error Management + +There are points throughout the workflow where a user may encounter errors, particularly when making calls to your back-end / API. There are a number of ways that you can control / configure how errors are presented throughout the UI. + +## TextField Validator Errors + +Text fields within the workflow have built in validator methods that you can customize. For more information on each screens validator functions, read our [Screens](./screens/README.md) documentation. + +Text field validator props accept a function. We pass the current value of the field as an argument and you should return a boolean value (true if there is no error) or string (for a custom message). When a text field has a validator error (i.e., the input is not valid), the error message that you returned in the validator function will be displayed below the input (if you return false, the text field will be rendered in an error state but no message will be displayed). + +### Example + +As an example, if you wanted to change what is accepted as a valid username on the Login screen (default is any valid email address), you can do so as follows: + +```tsx + +// accept ONLY @eaton.com email addresses +const EMAIL_REGEX = /^[A-Z0-9._%+'-]+@eaton\.com$/i; +... + + ( + !EMAIL_REGEX.test(username) ? 'You must use your Eaton email address' : true + ) + )} +/> +``` + +## API Errors + +For API-related errors, we have implemented a common `ErrorManager` component that manages the display of error messages across screens. It can be customized to present API errors in a Dialog (default) or in a Message Box. For full details, read the [ErrorManager](./components/error-manager.md) API docs. + +To trigger the ErrorManager to display an error, you need to throw an error in your AuthUIAction or RegistrationUIAction function. + +```tsx +// throw a basic error +throw new Error('My Custom Error'); + +// customize the title via the cause property +throw new Error('My Custom Error', { + cause: { + title: 'Custom Title', + errorMessage: 'My custom error message', + }, +}); +``` + +### Global Configuration + +You can customize how errors are displayed throughout the entire workflow by passing an `errorConfig` prop to the `AuthContextProvider` and / or `RegistrationContextProvider`. This will change the default used by all of the screens nested under the provider. + +```tsx + +``` + +### Local Configuration + +You can configure how errors are rendered on each individual screen by adding an `errorConfig` prop directly on a screen component (e.g., if you want to show errors differently on the login screen vs. in the registration workflow). + +```tsx + +``` + + diff --git a/login-workflow/docs/existing-project-integration.md b/login-workflow/docs/existing-project-integration.md deleted file mode 100644 index a026ad9d..00000000 --- a/login-workflow/docs/existing-project-integration.md +++ /dev/null @@ -1,142 +0,0 @@ -# Integrating Into an Existing Project - -To start integrating this package into an existing application, you must first have an application. We recommend using the [Brightlayer UI CLI](https://www.npmjs.com/package/@brightlayer-ui/cli) to initialize your project. - -#### Installation and Setup - -Once you have a project, you can install this package via: - -```shell -npm install --save @brightlayer-ui/react-auth-workflow -// or -yarn add @brightlayer-ui/react-auth-workflow -``` - -This package also has a number of peer dependency requirements that you will also need to install in your project. To install the latest version of all of these peer dependencies, run the following command in your project root: - -``` -npm install --save @mui/material @emotion/react @emotion/styled @brightlayer-ui/colors @brightlayer-ui/react-components date-fns i18next react-dom react-i18next react-router-dom -// or -yarn add @mui/material @emotion/react @emotion/styled @brightlayer-ui/colors @brightlayer-ui/react-components date-fns i18next react-dom react-i18next react-router-dom -``` - -#### Implement AuthUIActions and RegistrationUIActions - -You need to implement the backend networking for all networking within react-auth-workflow. Your implementation will likely involve writing calls to your APIs and caching the returned data, as needed, depending on the requirements of your application. The example application has these actions mocked with calls to `sleep` . - -1. Create a `/src` folder in your application if it does not already exist -2. Add an `/actions` folder inside the `src` directory. -3. Create two files in the new `actions` directory: `AuthUIActions.tsx` and `RegistrationUIActions.tsx` - - The first file you created, `AuthUIActions.tsx`, will handle the implementation of the authentication related actions (such as login and forgot password). - - The second file you created, `RegistrationActions.tsx`, will handle the implementation of the registration related actions (such as loading the EULA and registration by invitation). - - You can copy these files directly from the [example](https://github.com/brightlayer-ui/react-workflows/tree/master/login-workflow/example) project as a starting point and then update the implementation details if you choose. -4. You might also want to copy over the `example/src/store` and `example/src/constants` folders from react-auth-workflow for the purposes of compiling with the mock `AuthUIActions` and `RegistrationUIActions` before you write your own implementation. These sample implementations make use of the browser LocalStorage, but you may want to use a different approach in order to follow best practices for cybersecurity. -5. Import the actions in your root app file (usually App.tsx): - -``` -import { ProjectAuthUIActions } from './src/actions/AuthUIActions'; -import { ProjectRegistrationUIActions } from './src/actions/RegistrationUIActions'; -``` - -#### Setting Up the Application Structure - -1. In the root app file (generally App.tsx), add the following imports to the top of the file: - -```tsx -import { - SecurityContextProvider, - AuthNavigationContainer, - AuthUIContextProvider, - useSecurityActions, -} from '@brightlayer-ui/react-auth-workflow'; -``` - -2. Inside your root export, wrap your entire application as follows, where `YourRoutingSetup` is your existing app structure XML (this must be nested under a `` element at the top level in order to work with React Router v6 — see below) . If you used the Brightlayer UI CLI to create your project, the `ThemeProvider` should already be configured. If you didn't, you can skip those wrappers or follow the manual [integration instructions](https://brightlayer-ui.github.io/development/frameworks-web/react): - -```tsx - - - - - - {YourRoutingSetup} <--- Your app content - - - - -``` - -#### Configuring Your Routes - -`YourRoutingSetup` must be a collection of `` elements that define the route structure for your main application, e.g.,: - -```tsx - - <> - } /> - } /> - } /> - {/* Redirect any other routes to home page */} - } /> - - -``` - -If you prefer to define your routes in a separate file or you want to have shared layout elements that wrap all of your routes, you can do this by specifying a single all-encompassing route and passing the rest of your routing config as children, e.g.,: - -```tsx -// The main application routes — can be defined elsewhere or in separate files -const AppRoutes = ( - <> - - - {/* ...etc */} - -); - -// layout or wrapper element(s) shared by all routes -const SharedLayoutWrapper = () => ( - - - {/* application routes will get rendered here */} - -); - -... - - - } > - {AppRoutes} - - -``` - -#### Configure AuthUIContextProvider - -Create a functional component in your root app file that configures the options for the React Auth Workflow package. The component definition should look something like this: - -```tsx -export const AuthUIConfiguration = (props) => { - const securityContextActions = useSecurityActions(); - return ( - - {props.children} - - ); -}; -``` - -You can skip passing the `projectImage` property if you don't have one yet. - -You can read more about customizing the `AuthUIContextProvider` in the [Customization Guide](https://github.com/brightlayer-ui/react-workflows/tree/master/login-workflow/docs/customization.md) - -The various configuration options are explained in more detail in the [API](https://github.com/brightlayer-ui/react-workflows/tree/master/login-workflow/docs/API.md) documentation. diff --git a/login-workflow/docs/integration.md b/login-workflow/docs/integration.md new file mode 100644 index 00000000..646807f8 --- /dev/null +++ b/login-workflow/docs/integration.md @@ -0,0 +1,9 @@ +# Integrating the Package + +This package includes workflows for authentication-related screens and registration-related screens which can be used either separately or together. + +In both cases, you will be required to set up the necessary routes in your routing provider for the screens you wish to use, wrap the route(s) in the appropriate ContextProvider, and define the API calls that will be made when certain actions are performed in the workflow screens. + +For specific details, see the dedicated guides for [Login/Authentication](./authentication-workflow.md) (includes login, forgot/reset password, etc.) and [Registration](./registration-workflow.md). + + diff --git a/login-workflow/docs/language-support.md b/login-workflow/docs/language-support.md index f07f790a..d9ea7e3a 100644 --- a/login-workflow/docs/language-support.md +++ b/login-workflow/docs/language-support.md @@ -1,84 +1,115 @@ # Language Support -This package supports translations to different languages using [i18next](https://www.i18next.com/) / [react-i18next](https://github.com/i18next/react-i18next). The workflow screens are currently available in: +This package supports translations to different languages using [i18next](https://www.i18next.com/) / [react-i18next](https://github.com/i18next/react-i18next). Out of the box, the workflow screens are available in: - English - French +- Portuguese - Spanish - Simplified Chinese -## Changing the Language - -The authentication workflow configures i18next to store the most recently used language in local storage (`blui-auth-i18nextLng`) so that when the app is loaded again, it will default to the last language used. There are three ways that you can change this stored value. - -### 1. ChangeLanguage Function (recommended) +If you wish to support additional languages, refer to the [Add Custom Language](#add-custom-languages) section below. -The i18next package provides a function you can call to change the current language: +The translation dictionary used by the workflows is independent of any translations / dictionaries used in your main application. This eliminates the possibility of your translations unintentionally overriding values that are used by the workflows screens. When setting up internationalization for your application, you can follow the instructions for [react-i18next](https://github.com/i18next/react-i18next) without worrying about the workflow screens. -```tsx -import i18n from 'i18next'; - -i18n.changeLanguage('fr'); // 'en', 'es', 'fr' -``` +## Changing the Language -### 2. Query String +The language used by the workflow screens is exclusively driven by the `language` prop passed to the `AuthContextProvider` and/or the `RegistrationContextProvider`. -If you navigate to your application URL and append the `lng` query string, the specified language will be loaded: +You can change the language used in your application in a number of different ways using react-i18next — just make sure to update the value passed into the workflows so they remain in sync. -``` -https://www.yourwebsite.com/page?lgn=fr -``` +## Using Your Translations in Workflow Screens -### 3. Local Storage +By default, the translations inside the workflow screens are isolated from the translations used for your application. If you want to override a string used for a text element on one of the screens, this can be configured by passing the appropriate prop. -You can also manually modify the value that is stored in Local Storage to edit or remove the stored value. Removing the value will tell the application to default to the browser default value. +However, because the translation providers are separate for the workflow and for the app, if you want to use one of your translation keys inside a workflow screen, you will need to pass your i18n instance to the `i18n` prop of the `AuthContextProvider` and / or `RegistrationContextProvider` so we can access your dictionary. If you do not do this, the workflow will attempt to find your application key in the workflow dictionary and it will not be found. ```tsx -localStorage.setItem('blui-auth-i18nextLng', 'fr'); -localStorage.removeItem('blui-auth-i18nextLng'); -``` - -> If you are planning to provide user-specific language settings for your application, you will be responsible for manipulating the value in localStorage in order to properly reflect a user's setting when loading the application. +// your i18n instance +import { i18nAppInstance } from './i18n'; +import { useTranslation } from 'react-i18next'; -> All applications using the @brightlayer-ui/react-auth-workflow will use the same local storage key when doing this lookup. In order to avoid possible interference with other applications, we recommend using the ChangeLanguage function (#1) instead of relying on local storage. +... -## Adding Your Own Resources +const { t } = useTranslation(); -If you intend to support multiple languages in your application, you will need to provide translations for all of the UI string resources used in your application (refer to the [documentation](https://www.i18next.com/overview/getting-started) for i18next for specific information on how to build translation files). +// WRONG + + {/* YOUR_KEY won't be found */} + + -The Auth Workflow is configured with two separate namespaces for resources: - -- The `blui` namespace contains strings that are used internally in the workflow screens -- The `app` namespace is where your app-specific UI strings are placed - -> The `app` namespace is set as the default so that you do not need to prefix any of your resource IDs. - -To load your resources into the i18next object, you can call: - -```tsx -import i18n from 'i18next'; - -i18n.addResourceBundle('en', 'app', { BUTTONLABEL: 'Change Language' }); -i18n.addResourceBundle('es', 'app', { BUTTONLABEL: '¡Cambia el idioma!' }); -i18n.addResourceBundle('fr', 'app', { BUTTONLABEL: 'Changez de Langue' }); +// RIGHT + + {/* YOUR_KEY will be found since you passed your i18n instance through props */} + + ``` -> This will need to be called before the application renders so that the strings are available. If you cannot load these before the application renders, you will need to force the app to refresh after they are loaded to pick up the values. - -### Using translations in your application - -To use the appropriate translations in your application, you can use the `t` function or `` components from [react-i18next](https://github.com/i18next/react-i18next). +## Add Custom Language -## Overriding default resources +If you would like to support a language other than the ones supported by the workflow, you can, but you will need to provide the translations for all of the strings that are needed by the workflow screens. If you do not, the workflow screens will default to showing English. -If you need to override any of the strings or translations used internally in the Auth Workflow, you can do so in a similar way by specifying the blui namespace and the appropriate resource ID: +The example below shows how to do this for a few keys, but you will need to provide all of the keys in your actual implementation (refer to the links at the bottom of the page for a list of all of the keys that must be provided). ```tsx -import i18n from 'i18next'; - -i18n.addResourceBundle('en', 'blui', { ACTIONS: { CREATE_ACCOUNT: 'Register now!' } }, true, true); -i18n.addResourceBundle('es', 'blui', { ACTIONS: { CREATE_ACCOUNT: '¡Regístrate ahora!' } }, true, true); -i18n.addResourceBundle('fr', 'blui', { ACTIONS: { CREATE_ACCOUNT: `S'inscrire maintenant!` } }, true, true); +// Auth Workflow Keys +const authWorkflowKorean = { + translation: { + SETTINGS: { + TITLE: '제목', + }, + }, +} +// Common Keys shared by Auth and Registration workflows +const commonWorkflowKorean = { + translation: { + ACTIONS: { + NEXT: '다음', + }, + }, +} +// Registration Workflow Keys +const registrationWorkflowKorean = { + translation: { + REGISTRATION: { + EULA: { + LOADING: '최종 사용자 라이선스 계약 로드 중...', + }, + }, + }, +}; + +// Create your application i18n instance +export const i18nAppInstance = i18next.createInstance( + { + ... + resources: { + ... + kr: { + // provide your app-side translation in your app namespace + app: { + ...AppDictionaries.korean.translation, + }, + // provide the custom workflow translations to the workflow namespaces + bluiAuth: { + ...authWorkflowKorean.translation, + }, + bluiRegistration: { + ...registrationWorkflowKorean.translation, + }, + bluiCommon: { + ...commonWorkflowKorean.translation, + }, + }, + }, + }, +); ``` -> For a complete list of resource IDs available, refer to the documentation for [@brightlayer-ui/react-auth-shared](https://github.com/brightlayer-ui/react-auth-shared/blob/master/src/data/translations/english.ts). +You will then need to pass this i18n instance through the `i18n` prop on the `AuthContextProvider` and / or `RegistrationContextProvider` wrappers. + +> For a complete list of resource IDs available, refer to the documentation for +[Authentication Workflow](../src/contexts/AuthContext/AuthDictionaries/english.ts). +[Registration Workflow](../src/contexts/RegistrationContext/RegistrationDictionaries/english.ts). +[Common translations](../src/contexts/SharedDictionaries/english.ts). \ No newline at end of file diff --git a/login-workflow/docs/migration-guide-3-4.md b/login-workflow/docs/migration-guide-3-4.md new file mode 100644 index 00000000..5b84486e --- /dev/null +++ b/login-workflow/docs/migration-guide-3-4.md @@ -0,0 +1,128 @@ +# Migration Guide: v3.x => v4.x + +## Update Dependencies + +First, update your @brightlayer-ui/react-auth-workflow dependency to the latest version. + +```shell +npm install --save @brightlayer-ui/react-auth-workflow@^4.0.0 +// or +yarn upgrade @brightlayer-ui/react-auth-workflow@^4.0.0 +``` + +## Managing Auth State + +In order to be more flexible / customizable, the workflow no longer manages the authentication status of the user internally. You will need to establish your own mechanism (such as using a ContextProvider or Redux) to track whether or not a user is authenticated to your application. For reference, you can look at how we set up the [AppContext](https://github.com/etn-ccis/blui-react-workflows/blob/master/login-workflow/example/src/contexts/AppContextProvider.tsx) in the example project. + +## Managing Routing + +In order to be more flexible / customizable, the workflow no longer manages routing. The `AuthNavigationContainer` has been removed and will need to be replaced by your own routing solution (we recommend React Router). Please follow our [Routing Guide](./routing.md) for detailed information on setup. + +## Managing Workflow Providers + +We previously provided a `AuthUIContextProvider` component that was used to configure / wrap both the Authentication workflow and the Registration workflow. In version 4, we have split the management of the workflows so that they can be used independently. You will need to implement the [`AuthContextProvider`](authentication-workflow.md) and [`RegistrationContextProvider`](./registration-workflow.md) instead. + +## Managing Translations / Internationalization + +You no longer need to merge your apps translation data into the workflow — they an exist independently for the sake of simplifying your setup. If you aren't already, you will need to set up [react-i18next](https://react.i18next.com/) to manage your application side translations. Refer to our [Language Support](./language-support.md) guide for more information. + +## Updated Actions + +### AuthUIActions + +The `SecurityContextActions` no longer exist in the newest version and so they will not be available to your action definitions (i.e., `onUserAuthenticated` and `onUserNotAuthenticated` are no longer available). You will need to pass your own self-managed auth state/functions and use those instead (refer to above). + +## RegistrationUIActions + +1. Update type name `AccountDetailInformation` to `AccountDetails`. + +```tsx +// before +import { RegistrationUIActions, AccountDetailInformation } from '@brightlayer-ui/react-auth-workflow'; +// after +import { RegistrationUIActions, AccountDetails } from '@brightlayer-ui/react-auth-workflow'; +``` + +2. LoadEULA renamed to loadEula + +```tsx +// before +loadEULA: async (language: string): Promise => { + ... + return SAMPLE_EULA; +}, + +// after +loadEula: async (language: string): Promise => { + ... + return SAMPLE_EULA; +}, +``` + +3. Additional data available in completeRegistration + +The `userData` parameter will now pass all data collected from the registration workflow, including custom data. + +The `validationCode` parameter now supports numbers or string. + +```tsx +// before +completeRegistration: async ( + userData: { + password: string; + accountDetails: AccountDetailInformation; + }, + validationCode: string, + validationEmail?: string +): Promise<{ email: string; organizationName: string }> => { + ... +}, + +// after +completeRegistration: async ( + userData: any, // TODO: this should be properly typed + validationCode: string | number, + validationEmail?: string +): Promise<{ email: string; organizationName: string }> => { + ... +}, +``` + +4. New actions available + +To give greater flexibility / granularity in the workflow, we have added a few more actions in registrationUIActions such as `acceptEula`, `requestRegistrationCode`, `createPassword`, and `setAccountDetails`. Refer to the [Registration Workflow](./registration-workflow.md) Guide for information about these new actions. + +## New Setup + +Your new app architecture will look something like this once you have made all of the necessary updates: + +```tsx +// Your application instance of i18n + + {/* Your custom context provider for managing auth state, etc. */} + { + setIsAuthenticated(true); + setLoginData(userData); + }, + onUserNotAuthenticated: (userData): void => { + setIsAuthenticated(false); + }, + loginData, + setLoginData, + language, + setLanguage, + }} + > + {/* Your implementation of a routing solution */} + + {/* Auth Routes */} + {/* Registration Routes */} + + + +``` + +Refer to the [Example](../example/) application for detailed reference. diff --git a/login-workflow/docs/registration-workflow.md b/login-workflow/docs/registration-workflow.md new file mode 100644 index 00000000..cd320f56 --- /dev/null +++ b/login-workflow/docs/registration-workflow.md @@ -0,0 +1,97 @@ +# Registration Workflow Guide + +The registration workflow includes screens related to user sign-up / registration including Create Account, Create Password, Account Details, etc. + +## RegistrationContextProvider + +The screens in this workflow access shared data / configuration / API definitions through a `RegistrationContextProvider` which should wrap all of the relevant routes / screens. + +You must supply the `AuthContextProvider` with the following props / data: +- `actions`: defines the API calls / functions to execute when certain actions are performed in the UI (such as submitting the password form) +- `language`: configures the language displayed on the screens +- `navigate`: a function that can be called to navigate to a new route +- `routeConfig`: an object describing the URLs you are using for the relevant routes so the workflow can correctly navigate between screens + +More information about the required and optional props can found in the [API](#api) section. + +## Implement RegistrationUIActions + +Because this workflow package is back-end agnostic, you must provide an implementation for what happens when the user triggers certain behaviors in the UI. + +The example project includes a skeleton implementation of all required functions using mocks / sleeps. You will need to replace these implementations with appropriate calls to your APIs, caching the returned data, etc. depending on the requirements of your application. + +1. Create a `RegistrationUIActions.ts` file + - This file will handle the implementation of the registration related actions (such as create password, verify code, and create account). + - You can copy this file directly from the [example](../example/src/actions/RegistrationUIActions.tsx) project as a starting point and then update the implementation details if you choose. +2. You might also want to copy over the `example/src/store` and `example/src/constants` folders, which provide a very basic mechanism for storing important data using LocalStorage + - You will want to switch this out for a more secure approach before going to production with your application. + +## Example Usage + +Here is an example of how you would set up the Registration workflow using our recommended routing solution ([React Router](https://reactrouter.com/)). + +The Registration Workflow is made available as a single-page, multi-step component — you will only need a single route for the workflow. If you wish to support invitation-based and self-registration, you can configure two separate routes and use the `RegistrationWorkflow` component to configure each flow separately. + +```tsx + + {/* Wrap all routes in a single shared RegistrationContextProvider */} + + + + } + > + {/* Routes for each workflow you want to include */} + } /> + } /> + + ... + +``` + +For a detailed explanation of setting up routes, see the [Routing](./routing.md) guide. + +## API + +### RegistrationContextProviderProps + + + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| actions* | `RegistrationUIActions` | An object of functions that are used to manage the authentication workflow. See [RegistrationUIActions](#registrationuiactions) for more information | | +| language* | `string` | The language code specifying which language to use for the UI | `'en'` | +| navigate* | `(url: string) => void` | A function that is used to navigate to a new URL. This is used to navigate to the various screens of the workflow. | | +| routeConfig* | `RouteConfig` | An object that defines the various routes for the workflow. See [RouteConfig](#routeconfig) for more information. | | +| i18n | `i18n` | An optional i18n object that is used to translate the UI. This is only needed if you want to use custom translation keys / languages inside any of the workflow screens | | +| errorConfig | `ErrorContextProviderProps` | An object that is used to configure error handling within the workflow. See [Error Management](./error-management.md) for more information. | | + +### RegistrationUIActions + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| loadEula | `(language: string) => Promise` | A function that is used to load the Eula content. This function will be called when the Eula screen is loaded. | | +| acceptEula | `() => Promise` | A function that is called when the user has accepted the Eula and hit the Next button. | | +| requestRegistrationCode | `(email: string) => Promise` | A function that is used to request a registration code. This function will be called when the user clicks the Next button on the Create Account screen or Resend button on Verify Code screen. | | +| validateUserRegistrationRequest | `(validationCode: string, validationEmail?: string) => Promise<{codeValid: boolean | string; accountExists?: boolean}>` | A function that is used to verify registration code. This function will be called when the user clicks the Next button on the Verify Code screen. | | +| createPassword | `(password: string) => Promise` | A function that is used to create password. This function will be called when the user clicks the Next button on the Create Password screen. | | +| setAccountDetails | `(details: { firstName: string; lastName: string; extra?: { [key: string]: boolean \| string \| number }}) => Promise` | A function that is used to set account details. This function will be called when the user clicks the Next button on the Account Details screen. | | +| completeRegistration | `(userData: any, validationCode: number \| string, validationEmail: string) => Promise<{ email: string; organizationName: string }>` | A function that is used to complete the registration workflow. This function will be called when the user clicks the Next button on the last registration workflow screen. | | + +### RouteConfig +The RouteConfig is an object that specifies the paths you are using for the routes / screens in your application to facilitate navigating between screens within the workflows. + +| Key | Type | Description | Default | +|---|---|---|---| +| LOGIN | `string` | The URL path for the Login screen | | +| FORGOT_PASSWORD | `string` | The URL path for the Forgot Password screen | | +| RESET_PASSWORD | `string` | The URL path for the Reset Password screen | | +| REGISTER_INVITE | `string` | The URL path for the invitation-based registration workflow | | +| REGISTER_SELF | `string` | The URL path for the self-registration workflow | | +| SUPPORT | `string` | The URL path for the Contact/Support screen | | diff --git a/login-workflow/docs/routing.md b/login-workflow/docs/routing.md new file mode 100644 index 00000000..6975d17b --- /dev/null +++ b/login-workflow/docs/routing.md @@ -0,0 +1,217 @@ +# Setting up Routing + +While this workflow library will work with different routing providers, we generally recommend using [React Router](https://reactrouter.com/) and will do so in all of the examples. + +## Usage + +Because this workflow package is router-agnostic, you will be required to set up your routing solution and configure which of the workflow screens will appear on each of your routes. + +You will also want to set up Auth/Guest Guard wrappers to control which users can access which screens / routes. For more information see [Protecting Routes](#protecting-routes) below. + +### Authentication + +The **Authentication** workflow screens are rendered individually on separate routes (e.g., the Login screen is on '/login' and the support screen is on '/support'). This means you can deep-link to any of these screens directly if you have them configured. + +For more information on the `AuthContextProvider` , refer to the [Authentication Workflow](./authentication-workflow.md) Guide. + +#### Example Setup + +```tsx +import React from 'react'; +import { + AuthContextProvider, + ContactSupportScreen, + ForgotPasswordScreen, + ResetPasswordScreen, + LoginScreen, + ReactRouterGuestGuard, + ContactSupportScreen, +} from '@brightlayer-ui/react-auth-workflow'; +import { useNavigate } from 'react-router'; +import { ProjectAuthUIActions } from '../actions/AuthUIActions'; +import { Outlet, Route, Routes } from 'react-router-dom'; + +export const routes: RouteConfig = { + LOGIN: '/login', + REGISTER_INVITE: '/register-by-invite?code=8k27jshInvite234Code&email=example@example.com', + REGISTER_SELF: '/self-registration', + FORGOT_PASSWORD: '/forgot-password', + RESET_PASSWORD: '/reset-password', + SUPPORT: '/support', +}; + +// Retrieve data that you are storing about the logged-in status of the user +const getAuthState = () => ({ + isAuthenticated: true; +}) + +export const AppRouter: React.FC = () => { + const navigate = useNavigate(); + const authState = getAuthState(); + return ( + + + + + } + > + + + + } + /> + + + + } + /> + + + + } + /> + + } + /> + + + ); +}; +``` + +### Registration + +The **Registration** workflow is intended to be used on a _single_ route (e.g., '/register') because the screens work together and share data, etc. This single route renders a component that manages the transitions between the screens. You are not intended to be able to deep-link to any particular screen in the flow (e.g., you would not want a user to be able to jump right to '/register/create-password' — it wouldn't make sense without the context of the other screens in the flow). However, all of these screens are exported as individual components if you wanted to build the workflow differently (see [Customization](./customization.md)). + +For more information on the `RegistrationContextProvider`, refer to the [Registration Workflow](./registration-workflow.md) Guide. + +#### Example Usage + +```tsx +import React from 'react'; +import { + RegistrationContextProvider, + RegistrationWorkflow, +} from '@brightlayer-ui/react-auth-workflow'; +import { useNavigate } from 'react-router'; +import { Outlet, Route, Routes } from 'react-router-dom'; +import { ProjectRegistrationUIActions } from '../actions/RegistrationUIActions'; +import { i18nAppInstance } from './i18n'; + +export const routes: RouteConfig = { + LOGIN: '/login', + REGISTER_INVITE: '/register-by-invite?code=8k27jshInvite234Code&email=example@example.com', + REGISTER_SELF: '/self-registration', + FORGOT_PASSWORD: '/forgot-password', + RESET_PASSWORD: '/reset-password', + SUPPORT: '/support', +}; + +// Retrieve data that you are storing about the logged-in status of the user +const getAuthState = () => ({ + isAuthenticated: true; +}) + +export const AppRouter: React.FC = () => { + const navigate = useNavigate(); + const authState = getAuthState(); + return ( + + + + + } + > + + + + } + /> + + + + } + /> + + + ); +}; +``` + +### Protecting Routes + +Different routes in your application should be accessible under different conditions. Some routes (e.g., Login or Reset Password) should only be available when a user is unauthenticated (a logged in user should never be able to get back to the login screen without logging out first). Other routes (like your main application content) should only be accessible when a user is authenticated. Some routes (like Contact Support or Terms and Conditions) may be available to any user regardless of authentication status. + +This is where Route Guard components / protected routes are handy. We provide implementations of a `ReactRouterAuthGuard` (prevents access to the child unless the user is logged in) and `ReactRouterGuestGuard` (prevents access to child routes if the user is logged in) for use with React Router. If you are using another routing provider, you will need to implement these guards yourself. + + +#### Examples + +```tsx +import { + ReactRouterAuthGuard, + ReactRouterGuestGuard +} from '@brightlayer-ui/react-auth-workflow'; + +... + +// AUTH GUARD + +// This will redirect to the login screen since the user is not authenticated +// The user will be returned to Page1 after they enter their credentials + + + + +// Page1 will be rendered because the user is authenticated + + + + + +// GUEST GUARD + +// Page1 will be rendered because the user is NOT authenticated + + + + +// This will redirect to the base url because the user is authenticated and this screen is for guests only + + + +``` diff --git a/login-workflow/docs/sample-project-integration.md b/login-workflow/docs/sample-project-integration.md deleted file mode 100644 index af67da51..00000000 --- a/login-workflow/docs/sample-project-integration.md +++ /dev/null @@ -1,31 +0,0 @@ -# Starting from the Example Project - -If you don't have an existing React project and would like an example as a starting point, consider using the provided example project in the `/example` folder. - - -#### Setup - -Clone or download the package [repository](https://github.com/brightlayer-ui/react-workflows) and then copy the `/example` folder to a new location. Navigate into this folder and run `yarn` to install the required dependencies. - -> If you are using npm as your package manager, you can delete the yarn.lock file and run `npm install` instead. This will generate a new lock file. - - -#### Rename the Project - -You will probably want to call your project something other than 'example'. Rename the folder to whatever you'd like your project name to be. You will also need to update the relevant project-related configuration options in the `package.json` and `index.html` files. - - -#### Configure AuthUIContextProvider - -Open the root app file (`App.tsx`) and adjust the configuration options of the `AuthUIContextProvider` as necessary for your project. The various configuration options are explained in more detail in the [API](https://github.com/brightlayer-ui/react-workflows/tree/master/login-workflow/docs/API.md) documentation. As a suggestion, you may want to swap out the example image with a product logo for your project. - -You can read more about customizing the `AuthUIContextProvider` in the [Customization Guide](https://github.com/brightlayer-ui/react-workflows/tree/master/login-workflow/docs/customization.md) - - -#### Implement AuthUIActions and RegistrationUIActions - -In the example project, all network calls are mocked with `sleeps`. The EULA is also a static sample file. - -Provide real implementation details within the `example/src/actions/AuthUIActions.tsx` and `examples/src/actions/RegistrationUIActions.tsx` files, which are currently mocking network behavior. Most likely, your implementation will involve making calls to an API and using session storage or cookies to retain information as needed by your application (such as the user's name and email). - -You may also want to take this time to rename those two files, prefixing "AuthUIActions" and "RegistrationUIActions" with the name of your project. Make sure you update your imports if so. \ No newline at end of file diff --git a/login-workflow/docs/screens/README.md b/login-workflow/docs/screens/README.md new file mode 100644 index 00000000..d096cba8 --- /dev/null +++ b/login-workflow/docs/screens/README.md @@ -0,0 +1,18 @@ +# Screens + +Each of the screens in both the Login / Authentication and Registration workflows is exported as a standalone component that can be customized or used in your own custom-defined flows. + +> These screen components must live inside of an appropriate `AuthContextProvider` or `RegistrationContextProvider`. If you want to use the components outside of these providers, you can import the `___Base` version of the screens instead, which are pure components driven exclusively by their props. + +The following screen components are available: + +- [AccountDetailsScreen](./account-details.md) +- [ContactSupportScreen](./contact.md) +- [CreateAccountScreen](./create-account.md) +- [CreatePasswordScreen](./create-password.md) +- [EulaScreen](./eula.md) +- [ForgotPasswordScreen](./forgot-password.md) +- [LoginScreen](./account-details.md) +- [ResetPasswordScreen](./reset-password.md) +- [SuccessScreen](./success.md) +- [VerifyCodeScreen](./verify-code.md) \ No newline at end of file diff --git a/login-workflow/docs/screens/account-details.md b/login-workflow/docs/screens/account-details.md new file mode 100644 index 00000000..9c5ca46f --- /dev/null +++ b/login-workflow/docs/screens/account-details.md @@ -0,0 +1,33 @@ +# AccountDetailsScreen + +A screen that displays text fields to collect the user's basic account details (first name and last name). The AccountDetailsScreen must be used within a `RegistrationContextProvider`. + +![Account Details](../../media/screens/account-details.png) + +## Usage + +```tsx +import { RegistrationContextProvider, AccountDetailsScreen } from '@brightlayer-ui/react-auth-workflow'; + +... + + + + +``` + +## API + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| firstNameLabel | `string` | Label for the firstName text field | `'First Name'` | +| initialFirstName | `string` | Initial value to populate in the firstName text field | | +| firstNameValidator | `(firstName: string) => boolean \| string` | A function to validate the first name input value | required to be > 0 characters | +| firstNameTextFieldProps | `TextFieldProps` | Props to pass to the firstName component. See MUI's [TextFieldProps API](https://mui.com/material-ui/api/text-field/). | | +| lastNameLabel | `string` | Label for the lastName text field | `'Last Name'` | +| initialLastName | `string` | Initial value to populate in the lastName text field | | +| lastNameValidator | `(lastName: string) => boolean \| string` | A function to validate the last name input value | required to be > 0 characters | +| lastNameTextFieldProps | `TextFieldProps` | Props to pass to the lastName component. See MUI's [TextFieldProps API](https://mui.com/material-ui/api/text-field/). | | +| errorDisplayConfig | `ErrorManagerProps` | See [Error Management](../error-management.md) | | + +This screen also extends the `WorkflowCardProps` type for updating the title, instructions, buttons, etc. See [Workflow Card](../components/workflow-card.md) for more details. \ No newline at end of file diff --git a/login-workflow/docs/screens/contact.md b/login-workflow/docs/screens/contact.md new file mode 100644 index 00000000..924d0a45 --- /dev/null +++ b/login-workflow/docs/screens/contact.md @@ -0,0 +1,32 @@ +# ContactSupportScreen + +A screen that displays information for contacting support, including email and phone number. The ContactSupportScreen must be used within an `AuthContextProvider`. + +![Contact Support](../../media/screens/contact-support.png) + +## Usage + +```tsx +import { AuthContextProvider, ContactSupportScreen } from '@brightlayer-ui/react-auth-workflow'; +... + + + + +``` + +## API + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| icon | `JSX.Element` | The primary graphical icon to display | `` | +| emailSupportTitle | `string` | The title for the email support section. | `t('bluiAuth:CONTACT_SUPPORT.GENERAL_QUESTIONS')` | +| emailSupportContent | `(email: string) => string \| JSX.Element` | The content for the email support section. | | +| phoneSupportTitle | `string` | The title for the phone support section. | `t('bluiAuth:CONTACT_SUPPORT.EMERGENCY_SUPPORT')` | +| phoneSupportContent | `(phone: string) => string \| JSX.Element` | The content for the phone support section. | | +| contactEmail | `string` | The email address for contacting support. | `something@email.com` | +| contactPhone | `string` | The phone number for contacting support | `1-800-123-4567` | +| dismissButtonLabel | `string` | Text to display on the dismiss button. | `t('bluiCommon:ACTIONS.OKAY')` | +| onDismiss | `() => void` | Function to call when the dismiss button is clicked. | | + +This screen also extends the `WorkflowCardProps` type for updating the title, instructions, buttons, etc. See [Workflow Card](../components/workflow-card.md) for more details. \ No newline at end of file diff --git a/login-workflow/docs/screens/create-account.md b/login-workflow/docs/screens/create-account.md new file mode 100644 index 00000000..a2e04d82 --- /dev/null +++ b/login-workflow/docs/screens/create-account.md @@ -0,0 +1,29 @@ +# CreateAccountScreen + +A screen that displays a text field to collect the user's email address. The CreateAccountScreen must be used within a `RegistrationContextProvider`. + +![Account Details](../../media/screens/create-account.png) + +## Usage + +```tsx +import { RegistrationContextProvider, CreateAccountScreen } from '@brightlayer-ui/react-auth-workflow'; + +... + + + + +``` + +## API + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| emailLabel | `string` | Text to display as the label for the email text field. | `t('bluiAuth:CREATE_ACCOUNT.EMAIL_ADDRESS')` | +| initialValue | `string` | The initial value for the email text field. | | +| emailValidator | `(email: string) => boolean \| string` | A function that validates the email text field input. | checks against valid email regex | +| emailTextFieldProps | `TextFieldProps` | Props to pass to the MUI [TextField](https://mui.com/material-ui/api/text-field/) component. | | +| errorDisplayConfig | `ErrorManagerProps` | See [Error Management](../error-management.md) | | + +This screen also extends the `WorkflowCardProps` type for updating the title, instructions, buttons, etc. See [Workflow Card](../components/workflow-card.md) for more details. \ No newline at end of file diff --git a/login-workflow/docs/screens/create-password.md b/login-workflow/docs/screens/create-password.md new file mode 100644 index 00000000..fa11ad99 --- /dev/null +++ b/login-workflow/docs/screens/create-password.md @@ -0,0 +1,26 @@ +# CreatePasswordScreen + +A screen that displays text fields to create a new user's password. The CreatePasswordScreen must be used within a `RegistrationContextProvider`. + +![Create Password](../../media/screens/create-password.png) + +## Usage + +```tsx +import { RegistrationContextProvider, CreatePasswordScreen } from '@brightlayer-ui/react-auth-workflow'; + +... + + + + +``` + +## API + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| PasswordProps | `SetPasswordProps` | See [Set Password](../components/set-password.md) | | +| errorDisplayConfig | `ErrorManagerProps` | See [Error Management](../error-management.md) | | + +This screen also extends the `WorkflowCardProps` type for updating the title, instructions, buttons, etc. See [Workflow Card](../components/workflow-card.md) for more details. \ No newline at end of file diff --git a/login-workflow/docs/screens/eula.md b/login-workflow/docs/screens/eula.md new file mode 100644 index 00000000..9e48af5c --- /dev/null +++ b/login-workflow/docs/screens/eula.md @@ -0,0 +1,31 @@ +# EulaScreen + +A screen that displays an End User License Agreement and a checkbox to confirm that they have read and agree to the terms. The EulaScreen must be used within a `RegistrationContextProvider`. + +![EULA](../../media/screens/eula.png) + +## Usage + +```tsx +import { RegistrationContextProvider, EulaScreen } from '@brightlayer-ui/react-auth-workflow'; + +... + + + + +``` + +## API + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| eulaContent | `string \| JSX.Element` | The content to render for the EULA. Can be a plain string or HTML. | `t('bluiAuth:EULA.EULA_CONTENT')` | +| checkboxLabel | `string` | The text to render for the acceptance checkbox. | `t('bluiAuth:EULA.ACCEPT_EULA')` | +| checkboxProps | `CheckboxProps` | Props to spread to the MUI [Checkbox](https://mui.com/material-ui/api/checkbox/) component | | +| html | `boolean` | True if the EULA should be rendered as HTML, false for plain text | `false` | +| initialCheckboxValue | `boolean` | Used to pre-populate the checked/unchecked checkbox when the screen loads. | `false` | +| onEulaAcceptedChange | `(accepted: boolean) => void` | Called when the acceptance checkbox clicked. | | +| errorDisplayConfig | `ErrorManagerProps` | See [Error Management](../error-management.md) | | + +This screen also extends the `WorkflowCardProps` type for updating the title, instructions, buttons, etc. See [Workflow Card](../components/workflow-card.md) for more details. \ No newline at end of file diff --git a/login-workflow/docs/screens/forgot-password.md b/login-workflow/docs/screens/forgot-password.md new file mode 100644 index 00000000..96119302 --- /dev/null +++ b/login-workflow/docs/screens/forgot-password.md @@ -0,0 +1,62 @@ +# ForgotPasswordScreen + +A screen that collects an email address so a user who forgets their password can request a reset code. The ForgotPasswordScreen must be used within an `AuthContextProvider`. + +![Forgot Password](../../media/screens/forgot-password.png) + +## Usage + +```tsx +import { AuthContextProvider, ForgotPasswordScreen } from '@brightlayer-ui/react-auth-workflow'; +... + + + + +``` + +## API + +| Prop Name | Type | Description | Default | +| ------------------ | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | --------------------------------------------- | +| emailLabel | `string` | Text to display as the label for the email text field. | `t('bluiAuth:FORGOT_PASSWORD.EMAIL_ADDRESS')` | +| initialEmailValue | `string` | The initial value for the email text field input. | | +| emailValidator | `(email: string) => boolean \| string` | A function that validates the email text field input. | checks against valid email regex | +| slots | `ForgotPasswordScreenSlots` | Components to use in place of the defaults. See [ForgotPasswordScreenSlots](#forgotpasswordscreenslots) | | +| slotProps | `ForgotPasswordScreenSlotProps` | Props to pass to the custom slot components. See [ForgotPasswordScreenSlotProps](#forgotpasswordscreenslotprops) | | +| contactPhone | `string` | The phone number to display in the contact section. | `1-800-123-4567` | +| responseTime | `string` | The response time to display in the contact section. | `24 hours` | +| description | `(responseTime: string) => React.ReactNode;` | used to update the instruction | +| showSuccessScreen | `boolean` | If true, a success screen will appear after submitting the form | `true` | +| errorDisplayConfig | `ErrorManagerProps` | See [Error Management](../error-management.md) | | +| emailTextFieldProps| `TextFieldProps` | Props to pass to the email input field. See MUI's [TextFieldProps API](https://mui.com/material-ui/api/text-field/). | | + +This screen also extends the `WorkflowCardProps` type for updating the title, instructions, buttons, etc. See [Workflow Card](../components/workflow-card.md) for more details. + +- **description** (optional) + - A function that returns the description to display in the contact section. + - **Type:** `(responseTime: string) => React.ReactNode` + - **Default:** + ```tsx + (responseTime: string): React.ReactNode => { + return ( +

+ {t('bluiAuth:FORGOT_PASSWORD.DESCRIPTION', { + responseTime, + })} +

+ ); + }; + ``` + +### ForgotPasswordScreenSlots + +| Key | Type | Description | +| ------------- | -------------------------------------------- | ------------------------------------------------------------------------------ | +| SuccessScreen | `(props: SuccessScreenProps) => JSX.Element` | A custom success screen component to render. See [SuccessScreen](./success.md) | + +### ForgotPasswordScreenSlotProps + +| Key | Type | Description | +| ------------- | -------------------- | --------------------------------------------------------------------------------------- | +| SuccessScreen | `SuccessScreenProps` | Props to pass to the custom success screen component. See [SuccessScreen](./success.md) | diff --git a/login-workflow/docs/screens/login.md b/login-workflow/docs/screens/login.md new file mode 100644 index 00000000..13ac4fdd --- /dev/null +++ b/login-workflow/docs/screens/login.md @@ -0,0 +1,85 @@ +# LoginScreen + +Component that renders a login screen that prompts a user to enter a username and password to login. The LoginScreen must be used within an `AuthContextProvider` . + +![Login](../../media/screens/login.png) + +## Usage + +```tsx +import { AuthContextProvider, LoginScreen } from '@brightlayer-ui/react-auth-workflow'; + +... + + + + +``` + +## API + +### Login Configuration + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| usernameLabel | `string` | Label for the username field. | `t('bluiCommon:LABELS.EMAIL')` | +| usernameTextFieldProps | `TextFieldProps` | Props to pass to the MUI [TextField](https://mui.com/material-ui/api/text-field/) component. | | +| usernameValidator | `(username: string) => boolean \| string` | A function that validates the username text field input. | checks against valid email regex | +| initialUsernameValue | `string` | Username used to pre-populate the field. | | +| passwordLabel | `string` | Label for the password field. | `t('bluiCommon:LABELS.EMAIL')` | +| passwordTextFieldProps | `TextFieldProps` | Props to pass to the MUI [TextField](https://mui.com/material-ui/api/text-field/) component. | | +| passwordValidator | `(password: string) => boolean \| string` | A function that validates the password text field input. | checks against valid email regex | +| initialUsernameValue | `string` | Username used to pre-populate the field. | | +| loginButtonLabel | `string` | Label for the login button. | `t('bluiCommon:ACTIONS.LOG_IN')` | +| onLogin | `(username: string, password: string, rememberMe: boolean) => Promise` | Callback function that is called when the login button is clicked. | | + +### Remember Me Configuration + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| showRememberMe | `boolean` | Whether or not to show the 'remember me' checkbox. | `true` | +| rememberMeLabel | `string` | Label for the 'remember me' checkbox. | `t('bluiCommon:ACTIONS.REMEMBER')` | +| rememberMeInitialValue | `boolean` | Whether or not the 'remember me' checkbox should be checked by default. | `false` | +| onRememberMeChanged | `(value: boolean) => void` | Callback function that is called when the 'remember me' checkbox is changed. | | +| | | | | +| | | | | +| | | | | +| | | | | + +### Forgot Password Configuration + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| showForgotPassword | `boolean` | Whether or not to show the 'forgot password' link. | `true` | +| forgotPasswordLabel | `string` | Label for the 'forgot password' link. | `t('bluiCommon:LABELS.FORGOT_PASSWORD')` | +| onForgotPassword | `() => void` | Callback function that is called when the 'forgot password' link is clicked. | | +| | | | | + +### Self Registration Configuration + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| showSelfRegistration | `boolean` | Whether or not to show the 'self registration' link. | `true` | +| selfRegisterButtonLabel | `string` | Label for the 'self registration' link. | `t('bluiCommon:ACTIONS.CREATE_ACCOUNT')` | +| selfRegisterInstructions | `string` | Instructions to display before the 'self registration' link. | `t('bluiCommon:LABELS.NEED_ACCOUNT')` | +| onSelfRegister | `() => void` | Callback function that is called when the 'self registration' link is clicked. | | + +### Contact Support Configuration + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| showContactSupport | `boolean` | Whether or not to show the 'contact support' link. | `true` | +| contactSupportLabel | `string` | Label for the 'contact support' link. | `t('bluiCommon:MESSAGES.CONTACT')` | +| onContactSupport | `() => void` | Callback function that is called when the 'contact support' link is clicked. | | + +### Additional Visuals Configuration + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| showCyberSecurityBadge | `boolean` | Whether or not to show the cyber security badge. | `true` | +| projectImage | `ReactNode` | Image to display at the top of the screen. | | +| header | `ReactNode` | Custom content to display at the top of the screen. | | +| footer | `ReactNode` | Custom content to display at the bottom of the screen. | | +| errorDisplayConfig | `ErrorManagerProps` | See [Error Management](../error-management.md) | | + +This screen also extends the `WorkflowCardProps` type for updating the title, instructions, buttons, etc. See [Workflow Card](../components/workflow-card.md) for more details. diff --git a/login-workflow/docs/screens/reset-password.md b/login-workflow/docs/screens/reset-password.md new file mode 100644 index 00000000..d3fa8215 --- /dev/null +++ b/login-workflow/docs/screens/reset-password.md @@ -0,0 +1,40 @@ +# ResetPasswordScreen + +A screen that allows a user to reset their password. The ResetPasswordScreen must be used within an `AuthContextProvider`. + +![Reset Password](../../media/screens/reset-password.png) + +## Usage + +```tsx +import { AuthContextProvider, ResetPasswordScreen } from '@brightlayer-ui/react-auth-workflow'; +... + + + + +``` + +## API + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| PasswordProps | `SetPasswordProps` | See [Set Password](../components/set-password.md) | | +| showSuccessScreen | `boolean` | If true, a success screen will appear after submitting the form | `true` | +| slots | `ResetPasswordScreenSlots` | Components to use in place of the defaults. See [ResetPasswordScreenSlots](#resetpasswordscreenslots) | | +| slotProps | `ResetPasswordScreenSlotProps` | Props to pass to the custom slot components. See [ResetPasswordScreenSlotProps](#resetpasswordscreenslotprops) | | +| errorDisplayConfig | `ErrorManagerProps` | See [Error Management](../error-management.md) | | + +This screen also extends the `WorkflowCardProps` type for updating the title, instructions, buttons, etc. See [Workflow Card](../components/workflow-card.md) for more details. + +### ResetPasswordScreenSlots + +| Key | Type | Description | +|---|---|---| +| SuccessScreen | `(props: SuccessScreenProps) => JSX.Element` | A custom success screen component to render. See [SuccessScreen](./success.md) | + +### ResetPasswordScreenSlotProps + +| Key | Type | Description | +|---|---|---| +| SuccessScreen | `SuccessScreenProps` | Props to pass to the custom success screen component. See [SuccessScreen](./success.md) | \ No newline at end of file diff --git a/login-workflow/docs/screens/success.md b/login-workflow/docs/screens/success.md new file mode 100644 index 00000000..d72d59f4 --- /dev/null +++ b/login-workflow/docs/screens/success.md @@ -0,0 +1,29 @@ +# SuccessScreenBase + +A component to use as a simple success screen for mini 1-step workflows (like Forgot Paswsword). It renders a a message, an icon, and a dismiss button. + +![Success](../../media/screens/success.png) + +## Usage + +```tsx +import { SuccessScreenBase } from '@brightlayer-ui/react-auth-workflow'; + +... + + +``` + +## API + +| Prop Name | Type | Description | Default | +|---|---|---|---| +| icon | `React.ReactNode` | The icon to be displayed on the screen. | | +| messageTitle | `string` | The title of the success message. | | +| message | `ReactNode` | The success message to be displayed on the screen. | | +| dismissButtonLabel | `string` | The label of the dismiss button. | | +| canDismiss | `boolean` | A boolean determining if the screen can be dismissed. | | +| onDismiss | `() => void` | A function to be called when the screen is dismissed. | | + +This screen also extends the `WorkflowCardProps` type for updating the title, instructions, buttons, etc. See [Workflow Card](../components/workflow-card.md) for more details. + \ No newline at end of file diff --git a/login-workflow/docs/screens/verify-code.md b/login-workflow/docs/screens/verify-code.md new file mode 100644 index 00000000..26b9c181 --- /dev/null +++ b/login-workflow/docs/screens/verify-code.md @@ -0,0 +1,32 @@ +# VerifyCodeScreen + +A screen that displays an input for a user to provide a verification code for the purposes of confirming an email address. The VerifyCodeScreen must be used within a `RegistrationContextProvider`. + +![Verify Code](../../media/screens/verify-email.png) + +## Usage + +```tsx +import { RegistrationContextProvider, VerifyCodeScreen } from '@brightlayer-ui/react-auth-workflow'; + +... + + + + +``` + +## API + +| Prop Name | Type | Description | Default | +| ------------------------ | ------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | +| codeValidator | `(code: string) => boolean \| string` | A function to validate the input value | required to be > 0 characters | +| onResend | `() => void` | A function that is called when the resend link/button is clicked. | | +| resendInstructions | `string` | Text to display ahead of the resend link/button. | `t('bluiAuth:VERIFY_CODE.RESEND_INSTRUCTIONS')` | +| resendLabel | `string` | Label/text for the resend link/button. | `t('bluiAuth:VERIFY_CODE.RESEND')` | +| initialValue | `string` | The initial value for the code input. | | +| verifyCodeInputLabel | `string` | The label for the code text field. | `t('bluiAuth:VERIFY_CODE.VERIFICATION_CODE')` | +| errorDisplayConfig | `ErrorManagerProps` | See [Error Management](../error-management.md) | | +| verifyCodeTextFieldProps | `TextFieldProps` | Props to pass to the verify code input field. See MUI's [TextFieldProps API](https://mui.com/material-ui/api/text-field/). | | + +This screen also extends the `WorkflowCardProps` type for updating the title, instructions, buttons, etc. See [Workflow Card](../components/workflow-card.md) for more details. diff --git a/login-workflow/example/.gitignore b/login-workflow/example/.gitignore index 4aa460d0..4d29575d 100644 --- a/login-workflow/example/.gitignore +++ b/login-workflow/example/.gitignore @@ -7,7 +7,6 @@ # testing /coverage -/cypress-coverage # production /build diff --git a/login-workflow/example/cypress.config.ts b/login-workflow/example/cypress.config.ts deleted file mode 100644 index 5bdc049e..00000000 --- a/login-workflow/example/cypress.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { defineConfig } from 'cypress'; - -export default defineConfig({ - e2e: { - setupNodeEvents(on, config) { - require('@cypress/code-coverage/task')(on, config); - // implement node event listeners here - return config; - }, - }, -}); diff --git a/login-workflow/example/cypress/e2e/change-password.cy.ts b/login-workflow/example/cypress/e2e/change-password.cy.ts deleted file mode 100644 index 6e925ad4..00000000 --- a/login-workflow/example/cypress/e2e/change-password.cy.ts +++ /dev/null @@ -1,58 +0,0 @@ -/// -/// - -describe('change password actions', () => { - beforeEach(() => { - cy.visit('http://localhost:3000/custom-login-route'); - }); - - it('should display change password success', () => { - cy.get('#email').click().type('test@test.com'); - cy.get('#password').click().type('Test321!'); - cy.contains('Log In').click(); - cy.contains('Change Password').should('be.enabled').click(); - cy.get('#current-password').click().type('Test321!'); - cy.get('#password').click().type('Test321!'); - cy.get('#confirm').click().type('Test321!'); - cy.contains('Okay').should('be.enabled').click(); - cy.get('[data-test="frame"]').should('contain', 'Your password was successfully updated!'); - cy.contains('Log In').should('be.enabled').click(); - }); - - it('should toggle password visibility on', () => { - cy.get('#email').click().type('test@test.com'); - cy.get('#password').click().type('Test321!'); - cy.contains('Log In').click(); - cy.contains('Change Password').should('be.enabled').click(); - cy.get('#current-password').click().type('Test321!'); - cy.get('[data-testid="VisibilityOffIcon"]').first().click(); - cy.get('#current-password').invoke('prop', 'type').should('contain', 'text'); - cy.get('[data-testid="VisibilityIcon"]').click(); - cy.get('#current-password').invoke('prop', 'type').should('contain', 'password'); - cy.get('#password').click().type('Test321!'); - cy.get('#confirm').click().type('Test321!'); - cy.get('[data-testid="VisibilityOffIcon"]').last().click(); - cy.get('#confirm').invoke('prop', 'type').should('contain', 'text'); - }); - - it('should clear password modal on navigation', () => { - cy.get('#email').click().type('test@test.com'); - cy.get('#password').click().type('Test321!'); - cy.contains('Log In').click(); - cy.contains('Change Password').should('be.enabled').click(); - cy.get('#current-password').click().type('Test321!'); - cy.contains('Back').should('be.enabled').click(); - cy.contains('Change Password').should('be.enabled').click(); - cy.get('#current-password').click().should('not.contain', 'Test321!'); - }); - - it('should not submit when password checker invalid', () => { - cy.get('#email').click().type('test@test.com'); - cy.get('#password').click().type('Test321!'); - cy.contains('Log In').click(); - cy.contains('Change Password').click(); - cy.get('#password').click().type('test321!'); - cy.get('#confirm').type('test321!'); - cy.contains('Okay').should('be.disabled'); - }); -}); diff --git a/login-workflow/example/cypress/e2e/contact-support.cy.ts b/login-workflow/example/cypress/e2e/contact-support.cy.ts deleted file mode 100644 index e9418fc4..00000000 --- a/login-workflow/example/cypress/e2e/contact-support.cy.ts +++ /dev/null @@ -1,18 +0,0 @@ -/// -/// - -describe('login authentication actions', () => { - beforeEach(() => { - cy.visit('http://localhost:3000/custom-login-route'); - }); - - it('should display contact us modal', () => { - cy.contains('Contact an Eaton').click(); - cy.contains('Contact Us'); - }); - - it('should display login page when contact us is selected', () => { - cy.contains('Contact an Eaton').click(); - cy.contains('Okay').should('be.enabled').click(); - }); -}); diff --git a/login-workflow/example/cypress/e2e/forgot-password.cy.ts b/login-workflow/example/cypress/e2e/forgot-password.cy.ts deleted file mode 100644 index ab049179..00000000 --- a/login-workflow/example/cypress/e2e/forgot-password.cy.ts +++ /dev/null @@ -1,31 +0,0 @@ -/// -/// - -describe('forgot password actions', () => { - beforeEach(() => { - cy.visit('http://localhost:3000/custom-login-route'); - }); - - it('should display success screen', () => { - cy.contains('Forgot your password?').click(); - cy.get('#email').click().type('test@test.com'); - cy.contains('Okay').should('be.enabled').click(); - cy.get('[data-test="frame"]').should('contain', 'Email Sent'); - cy.contains('Done').should('be.enabled').click(); - }); - - it('should disable submit on invalid input', () => { - cy.contains('Forgot your password?').click(); - cy.get('#email').click().type('test@test'); - cy.contains('Okay').should('be.disabled'); - }); - - it('should clear forgot password modal on navigation', () => { - cy.contains('Forgot your password?').click(); - cy.get('#email').click().type('test@test.com'); - cy.contains('Okay').should('be.enabled'); - cy.contains('Back').should('be.enabled').click(); - cy.contains('Forgot your password?').click(); - cy.get('#email').click().should('not.contain', 'test@test.com'); - }); -}); diff --git a/login-workflow/example/cypress/e2e/invite-reg-acct-details.cy.ts b/login-workflow/example/cypress/e2e/invite-reg-acct-details.cy.ts deleted file mode 100644 index 436ea2d2..00000000 --- a/login-workflow/example/cypress/e2e/invite-reg-acct-details.cy.ts +++ /dev/null @@ -1,42 +0,0 @@ -/// -/// - -describe('invite register account details', () => { - beforeEach(() => { - cy.visit('http://localhost:3000/custom-register-by-invite-route?code=DEBUG_VALIDATION_CODE_DEADBEEF'); - }); - - it('should display account details modal', () => { - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - cy.contains('Create Password'); - cy.get('#password').click().type('Test321!'); - cy.get('#confirm').click().type('Test321!'); - cy.contains('Next').should('be.enabled').click(); - cy.contains('Account Details'); - }); - - it('should allow user to submit account details', () => { - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - cy.contains('Create Password'); - cy.get('#password').click().type('Test321!'); - cy.get('#confirm').click().type('Test321!'); - cy.contains('Next').should('be.enabled').click(); - cy.get('#first').click().type('fName'); - cy.get('#last').click().type('lName'); - cy.contains('Next').should('be.enabled').click(); - cy.get('[data-test="frame"]').should('contain', 'Welcome, fName lName'); - }); - - it('should not allow user to submit invalid account details', () => { - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - cy.contains('Create Password'); - cy.get('#password').click().type('Test321!'); - cy.get('#confirm').click().type('Test321!'); - cy.contains('Next').should('be.enabled').click(); - cy.get('#first').click().type('fName'); - cy.contains('Next').should('be.disabled'); - }); -}); diff --git a/login-workflow/example/cypress/e2e/invite-reg-eula.cy.ts b/login-workflow/example/cypress/e2e/invite-reg-eula.cy.ts deleted file mode 100644 index 98b873cb..00000000 --- a/login-workflow/example/cypress/e2e/invite-reg-eula.cy.ts +++ /dev/null @@ -1,22 +0,0 @@ -/// -/// - -describe('invite register EULA', () => { - beforeEach(() => { - cy.visit('http://localhost:3000/custom-register-by-invite-route?code=DEBUG_VALIDATION_CODE_DEADBEEF'); - }); - - it('should display EULA modal', () => { - cy.contains('License Agreement'); - cy.contains('THIS EULA IS ONLY BETWEEN'); - }); - - it('should allow user to accept EULA agreement', () => { - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - }); - - it('should not allow user to create account without accept EULA', () => { - cy.contains('Next').should('be.disabled'); - }); -}); diff --git a/login-workflow/example/cypress/e2e/invite-reg-password.cy.ts b/login-workflow/example/cypress/e2e/invite-reg-password.cy.ts deleted file mode 100644 index c89dd95f..00000000 --- a/login-workflow/example/cypress/e2e/invite-reg-password.cy.ts +++ /dev/null @@ -1,32 +0,0 @@ -/// -/// - -describe('invite register create password', () => { - beforeEach(() => { - cy.visit('http://localhost:3000/custom-register-by-invite-route?code=DEBUG_VALIDATION_CODE_DEADBEEF'); - }); - - it('should display create password modal', () => { - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - cy.contains('Create Password'); - }); - - it('should allow user to submit create password', () => { - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - cy.contains('Create Password'); - cy.get('#password').click().type('Test321!'); - cy.get('#confirm').click().type('Test321!'); - cy.contains('Next').should('be.enabled').click(); - }); - - it('should not allow user to submit invalid create password', () => { - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - cy.contains('Create Password'); - cy.get('#password').click().type('test321'); - cy.get('#confirm').click().type('Test321!'); - cy.contains('Next').should('be.disabled'); - }); -}); diff --git a/login-workflow/example/cypress/e2e/invite-reg-success.cy.ts b/login-workflow/example/cypress/e2e/invite-reg-success.cy.ts deleted file mode 100644 index c91e5b17..00000000 --- a/login-workflow/example/cypress/e2e/invite-reg-success.cy.ts +++ /dev/null @@ -1,23 +0,0 @@ -/// -/// - -describe('invite register successful registration', () => { - beforeEach(() => { - cy.visit('http://localhost:3000/custom-register-by-invite-route?code=DEBUG_VALIDATION_CODE_DEADBEEF'); - }); - - it('should display log in when successful invite reg completes', () => { - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - cy.contains('Create Password'); - cy.get('#password').click().type('Test321!'); - cy.get('#confirm').click().type('Test321!'); - cy.contains('Next').should('be.enabled').click(); - cy.get('#first').click().type('fName'); - cy.get('#last').click().type('lName'); - cy.contains('Next').should('be.enabled').click(); - cy.get('[data-test="frame"]').should('contain', 'Welcome, fName lName'); - cy.contains('Continue').should('be.enabled').click(); - cy.contains('Log In'); - }); -}); diff --git a/login-workflow/example/cypress/e2e/login.cy.ts b/login-workflow/example/cypress/e2e/login.cy.ts deleted file mode 100644 index e52f3a41..00000000 --- a/login-workflow/example/cypress/e2e/login.cy.ts +++ /dev/null @@ -1,57 +0,0 @@ -/// -/// - -describe('login authentication actions', () => { - beforeEach(() => { - cy.visit('http://localhost:3000/custom-login-route'); - }); - - it('should authenticate with valid id', () => { - cy.get('#email').click().type('test@test.com'); - cy.get('#password').click().type('Test321!'); - cy.contains('Log In').should('be.enabled').click(); - cy.contains('Edit src'); - }); - - it('should display enter a valid email', () => { - cy.get('#email').click().type('test.com'); - cy.get('#password').click(); - cy.get('#email-helper-text').should('contain', 'Please enter a valid email'); - cy.contains('Log In').should('be.disabled'); - }); - - it('should toggle password visibility on-off', () => { - cy.get('#password').click().type('Test321!'); - cy.get('[data-testid="VisibilityOffIcon"]').click(); - cy.get('#password').invoke('prop', 'type').should('contain', 'text'); - cy.get('[data-testid="VisibilityIcon"]').click(); - cy.get('#password').invoke('prop', 'type').should('contain', 'password'); - }); - - it('should remember me', () => { - cy.get('#email').click().type('test@test.com'); - cy.get('#password').click().type('Test321!'); - cy.contains('Remember Me').click(); - cy.contains('Log In').should('be.enabled').click(); - cy.contains('Log Out').should('be.enabled').click(); - cy.getLocalStorage('remember_me_data').should('equal', '{"user":"test@test.com","rememberMe":true}'); - }); - - it('should remember me on refresh', () => { - cy.get('#email').click().type('test@test.com'); - cy.get('#password').click().type('Test321!'); - cy.contains('Remember Me').click(); - cy.contains('Log In').should('be.enabled').click(); - cy.contains('Log Out').should('be.enabled').click(); - cy.reload(); - cy.getLocalStorage('remember_me_data').should('equal', '{"user":"test@test.com","rememberMe":true}'); - }); - - it('should not remember me', () => { - cy.get('#email').click().type('test@test.com'); - cy.get('#password').click().type('Test321!'); - cy.contains('Log In').should('be.enabled').click(); - cy.contains('Log Out').should('be.enabled').click(); - cy.getLocalStorage('remember_me_data').should('equal', '{"user":"","rememberMe":false}'); - }); -}); diff --git a/login-workflow/example/cypress/e2e/pre-auth-screen.cy.ts b/login-workflow/example/cypress/e2e/pre-auth-screen.cy.ts deleted file mode 100644 index 1f962002..00000000 --- a/login-workflow/example/cypress/e2e/pre-auth-screen.cy.ts +++ /dev/null @@ -1,22 +0,0 @@ -/// - -describe('pre-auth guard route', () => { - beforeEach(() => { - cy.visit('http://localhost:3000/pre-auth'); - }); - - it('should display guarded route page', () => { - cy.contains('example pre-auth'); - }); - - it('should have status code 200', () => { - cy.request('http://localhost:3000/pre-auth').then((resp) => { - expect(resp.status).to.eq(200); - }); - }); - - it('should guard navigate to home page', () => { - cy.contains('Navigate to Home').click(); - cy.url().should('be.equal', 'http://localhost:3000/custom-login-route'); - }); -}); diff --git a/login-workflow/example/cypress/e2e/reset-password.cy.ts b/login-workflow/example/cypress/e2e/reset-password.cy.ts deleted file mode 100644 index 04653227..00000000 --- a/login-workflow/example/cypress/e2e/reset-password.cy.ts +++ /dev/null @@ -1,38 +0,0 @@ -/// -/// - -describe('reset password actions', () => { - beforeEach(() => { - cy.visit('http://localhost:3000/custom-reset-password-route?code=DEBUG_VALIDATION_CODE_DEADBEEF'); - }); - - it('should display modal and reset password', () => { - cy.get('.MuiCardHeader-root').should('contain', 'Reset Password'); - cy.get('#password').invoke('prop', 'type').should('contain', 'password'); - cy.get('#password').click().type('Test321!'); - cy.get('[data-testid="VisibilityOffIcon"]').first().click(); - cy.get('#password').invoke('prop', 'type').should('contain', 'text'); - cy.get('#confirm').invoke('prop', 'type').should('contain', 'password'); - cy.get('#confirm').click().type('Test321!'); - cy.get('[data-testid="VisibilityOffIcon"]').click(); - cy.get('#confirm').invoke('prop', 'type').should('contain', 'text'); - cy.contains('Okay').should('be.enabled').click(); - cy.get('[data-test="frame"]').should('contain', 'Your password was successfully reset'); - cy.contains('Done').should('be.enabled').click(); - }); - - it('should disable submit on invalid input', () => { - cy.get('#password').click().type('Test321!'); - cy.get('#confirm').click().type('test321'); - cy.contains('Okay').should('be.disabled'); - }); - - it('should clear forgot password modal on navigation', () => { - cy.get('#password').click().type('Test321!'); - cy.get('#confirm').click().type('Test321!'); - cy.contains('Okay').should('be.enabled'); - cy.contains('Back').should('be.enabled').click(); - cy.visit('http://localhost:3000/custom-reset-password-route?code=DEBUG_VALIDATION_CODE_DEADBEEF'); - cy.get('#password').click().should('not.contain', 'Test321!'); - }); -}); diff --git a/login-workflow/example/cypress/e2e/self-reg-acct-details.cy.ts b/login-workflow/example/cypress/e2e/self-reg-acct-details.cy.ts deleted file mode 100644 index 006d4a5b..00000000 --- a/login-workflow/example/cypress/e2e/self-reg-acct-details.cy.ts +++ /dev/null @@ -1,57 +0,0 @@ -/// -/// - -describe('self register account details', () => { - beforeEach(() => { - cy.visit('http://localhost:3000/custom-login-route'); - }); - - it('should display account details modal', () => { - cy.contains('Register now').click(); - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - cy.get('#email').click().type('test@test.com'); - cy.contains('Next').should('be.enabled').click(); - cy.get('#code').click().type('123'); - cy.contains('Next').should('be.enabled').click(); - cy.contains('Create Password'); - cy.get('#password').click().type('Test321!'); - cy.get('#confirm').click().type('Test321!'); - cy.contains('Next').should('be.enabled').click(); - cy.contains('Account Details'); - }); - - it('should allow user to submit account details', () => { - cy.contains('Register now').click(); - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - cy.get('#email').click().type('test@test.com'); - cy.contains('Next').should('be.enabled').click(); - cy.get('#code').click().type('123'); - cy.contains('Next').should('be.enabled').click(); - cy.contains('Create Password'); - cy.get('#password').click().type('Test321!'); - cy.get('#confirm').click().type('Test321!'); - cy.contains('Next').should('be.enabled').click(); - cy.get('#first').click().type('fName'); - cy.get('#last').click().type('lName'); - cy.contains('Next').should('be.enabled').click(); - cy.get('[data-test="frame"]').should('contain', 'Welcome, fName lName'); - }); - - it('should not allow user to submit invalid account details', () => { - cy.contains('Register now').click(); - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - cy.get('#email').click().type('test@test.com'); - cy.contains('Next').should('be.enabled').click(); - cy.get('#code').click().type('123'); - cy.contains('Next').should('be.enabled').click(); - cy.contains('Create Password'); - cy.get('#password').click().type('Test321!'); - cy.get('#confirm').click().type('Test321!'); - cy.contains('Next').should('be.enabled').click(); - cy.get('#first').click().type('fName'); - cy.contains('Next').should('be.disabled'); - }); -}); diff --git a/login-workflow/example/cypress/e2e/self-reg-chinese.cy.ts b/login-workflow/example/cypress/e2e/self-reg-chinese.cy.ts deleted file mode 100644 index b96cbe55..00000000 --- a/login-workflow/example/cypress/e2e/self-reg-chinese.cy.ts +++ /dev/null @@ -1,36 +0,0 @@ -/// -/// - -describe('Language spanish', () => { - beforeEach(() => { - cy.visit('http://localhost:3000/custom-login-route'); - }); - - it('should display self register in chinese', () => { - cy.contains('Change Language-ZH').click(); - cy.contains('创建账号').click(); - cy.get('.MuiCardHeader-root').should('contain', '许可协议'); - cy.contains('我已阅读并同意条款及细则'); - cy.get('[type="checkbox"]').check(); - cy.contains('下一步').should('be.enabled').click(); - cy.get('.MuiCardHeader-root').should('contain', '创建账号'); - cy.get('#email-label').should('contain', '邮箱地址'); - cy.get('#email').type('test@test.com'); - cy.contains('下一步').should('be.enabled').click(); - cy.get('.MuiCardHeader-root').should('contain', '验证邮箱'); - cy.get('#code-label').should('contain', '验证码'); - cy.get('#code').click().type('123'); - cy.contains('重新发送验证邮件').should('be.enabled').click(); - cy.contains('下一步').should('be.enabled').click(); - cy.get('.MuiCardHeader-root').should('contain', '创建密码'); - cy.get('#password').click().type('Test321!'); - cy.get('#confirm').click().type('Test321!'); - cy.contains('下一步').should('be.enabled').click(); - cy.get('.MuiCardHeader-root').should('contain', '账号信息'); - cy.get('#first').click().type('fName'); - cy.get('#last').click().type('lName'); - cy.contains('下一步').should('be.enabled').click(); - cy.get('.MuiCardHeader-root').should('contain', '成功建立账号!'); - cy.get('.MuiButton-root').should('contain', '继续').click(); - }); -}); diff --git a/login-workflow/example/cypress/e2e/self-reg-create-acct.cy.ts b/login-workflow/example/cypress/e2e/self-reg-create-acct.cy.ts deleted file mode 100644 index 81f35fb5..00000000 --- a/login-workflow/example/cypress/e2e/self-reg-create-acct.cy.ts +++ /dev/null @@ -1,31 +0,0 @@ -/// -/// - -describe('self register create account', () => { - beforeEach(() => { - cy.visit('http://localhost:3000/custom-login-route'); - }); - - it('should display create account modal', () => { - cy.contains('Register now').click(); - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - cy.contains('Create an Account'); - }); - - it('should allow user to submit create account', () => { - cy.contains('Register now').click(); - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - cy.get('#email').click().type('test@test.com'); - cy.contains('Next').should('be.enabled').click(); - }); - - it('should not allow user to submit invalid create account', () => { - cy.contains('Register now').click(); - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - cy.get('#email').click().type('test@test'); - cy.contains('Next').should('be.disabled'); - }); -}); diff --git a/login-workflow/example/cypress/e2e/self-reg-data-retained.cy.ts b/login-workflow/example/cypress/e2e/self-reg-data-retained.cy.ts deleted file mode 100644 index 93eeba2d..00000000 --- a/login-workflow/example/cypress/e2e/self-reg-data-retained.cy.ts +++ /dev/null @@ -1,32 +0,0 @@ -/// -/// - -describe('self reg data retained on navigation', () => { - beforeEach(() => { - cy.visit('http://localhost:3000/custom-login-route'); - }); - - it('should display entry data navigating back', () => { - cy.contains('Register now').click(); - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - cy.get('#email').click().type('test@test.com'); - cy.contains('Next').should('be.enabled').click(); - cy.get('#code').click().type('123'); - cy.contains('Next').should('be.enabled').click(); - cy.get('#password').click().type('Test321!'); - cy.get('#confirm').click().type('Test321!'); - cy.contains('Next').should('be.enabled').click(); - cy.get('#first').click().type('fName'); - cy.get('#last').click().type('lName'); - cy.contains('Back').should('be.enabled').click(); - cy.get('#password').invoke('prop', 'type').should('contain', 'password'); - cy.get('#confirm').invoke('prop', 'type').should('contain', 'password'); - cy.contains('Back').should('be.enabled').click(); - cy.get('#code').click().invoke('prop', 'value').should('contain', '123'); - cy.contains('Back').should('be.enabled').click(); - cy.get('#email').click().invoke('prop', 'value').should('contain', 'test@test.com'); - cy.contains('Back').should('be.enabled').click(); - cy.get('[type="checkbox"]').should('be.checked'); - }); -}); diff --git a/login-workflow/example/cypress/e2e/self-reg-english.cy.ts b/login-workflow/example/cypress/e2e/self-reg-english.cy.ts deleted file mode 100644 index af24d410..00000000 --- a/login-workflow/example/cypress/e2e/self-reg-english.cy.ts +++ /dev/null @@ -1,35 +0,0 @@ -/// -/// - -describe('Language spanish', () => { - beforeEach(() => { - cy.visit('http://localhost:3000/custom-login-route'); - }); - - it('should display self register in english', () => { - cy.contains('Change Language-EN').click(); - cy.contains('Register now!').click(); - cy.get('.MuiCardHeader-root').should('contain', 'License Agreement'); - cy.contains('I have read and agree to the Terms & Conditions'); - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - cy.get('.MuiCardHeader-root').should('contain', 'Create an Account'); - cy.get('#email-label').should('contain', 'Email Address'); - cy.get('#email').type('test@test.com'); - cy.contains('Next').should('be.enabled').click(); - cy.get('.MuiCardHeader-root').should('contain', 'Verify Email'); - cy.get('#code-label').should('contain', 'Verification Code'); - cy.get('#code').click().type('123'); - cy.contains('Resend Verification Email').should('be.enabled').click(); - cy.contains('Next').should('be.enabled').click(); - cy.get('.MuiCardHeader-root').should('contain', 'Create Password'); - cy.get('#password').click().type('Test321!'); - cy.get('#confirm').click().type('Test321!'); - cy.contains('Next').should('be.enabled').click(); - cy.get('.MuiCardHeader-root').should('contain', 'Account Details'); - cy.get('#first').click().type('fName'); - cy.get('#last').click().type('lName'); - cy.contains('Next').should('be.enabled').click(); - cy.get('.MuiCardHeader-root').should('contain', 'Account Created!'); - }); -}); diff --git a/login-workflow/example/cypress/e2e/self-reg-eula.cy.ts b/login-workflow/example/cypress/e2e/self-reg-eula.cy.ts deleted file mode 100644 index ac1db16e..00000000 --- a/login-workflow/example/cypress/e2e/self-reg-eula.cy.ts +++ /dev/null @@ -1,24 +0,0 @@ -/// -/// - -describe('self-register EULA', () => { - beforeEach(() => { - cy.visit('http://localhost:3000/custom-login-route'); - }); - - it('should display EULA modal', () => { - cy.contains('Register now').click(); - cy.contains('License Agreement'); - }); - - it('should allow user to accept EULA agreement', () => { - cy.contains('Register now').click(); - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - }); - - it('should not allow user to create account without accept EULA', () => { - cy.contains('Register now').click(); - cy.contains('Next').should('be.disabled'); - }); -}); diff --git a/login-workflow/example/cypress/e2e/self-reg-french.cy.ts b/login-workflow/example/cypress/e2e/self-reg-french.cy.ts deleted file mode 100644 index 97650ec1..00000000 --- a/login-workflow/example/cypress/e2e/self-reg-french.cy.ts +++ /dev/null @@ -1,35 +0,0 @@ -/// -/// - -describe('Language spanish', () => { - beforeEach(() => { - cy.visit('http://localhost:3000/custom-login-route'); - }); - - it('should display self register in french', () => { - cy.contains('Change Language-FR').click(); - cy.contains('Créer un compte').click(); - cy.contains('Accord de Licence'); - cy.contains('accepte les conditions'); - cy.get('[type="checkbox"]').check(); - cy.contains('Prochain').should('be.enabled').click(); - cy.contains('Créer un compte'); - cy.get('#email-label').should('contain', 'Adresse e-mail'); - cy.get('#email').type('test@test.com'); - cy.contains('Prochain').should('be.enabled').click(); - cy.contains('Vérifier les courriels'); - cy.get('#code-label').should('contain', 'Code de vérification'); - cy.get('#code').click().type('123'); - cy.contains('Renvoyer').should('be.enabled').click(); - cy.contains('Prochain').should('be.enabled').click(); - cy.contains('Créer un Mot de Passe'); - cy.get('#password').click().type('Test321!'); - cy.get('#confirm').click().type('Test321!'); - cy.contains('Prochain').should('be.enabled').click(); - cy.contains('Détails du Compte'); - cy.get('#first').click().type('fName'); - cy.get('#last').click().type('lName'); - cy.contains('Prochain').should('be.enabled').click(); - cy.contains('Compte Créé!'); - }); -}); diff --git a/login-workflow/example/cypress/e2e/self-reg-password.cy.ts b/login-workflow/example/cypress/e2e/self-reg-password.cy.ts deleted file mode 100644 index d077809f..00000000 --- a/login-workflow/example/cypress/e2e/self-reg-password.cy.ts +++ /dev/null @@ -1,47 +0,0 @@ -/// -/// - -describe('self register create password', () => { - beforeEach(() => { - cy.visit('http://localhost:3000/custom-login-route'); - }); - - it('should display create password modal', () => { - cy.contains('Register now').click(); - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - cy.get('#email').click().type('test@test.com'); - cy.contains('Next').should('be.enabled').click(); - cy.get('#code').click().type('123'); - cy.contains('Next').should('be.enabled').click(); - cy.contains('Create Password'); - }); - - it('should allow user to submit create password', () => { - cy.contains('Register now').click(); - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - cy.get('#email').click().type('test@test.com'); - cy.contains('Next').should('be.enabled').click(); - cy.get('#code').click().type('123'); - cy.contains('Next').should('be.enabled').click(); - cy.contains('Create Password'); - cy.get('#password').click().type('Test321!'); - cy.get('#confirm').click().type('Test321!'); - cy.contains('Next').should('be.enabled').click(); - }); - - it('should not allow user to submit invalid create password', () => { - cy.contains('Register now').click(); - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - cy.get('#email').click().type('test@test.com'); - cy.contains('Next').should('be.enabled').click(); - cy.get('#code').click().type('123'); - cy.contains('Next').should('be.enabled').click(); - cy.contains('Create Password'); - cy.get('#password').click().type('test321'); - cy.get('#confirm').click().type('test321'); - cy.contains('Next').should('be.disabled'); - }); -}); diff --git a/login-workflow/example/cypress/e2e/self-reg-portuguese.cy.ts b/login-workflow/example/cypress/e2e/self-reg-portuguese.cy.ts deleted file mode 100644 index fed30fd5..00000000 --- a/login-workflow/example/cypress/e2e/self-reg-portuguese.cy.ts +++ /dev/null @@ -1,35 +0,0 @@ -/// -/// - -describe('Language spanish', () => { - beforeEach(() => { - cy.visit('http://localhost:3000/custom-login-route'); - }); - - it('should display self register in portuguese', () => { - cy.contains('Change Language-PT').click(); - cy.contains('Criar Conta').click(); - cy.get('.MuiCardHeader-root').should('contain', 'Licença'); - cy.contains('Li e concordo com os Termos e Condições'); - cy.get('[type="checkbox"]').check(); - cy.contains('Próximo').should('be.enabled').click(); - cy.get('.MuiCardHeader-root').should('contain', 'Criar conta'); - cy.get('#email-label').should('contain', 'E-mail'); - cy.get('#email').type('test@test.com'); - cy.contains('Próximo').should('be.enabled').click(); - cy.get('.MuiCardHeader-root').should('contain', 'Verificar E-mail'); - cy.get('#code-label').should('contain', 'Código de verificação'); - cy.get('#code').click().type('123'); - cy.contains('Reenviar e-mail').should('be.enabled').click(); - cy.contains('Próximo').should('be.enabled').click(); - cy.get('.MuiCardHeader-root').should('contain', 'Criar palavra-passe'); - cy.get('#password').click().type('Test321!'); - cy.get('#confirm').click().type('Test321!'); - cy.contains('Próximo').should('be.enabled').click(); - cy.get('.MuiCardHeader-root').should('contain', 'Detalhes de conta'); - cy.get('#first').click().type('fName'); - cy.get('#last').click().type('lName'); - cy.contains('Próximo').should('be.enabled').click(); - cy.get('.MuiCardHeader-root').should('contain', 'Conta criada!'); - }); -}); diff --git a/login-workflow/example/cypress/e2e/self-reg-spanish.cy.ts b/login-workflow/example/cypress/e2e/self-reg-spanish.cy.ts deleted file mode 100644 index 6760f7cb..00000000 --- a/login-workflow/example/cypress/e2e/self-reg-spanish.cy.ts +++ /dev/null @@ -1,38 +0,0 @@ -/// -/// - -describe('Language spanish', () => { - beforeEach(() => { - cy.visit('http://localhost:3000/custom-login-route'); - }); - - it('should display self register in spanish', () => { - cy.contains('Change Language-ES').click(); - cy.contains('Recordar contraseña'); - cy.contains('Iniciar sesión'); - cy.contains('Crear una cuenta').click(); - cy.contains('Acuerdo de licencia'); - cy.contains('He leído y acepto los Términos y condiciones'); - cy.get('[type="checkbox"]').check(); - cy.contains('Siguiente').should('be.enabled').click(); - cy.contains('Crear una cuenta'); - cy.get('#email-label').should('contain', 'Correo electrónico'); - cy.get('#email').type('test@test.com'); - cy.contains('Siguiente').should('be.enabled').click(); - cy.contains('Verificar correo electrónico'); - cy.get('#code-label').should('contain', 'Código de verificación'); - cy.get('#code').click().type('123'); - cy.contains('Reenviar correo electrónico de verificación').should('be.enabled').click(); - cy.contains('Siguiente').should('be.enabled').click(); - cy.contains('Crear contraseña'); - cy.get('#password').click().type('Test321!'); - cy.get('#confirm').click().type('Test321!'); - cy.contains('Siguiente').should('be.enabled').click(); - cy.contains('Detalles de la cuenta'); - cy.get('#first').click().type('fName'); - cy.get('#last').click().type('lName'); - cy.contains('Siguiente').should('be.enabled').click(); - cy.contains('¡Cuenta creada!'); - cy.contains('Seguir').should('be.enabled').click(); - }); -}); diff --git a/login-workflow/example/cypress/e2e/self-reg-success.cy.ts b/login-workflow/example/cypress/e2e/self-reg-success.cy.ts deleted file mode 100644 index 0070af04..00000000 --- a/login-workflow/example/cypress/e2e/self-reg-success.cy.ts +++ /dev/null @@ -1,28 +0,0 @@ -/// -/// - -describe('self register successful registration', () => { - beforeEach(() => { - cy.visit('http://localhost:3000/custom-login-route'); - }); - - it('should display log in when successful registration completes', () => { - cy.contains('Register now').click(); - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - cy.get('#email').click().type('test@test.com'); - cy.contains('Next').should('be.enabled').click(); - cy.get('#code').click().type('123'); - cy.contains('Next').should('be.enabled').click(); - cy.contains('Create Password'); - cy.get('#password').click().type('Test321!'); - cy.get('#confirm').click().type('Test321!'); - cy.contains('Next').should('be.enabled').click(); - cy.get('#first').click().type('fName'); - cy.get('#last').click().type('lName'); - cy.contains('Next').should('be.enabled').click(); - cy.get('[data-test="frame"]').should('contain', 'Welcome, fName lName'); - cy.contains('Continue').should('be.enabled').click(); - cy.contains('Log In'); - }); -}); diff --git a/login-workflow/example/cypress/e2e/self-reg-verify-email.cy.ts b/login-workflow/example/cypress/e2e/self-reg-verify-email.cy.ts deleted file mode 100644 index 2df12faf..00000000 --- a/login-workflow/example/cypress/e2e/self-reg-verify-email.cy.ts +++ /dev/null @@ -1,36 +0,0 @@ -/// -/// - -describe('self register verify email', () => { - beforeEach(() => { - cy.visit('http://localhost:3000/custom-login-route'); - }); - - it('should display verify email modal', () => { - cy.contains('Register now').click(); - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - cy.get('#email').click().type('test@test.com'); - cy.contains('Next').should('be.enabled').click(); - cy.contains('Verify Email'); - }); - - it('should allow user to submit verify email', () => { - cy.contains('Register now').click(); - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - cy.get('#email').click().type('test@test.com'); - cy.contains('Next').should('be.enabled').click(); - cy.get('#code').click().type('123'); - cy.contains('Next').should('be.enabled').click(); - }); - - it('should not allow user to submit verify email', () => { - cy.contains('Register now').click(); - cy.get('[type="checkbox"]').check(); - cy.contains('Next').should('be.enabled').click(); - cy.get('#email').click().type('test@test.com'); - cy.contains('Next').should('be.enabled').click(); - cy.contains('Next').should('be.disabled'); - }); -}); diff --git a/login-workflow/example/cypress/support/commands.ts b/login-workflow/example/cypress/support/commands.ts deleted file mode 100644 index eeee3ca7..00000000 --- a/login-workflow/example/cypress/support/commands.ts +++ /dev/null @@ -1,39 +0,0 @@ -/// - -import 'cypress-localstorage-commands'; -// *********************************************** -// This example commands.ts shows you how to -// create various custom commands and overwrite -// existing commands. -// -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** -// -// -// -- This is a parent command -- -// Cypress.Commands.add('login', (email, password) => { ... }) -// -// -// -- This is a child command -- -// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) -// -// -// -- This is a dual command -- -// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) -// -// -// -- This will overwrite an existing command -- -// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) -// -// declare global { -// namespace Cypress { -// interface Chainable { -// login(email: string, password: string): Chainable -// drag(subject: string, options?: Partial): Chainable -// dismiss(subject: string, options?: Partial): Chainable -// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable -// } -// } -// } diff --git a/login-workflow/example/cypress/support/e2e.ts b/login-workflow/example/cypress/support/e2e.ts deleted file mode 100644 index ee59576e..00000000 --- a/login-workflow/example/cypress/support/e2e.ts +++ /dev/null @@ -1,23 +0,0 @@ -// *********************************************************** -// This example support/e2e.ts is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** - -// Import commands.js using ES2015 syntax: -import './commands'; - -// Alternatively you can use CommonJS syntax: -// require('./commands') - -// cypress code coverage -import '@cypress/code-coverage/support'; diff --git a/login-workflow/example/package.json b/login-workflow/example/package.json index 3fe5e046..ddc83ec7 100644 --- a/login-workflow/example/package.json +++ b/login-workflow/example/package.json @@ -2,44 +2,15 @@ "name": "example", "version": "0.1.0", "private": true, - "dependencies": { - "@brightlayer-ui/colors": "^3.0.1", - "@brightlayer-ui/icons-mui": "^3.2.0", - "@brightlayer-ui/react-components": "^6.1.2-alpha.0", - "@brightlayer-ui/react-themes": "^7.1.0-alpha.0", - "@emotion/react": "^11.7.1", - "@emotion/styled": "^11.10.4", - "@mui/icons-material": "^5.10.16", - "@mui/material": "^5.10.15", - "@testing-library/jest-dom": "^5.0.0", - "@testing-library/react": "^13.3.0", - "@testing-library/user-event": "^14.4.3", - "@types/jest": "^29.0.0", - "@types/node": "^17.0.23", - "@types/react": "^18.0.25", - "@types/react-dom": "^18.0.0", - "date-fns": "^2.29.2", - "i18next": "^20.0.0", - "react": "^18.2.0", - "react-app-polyfill": "^3.0.0", - "react-dom": "^18.0.0", - "react-i18next": "^12.0.0", - "react-router-dom": "^6.3.0", - "react-scripts": "^5.0.0", - "typescript": "^4.3.2" - }, "scripts": { - "start": "react-scripts -r @cypress/instrument-cra start", + "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject", "lint": "eslint \"src/**/**.{ts,tsx}\"", "lint:fix": "eslint \"src/**/**.{ts,tsx}\" --fix", "prettier": "prettier \"src/**/**.{ts,tsx,js,jsx,json,css,scss,html}\" --write", - "prettier:check": "prettier \"src/**/**.{ts,tsx,js,jsx,json,css,scss,html}\" --check", - "cy:run": "cypress run --config video=false", - "cypress:open": "cypress open", - "cytest": "start-server-and-test start http://localhost:3000 cy:run" + "prettier:check": "prettier \"src/**/**.{ts,tsx,js,jsx,json,css,scss,html}\" --check" }, "eslintConfig": { "extends": "react-app" @@ -60,31 +31,45 @@ "not ie 9-10" ] }, + "dependencies": { + "@brightlayer-ui/colors": "^3.0.1", + "@brightlayer-ui/icons-mui": "^3.3.0", + "@brightlayer-ui/react-components": "^6.1.2", + "@brightlayer-ui/react-themes": "^7.1.0", + "@emotion/react": "^11.7.1", + "@emotion/styled": "^11.10.8", + "@mui/icons-material": "^5.11.11", + "@mui/material": "^5.10.15", + "@types/node": "^17.0.23", + "@types/react": "^18.0.31", + "@types/react-dom": "^18.0.0", + "date-fns": "^2.29.2", + "i18next": "^23.2.11", + "react": "^18.2.0", + "react-app-polyfill": "^3.0.0", + "react-dom": "^18.0.0", + "react-i18next": "^13.0.3", + "react-router-dom": "^6.8.0", + "react-scripts": "^5.0.0", + "typescript": "^4.3.2" + }, "devDependencies": { "@brightlayer-ui/eslint-config": "^3.0.0", "@brightlayer-ui/prettier-config": "^1.0.3", - "@cypress/code-coverage": "^3.10.0", - "@cypress/instrument-cra": "^1.4.0", - "@emotion/css": "^11.10.0", - "@typescript-eslint/eslint-plugin": "^5.38.0", - "@typescript-eslint/parser": "^5.41.0", + "@emotion/css": "^11.11.2", + "@testing-library/jest-dom": "^5.0.0", + "@testing-library/react": "^13.3.0", + "@testing-library/user-event": "^14.4.3", + "@types/jest": "^29.2.4", + "@typescript-eslint/eslint-plugin": "^5.54.0", + "@typescript-eslint/parser": "^5.49.0", "babel-plugin-istanbul": "^6.1.1", - "cypress": "^10.8.0", - "cypress-localstorage-commands": "^2.2.1", - "eslint": "^8.12.0", + "eslint": "^8.31.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-react": "^7.30.1", "jest": "29.3.1", - "prettier": "^2.3.1", - "start-server-and-test": "^1.14.0", + "prettier": "^2.8.1", "yarn-audit-fix": "^9.3.5" }, - "prettier": "@brightlayer-ui/prettier-config", - "nyc": { - "exclude": [ - "src/serviceWorker.ts" - ], - "excludeAfterRemap": true, - "report-dir": "../cypress-coverage" - } + "prettier": "@brightlayer-ui/prettier-config" } diff --git a/login-workflow/example/src/App.tsx b/login-workflow/example/src/App.tsx index 9b80e373..49d70c60 100644 --- a/login-workflow/example/src/App.tsx +++ b/login-workflow/example/src/App.tsx @@ -1,154 +1,90 @@ -import React from 'react'; -import { - SecurityContextProvider, - AuthNavigationContainer, - AuthUIContextProvider, - useSecurityActions, - // RegistrationData, -} from '@brightlayer-ui/react-auth-workflow'; -import { ProjectAuthUIActions } from './actions/AuthUIActions'; -import { ProjectRegistrationUIActions } from './actions/RegistrationUIActions'; -import { ExampleHome } from './screens/ExampleHome'; -// import { CustomDetailsScreen, CustomDetailsScreenTwo } from './components/CustomDetailsScreen'; -import { routes } from './navigation/Routing'; -import productLogo from './assets/images/eaton_stacked_logo.png'; -// import { -// CustomAccountAlreadyExistsScreen, -// CustomRegistrationSuccessScreen, -// } from './screens/ExampleRegistrationSuccess'; +import React, { useState, useEffect } from 'react'; +import { AppContext, AppContextType } from './contexts/AppContextProvider'; +import { BrowserRouter } from 'react-router-dom'; +import { AppRouter } from './navigation/AppRouter'; +import { I18nextProvider } from 'react-i18next'; +import i18nAppInstance from './translations/i18n'; +import { LocalStorage } from './store/local-storage'; +import { Box, CircularProgress, SxProps, Theme } from '@mui/material'; -// Imports for internationalization -import i18n from 'i18next'; -import Button from '@mui/material/Button'; -import { useTranslation } from 'react-i18next'; -import { Navigate, Route } from 'react-router-dom'; -import { ExamplePreAuth } from './screens/ExamplePreAuth'; -import { AppBar, Box, Toolbar, Typography } from '@mui/material'; -import { Outlet } from 'react-router'; +const containerStyles: SxProps = { + width: '100%', + height: (t) => ({ xs: `calc(100vh - ${t.spacing(7)})`, md: `calc(100vh - ${t.spacing(8)})` }), + display: 'flex', + padding: 0, + overflow: 'auto', + position: 'relative', + flexDirection: 'column', + alignItems: 'center', + justifyContent: 'center', +}; -// Uncomment these lines to add your app-specific translation resource -i18n.addResourceBundle('en', 'app', { BUTTONLABEL: 'Change Language' }); -i18n.addResourceBundle('es', 'app', { BUTTONLABEL: '¡Cambia el idioma!' }); -i18n.addResourceBundle('fr', 'app', { BUTTONLABEL: 'Changez de Langue' }); +const emptyStateContainerStyles = { + margin: 'auto', + display: 'flex', + zIndex: 4, + position: 'absolute', + alignItems: 'center', + justifyContent: 'center', +}; -// Uncomment these lines to override workflow strings / translations -i18n.addResourceBundle('en', 'blui', { ACTIONS: { CREATE_ACCOUNT: 'Register now!' } }, true, true); -// i18n.addResourceBundle('es', 'blui', { ACTIONS: { CREATE_ACCOUNT: '¡Regístrate ahora!' } }, true, true); -// i18n.addResourceBundle('fr', 'blui', { ACTIONS: { CREATE_ACCOUNT: `S'inscrire maintenant!` } }, true, true); +export const App = (): JSX.Element => { + const [isAuthenticated, setIsAuthenticated] = useState(false); + const [language, setLanguage] = useState(window.localStorage.getItem('app-i18nextLng')?.toString() ?? 'en'); + const [loginData, setLoginData] = useState({ + email: '', + rememberMe: false, + }); + const [showChangePasswordDialog, setShowChangePasswordDialog] = useState(false); -export const AuthUIConfiguration: React.FC = (props) => { - const securityContextActions = useSecurityActions(); - const { t } = useTranslation(); + const [isLoading, setIsLoading] = useState(true); - return ( - - - - - - - + // handle initialization of auth data on first load + useEffect(() => { + const initialize = async (): Promise => { + try { + const userData = await LocalStorage.readAuthData(); + setLoginData({ email: userData.rememberMeData.user, rememberMe: userData.rememberMeData.rememberMe }); + setIsAuthenticated(Boolean(userData.userId)); + } catch (e) { + // handle any error state, rejected promises, etc.. + } finally { + setIsLoading(false); } - // loginType={'username'} - // Uncomment this line to see how to add custom form fields to the registration screens - // customAccountDetails={[ - // { component: CustomDetailsScreen }, - // { - // component: CustomDetailsScreenTwo, - // title: 'Job Info', - // instructions: 'Enter your employment information below.', - // }, - // ]} - // registrationSuccessScreen={(registrationData: RegistrationData): JSX.Element => ( - // - // )} - // accountAlreadyExistsScreen={(): JSX.Element => } - // registrationConfig={{ - // firstName: { - // maxLength: 30, - // }, - // lastName: { - // maxLength: 30, - // }, - // }} - > - {props.children} - - ); -}; + }; + // eslint-disable-next-line + initialize(); + }, []); -export const MySharedWrapper: React.FC = () => ( - <> - - - PAGE TITLE - - - - -); -export const MyAppRoutes = ( - <> - } /> - {/* } /> - Nested} /> */} - } /> - -); - -export const App: React.FC = () => ( - - - } key={'pre-auth'} />]} + return isLoading ? ( + + + + ) : ( + + { + setIsAuthenticated(true); + setLoginData(userData); + }, + // eslint-disable-next-line + onUserNotAuthenticated: (userData): void => { + setIsAuthenticated(false); + }, + loginData, + setLoginData, + language, + setLanguage, + showChangePasswordDialog, + setShowChangePasswordDialog, + }} > - }*/>{MyAppRoutes} - - - -); + + + + + + ); +}; diff --git a/login-workflow/example/src/actions/AuthUIActions.tsx b/login-workflow/example/src/actions/AuthUIActions.tsx index e3e516a9..bb8d9dcd 100644 --- a/login-workflow/example/src/actions/AuthUIActions.tsx +++ b/login-workflow/example/src/actions/AuthUIActions.tsx @@ -1,5 +1,6 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { AuthUIActions, SecurityContextActions } from '@brightlayer-ui/react-auth-workflow'; +import { AuthUIActions } from '@brightlayer-ui/react-auth-workflow'; +import { AppContextType } from '../contexts/AppContextProvider'; import { LocalStorage } from '../store/local-storage'; const sleep = (ms: number): Promise => new Promise((resolve) => setTimeout(resolve, ms)); @@ -13,8 +14,7 @@ function isRandomFailure(): boolean { return false; // randomResponseNumber < 10; } -type AuthUIActionsFunction = () => AuthUIActions; -type AuthUIActionsWithSecurity = (securityHelper: SecurityContextActions) => AuthUIActionsFunction; +type AuthUIActionsWithApp = (appHelper: AppContextType) => AuthUIActions; /** * Example implementation of [[AuthUIActions]] to start with during development. @@ -23,7 +23,7 @@ type AuthUIActionsWithSecurity = (securityHelper: SecurityContextActions) => Aut * appropriate actions (often api calls, local network storage, credential updates, etc) and update * the global security state based on the actionable needs of the user. */ -export const ProjectAuthUIActions: AuthUIActionsWithSecurity = (securityHelper) => (): AuthUIActions => ({ +export const ProjectAuthUIActions: AuthUIActionsWithApp = (appHelper) => ({ /** * Initialize the application security state. This will involve reading any local storage, * validating existing credentials (token expiration, for example). At the end of validation, @@ -48,16 +48,15 @@ export const ProjectAuthUIActions: AuthUIActionsWithSecurity = (securityHelper) // After restoring token, we may need to validate it in production apps // This will switch to the App screen or Auth screen and this loading // screen will be unmounted and thrown away. - // securityHelper.onUserAuthenticated() if (authData?.email !== undefined) { - securityHelper.onUserAuthenticated({ + appHelper.onUserAuthenticated({ email: authData?.email, userId: authData.userId ?? '', rememberMe: authData?.rememberMeData.rememberMe, }); } else { const rememberMeEmail = authData?.rememberMeData.rememberMe ? authData?.rememberMeData.user : undefined; - securityHelper.onUserNotAuthenticated(false, rememberMeEmail); + appHelper.onUserNotAuthenticated(false, rememberMeEmail); } }, /** @@ -97,7 +96,7 @@ export const ProjectAuthUIActions: AuthUIActionsWithSecurity = (securityHelper) LocalStorage.saveAuthCredentials(email, email); LocalStorage.saveRememberMeData(email, rememberMe); - securityHelper.onUserAuthenticated({ email: email, userId: email, rememberMe: rememberMe }); + appHelper.onUserAuthenticated({ email: email, userId: email, rememberMe: rememberMe }); }, /** * The user has forgotten their password and wants help. @@ -132,7 +131,6 @@ export const ProjectAuthUIActions: AuthUIActionsWithSecurity = (securityHelper) if (isRandomFailure()) { throw new Error('Sorry, there was a problem sending your request.'); } - return; }, /** @@ -174,7 +172,6 @@ export const ProjectAuthUIActions: AuthUIActionsWithSecurity = (securityHelper) if (isRandomFailure()) { throw new Error('Sorry, there was a problem sending your request.'); } - return; }, }); diff --git a/login-workflow/example/src/actions/RegistrationUIActions.tsx b/login-workflow/example/src/actions/RegistrationUIActions.tsx index d57c1462..200b593b 100644 --- a/login-workflow/example/src/actions/RegistrationUIActions.tsx +++ b/login-workflow/example/src/actions/RegistrationUIActions.tsx @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { RegistrationUIActions, AccountDetailInformation } from '@brightlayer-ui/react-auth-workflow'; +import { RegistrationUIActions, AccountDetails } from '@brightlayer-ui/react-auth-workflow'; // Constants import { SAMPLE_EULA } from '../constants/sampleEula'; @@ -30,7 +30,7 @@ export const ProjectRegistrationUIActions: () => RegistrationUIActions = () => ( * * @returns Resolve with EULA, otherwise reject with an error message. */ - loadEULA: async (language: string): Promise => { + loadEula: async (language: string): Promise => { await sleep(1000); if (isRandomFailure()) { @@ -45,20 +45,43 @@ export const ProjectRegistrationUIActions: () => RegistrationUIActions = () => ( }, /** - * The user entered their email address and accepted the EULA. - * The API should now send them an email with the validation code. + * The user accepted the EULA. + * The API should now update accepted EULA. * - * @param email Email for the registering user. * * @returns Resolve when the server accepted the request. */ - requestRegistrationCode: async (email: string): Promise => { + acceptEula: async (): Promise => { await sleep(800); if (isRandomFailure()) { throw new Error('Sorry, there was a problem sending your request.'); } }, + requestRegistrationCode: async (email: string): Promise => { + await sleep(800); + if (isRandomFailure()) { + throw new Error('Sorry, there was a problem sending your request.'); + } + return 'a1b2c3'; + }, + + createPassword: async (password: string): Promise => { + await sleep(800); + if (isRandomFailure()) { + throw new Error('Sorry, there was a problem sending your request.'); + } + return true; + }, + + setAccountDetails: async (details: AccountDetails): Promise => { + await sleep(800); + if (isRandomFailure()) { + throw new Error('Sorry, there was a problem sending your request.'); + } + return true; + }, + /** * The user has tapped on an email link inviting them to register with the application. * The application should validate the code provided by the link. @@ -69,35 +92,19 @@ export const ProjectRegistrationUIActions: () => RegistrationUIActions = () => ( * @returns Resolves when the code is valid. True if registration is complete, False if account information is needed. * If the code is not valid a rejection will occur with an error message. */ - validateUserRegistrationRequest: async (validationCode: string, validationEmail?: string): Promise => { + validateUserRegistrationRequest: async ( + validationCode: string, + validationEmail?: string + ): Promise<{ codeValid: boolean | string; accountExists?: boolean }> => { await sleep(800); if (isRandomFailure()) { throw new Error('Sorry, there was a problem sending your request.'); } - return isRandomFailure(); + return { codeValid: true, accountExists: false }; }, - /** - * The user has been invited to register and has entered the necessary account and - * password information. - * The application should now complete the registration process given the user's data. - * - * Note: Upon resolution, the user will be brought back to the Login screen. - * - * @param userData Account details and password entered by the user. - * @param validationCode Registration code provided from the invitation email link. - * @param validationEmail Email provided from the invitation email link (optional) `?email=addr%40domain.com`. - * - * @returns Resolve when account creation succeeds, otherwise reject with an error message. - */ - completeRegistration: async ( - userData: { - password: string; - accountDetails: AccountDetailInformation; - }, - validationCode: string, - validationEmail?: string - ): Promise<{ email: string; organizationName: string }> => { + + completeRegistration: async (userData: object): Promise<{ email: string; organizationName: string }> => { const email = 'example@email.com'; const organizationName = 'Acme Co.'; const userInfo = { email, organizationName }; diff --git a/login-workflow/example/src/components/ChangePassword.tsx b/login-workflow/example/src/components/ChangePassword.tsx new file mode 100644 index 00000000..ea145a38 --- /dev/null +++ b/login-workflow/example/src/components/ChangePassword.tsx @@ -0,0 +1,25 @@ +import React from 'react'; +import { ChangePasswordDialog } from '@brightlayer-ui/react-auth-workflow'; +import { useApp } from '../contexts/AppContextProvider'; +import { LocalStorage } from '../store/local-storage'; +import { useNavigate } from 'react-router-dom'; + +export const ChangePassword = (): JSX.Element => { + const app = useApp(); + const navigate = useNavigate(); + const logOut = (): void => { + app.setShowChangePasswordDialog(false); + LocalStorage.clearAuthCredentials(); + app.onUserNotAuthenticated(); + navigate('/login'); + }; + + return ( + app.setShowChangePasswordDialog(false)} + onSubmit={(): void => app.setShowChangePasswordDialog(false)} + onFinish={(): void => logOut()} + /> + ); +}; diff --git a/login-workflow/example/src/components/CustomDetailsScreen.tsx b/login-workflow/example/src/components/CustomDetailsScreen.tsx deleted file mode 100644 index ee6de13d..00000000 --- a/login-workflow/example/src/components/CustomDetailsScreen.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import React, { useEffect, useRef, useState } from 'react'; -import { Theme, useTheme } from '@mui/material/styles'; -import TextField from '@mui/material/TextField'; -import { AccountDetailsFormProps } from '@brightlayer-ui/react-auth-workflow'; - -export const TextFieldStyles = (theme: Theme) => ({ - mt: 4, - [theme.breakpoints.down('sm')]: { - mt: 3, - }, -}); - -export const CustomDetailsScreen: React.FC> = (props) => { - const { onDetailsChanged, initialDetails, onSubmit } = props; - const [country, setCountry] = useState(initialDetails ? initialDetails.country : ''); - const [currency, setCurrency] = useState(initialDetails ? initialDetails.currency : ''); - - const countryRef = useRef(null); - const currencyRef = useRef(null); - const theme = useTheme(); - - useEffect((): void => { - // validation checks - const valid = country !== ''; - onDetailsChanged({ country, currency }, valid); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [currency, country]); // Do NOT include onDetailsChanged in the dependencies array here or you will run into an infinite loop of updates - - return ( - <> - setCountry(evt.target.value)} - onKeyPress={(e): void => { - if (e.key === 'Enter' && currencyRef.current) currencyRef.current.focus(); - }} - /> - setCurrency(evt.target.value)} - onKeyPress={(e): void => { - if (e.key === 'Enter' && onSubmit) onSubmit(); - }} - /> - - ); -}; - -export const CustomDetailsScreenTwo: React.FC> = (props) => { - const { onDetailsChanged, initialDetails, onSubmit } = props; - const [company, setCompany] = useState(initialDetails ? initialDetails.company : ''); - const [role, setRole] = useState(initialDetails ? initialDetails.role : ''); - const theme = useTheme(); - - const companyRef = useRef(null); - const roleRef = useRef(null); - - useEffect((): void => { - onDetailsChanged({ company, role }, true); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [role, company]); // Do NOT include onDetailsChanged in the dependencies array here or you will run into an infinite loop of updates - - return ( - <> - setCompany(evt.target.value)} - onKeyPress={(e): void => { - if (e.key === 'Enter' && roleRef.current) roleRef.current.focus(); - }} - /> - setRole(evt.target.value)} - onKeyPress={(e): void => { - if (e.key === 'Enter' && onSubmit) onSubmit(); - }} - /> - - ); -}; diff --git a/login-workflow/example/src/components/DebugComponent.tsx b/login-workflow/example/src/components/DebugComponent.tsx new file mode 100644 index 00000000..cf457bc9 --- /dev/null +++ b/login-workflow/example/src/components/DebugComponent.tsx @@ -0,0 +1,68 @@ +import { Box, Button, Typography } from '@mui/material'; +import { Link } from 'react-router-dom'; +import React, { useState } from 'react'; +import { routes } from '../navigation/Routing'; +import { LanguageSelector } from './LanguageSelector'; + +const LinksWrapperStyles = { + textAlign: 'center', + pb: 4, +}; + +export const DebugComponent = (): JSX.Element => { + const [debugMode, setDebugMode] = useState(false); + + return ( + + + {debugMode && DEBUG MODE} + + + {debugMode && ( + <> + {' '} + + + + [Test Invite Register] + + + + + [Test Reset Password Email] + + + + + + + + )} + + ); +}; diff --git a/login-workflow/example/src/components/LanguageSelector.tsx b/login-workflow/example/src/components/LanguageSelector.tsx new file mode 100644 index 00000000..14f57d48 --- /dev/null +++ b/login-workflow/example/src/components/LanguageSelector.tsx @@ -0,0 +1,37 @@ +import React, { useState } from 'react'; +import { FormControl, InputLabel, MenuItem, Select, SelectChangeEvent, SelectProps } from '@mui/material'; +import i18n from '../translations/i18n'; +import { useApp } from '../contexts/AppContextProvider'; + +export const LanguageSelector = (props: SelectProps): JSX.Element => { + const supportedLanguages = ['en', 'fr', 'es', 'zh', 'pt']; + + const { language, setLanguage } = useApp(); + const [selectedLanguage, setSelectedLanguage] = useState(language); + + const changeAppLanguage = (event: SelectChangeEvent): void => { + const appLanguage = event.target.value; + setSelectedLanguage(appLanguage); + setLanguage(appLanguage); + void i18n.changeLanguage(appLanguage); + }; + + return ( + + {props.label && {props.label}} + + + ); +}; diff --git a/login-workflow/example/src/components/index.ts b/login-workflow/example/src/components/index.ts new file mode 100644 index 00000000..cb679c01 --- /dev/null +++ b/login-workflow/example/src/components/index.ts @@ -0,0 +1,2 @@ +export * from './DebugComponent'; +export * from './LanguageSelector'; diff --git a/login-workflow/example/src/contexts/AppContextProvider.tsx b/login-workflow/example/src/contexts/AppContextProvider.tsx new file mode 100644 index 00000000..05d58a97 --- /dev/null +++ b/login-workflow/example/src/contexts/AppContextProvider.tsx @@ -0,0 +1,29 @@ +import { createContext, useContext } from 'react'; + +export type LoginData = { + email: string; + rememberMe: boolean; +}; + +export type AppContextType = { + isAuthenticated: boolean; + loginData: LoginData; + onUserAuthenticated: (args: { email: string; userId: string; rememberMe: boolean }) => void; + onUserNotAuthenticated: (clearRememberMe?: boolean, overrideRememberMeEmail?: string) => void; + language: string; + setLanguage: (language: string) => void; + setLoginData: (args: LoginData) => void; + showChangePasswordDialog: boolean; + setShowChangePasswordDialog: (arg: boolean) => void; +}; + +export const AppContext = createContext(null); + +export const useApp = (): AppContextType => { + const context = useContext(AppContext); + + if (context === null) { + throw new Error('useApp must be used within a AppContextProvider'); + } + return context; +}; diff --git a/login-workflow/example/src/navigation/AppRouter.tsx b/login-workflow/example/src/navigation/AppRouter.tsx new file mode 100644 index 00000000..3d384b4b --- /dev/null +++ b/login-workflow/example/src/navigation/AppRouter.tsx @@ -0,0 +1,124 @@ +import React from 'react'; +import { + AuthContextProvider, + ContactSupportScreen, + ReactRouterAuthGuard, + ReactRouterGuestGuard, + ForgotPasswordScreen, + RegistrationContextProvider, + ResetPasswordScreen, + RegistrationWorkflow, +} from '@brightlayer-ui/react-auth-workflow'; +import { useApp } from '../contexts/AppContextProvider'; +import { useNavigate } from 'react-router'; +import { ProjectAuthUIActions } from '../actions/AuthUIActions'; +import { Navigate, Outlet, Route, Routes } from 'react-router-dom'; +import { Login } from '../screens/Login'; +import { ProjectRegistrationUIActions } from '../actions/RegistrationUIActions'; +import { routes } from './Routing'; +import { ExampleHome } from '../screens/ExampleHome'; +import i18nAppInstance from '../translations/i18n'; +import { ChangePassword } from '../components/ChangePassword'; + +export const AppRouter: React.FC = () => { + const navigate = useNavigate(); + const app = useApp(); + const { email, rememberMe } = app.loginData; + + return ( + + {/* AUTH ROUTES */} + + + + } + > + + + + } + /> + + + + } + /> + + + + } + /> + + + + } + /> + {/* USER APPLICATION ROUTES */} + + + {app.showChangePasswordDialog && } + + } + > + + + + } + /> + } /> + + + + + } + /> + + {/* REGISTRATION ROUTES */} + + + + } + > + } /> + } /> + + + ); +}; diff --git a/login-workflow/example/src/navigation/Routing.ts b/login-workflow/example/src/navigation/Routing.ts deleted file mode 100644 index c7b3433a..00000000 --- a/login-workflow/example/src/navigation/Routing.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { RouteConfig } from '@brightlayer-ui/react-auth-workflow'; - -export const routes: RouteConfig = { - LOGIN: '/custom-login-route', - FORGOT_PASSWORD: '/custom-forgot-password-route', - RESET_PASSWORD: '/custom-reset-password-route', - REGISTER_INVITE: '/custom-register-by-invite-route', - REGISTER_SELF: '/custom-self-registration-route', - SUPPORT: '/custom-contact-support-route', -}; diff --git a/login-workflow/example/src/navigation/Routing.tsx b/login-workflow/example/src/navigation/Routing.tsx new file mode 100644 index 00000000..c2b5f703 --- /dev/null +++ b/login-workflow/example/src/navigation/Routing.tsx @@ -0,0 +1,10 @@ +import { RouteConfig } from '@brightlayer-ui/react-auth-workflow'; + +export const routes: RouteConfig = { + LOGIN: '/login', + REGISTER_INVITE: '/register-by-invite?code=DEBUG_VALIDATION_CODE_DEADBEEF&email=example@example.com', + REGISTER_SELF: '/self-registration', + FORGOT_PASSWORD: '/forgot-password', + RESET_PASSWORD: '/reset-password', + SUPPORT: '/contact-support', +}; diff --git a/login-workflow/example/src/screens/ExampleHome.tsx b/login-workflow/example/src/screens/ExampleHome.tsx index 76657d36..ff45e7cd 100644 --- a/login-workflow/example/src/screens/ExampleHome.tsx +++ b/login-workflow/example/src/screens/ExampleHome.tsx @@ -1,32 +1,176 @@ -import React from 'react'; -import logo from './logo.svg'; -import './Home.css'; -import { useSecurityActions } from '@brightlayer-ui/react-auth-shared'; +import React, { useState } from 'react'; import { LocalStorage } from '../store/local-storage'; -import Button from '@mui/material/Button'; +import { useApp } from '../contexts/AppContextProvider'; +import { + DrawerLayout, + Drawer, + DrawerBody, + DrawerNavGroup, + DrawerNavItem, + DrawerHeader, + Spacer, + UserMenu, + EmptyState, +} from '@brightlayer-ui/react-components'; +import Box from '@mui/material/Box'; +import Event from '@mui/icons-material/Event'; +import Dashboard from '@mui/icons-material/Dashboard'; +import Notifications from '@mui/icons-material/Notifications'; +import Menu from '@mui/icons-material/Menu'; +import AccountBox from '@mui/icons-material/AccountBox'; +import ExitToApp from '@mui/icons-material/ExitToApp'; +import Avatar from '@mui/material/Avatar'; +import AppBar from '@mui/material/AppBar'; +import Toolbar from '@mui/material/Toolbar'; +import LockIcon from '@mui/icons-material/Lock'; +import Typography from '@mui/material/Typography'; +import { useTheme } from '@mui/material/styles'; +import { useTranslation } from 'react-i18next'; +import { useNavigate } from 'react-router-dom'; +import * as Colors from '@brightlayer-ui/colors'; +import FormControl from '@mui/material/FormControl'; +import { MenuItem, Select, SelectChangeEvent } from '@mui/material'; +import i18n from '../translations/i18n'; export const ExampleHome: React.FC = () => { - const securityHelper = useSecurityActions(); + const app = useApp(); + const supportedLanguages = ['en', 'fr', 'es', 'zh', 'pt']; + const { t } = useTranslation(); + const [open, setOpen] = useState(false); + const navigate = useNavigate(); + const theme = useTheme(); + + const containerStyles = { + width: '100%', + height: `calc(100vh - ${theme.spacing(8)})`, + display: 'flex', + padding: 0, + overflow: 'auto', + position: 'relative', + flexDirection: 'column', + alignItems: 'center', + justifyContent: 'center', + [theme.breakpoints.down('sm')]: { + height: `calc(100vh - ${theme.spacing(7)})`, + }, + }; + + const emptyStateContainerStyles = { + margin: 'auto', + display: 'flex', + zIndex: 4, + position: 'absolute', + alignItems: 'center', + justifyContent: 'center', + }; const logOut = (): void => { LocalStorage.clearAuthCredentials(); - securityHelper.onUserNotAuthenticated(); + app.onUserNotAuthenticated(); + navigate('/login'); + }; + + const changeAppLanguage = (event: SelectChangeEvent): void => { + const appLanguage = event.target.value; + app.setLanguage(appLanguage); + void i18n.changeLanguage(appLanguage); }; return ( -
-
- logo -

- Edit src/App.tsx and save to reload. -

- - -
-
+ <> + + } + onClick={(): void => setOpen(!open)} + /> + + + } + itemID="1" + /> + } + itemID="2" + /> + + + + } + > + + + + {`${t('TOOLBAR_MENU.HOME_PAGE')}`} + + + + + + + AV} + menuGroups={[ + { + items: [ + { + icon: , + title: `${t('USER_MENU.MY_ACCOUNT')}`, + onClick: (): void => {}, + }, + { + icon: , + title: `${t('USER_MENU.CHANGE_PASSWORD')}`, + onClick: (): any => { + app.setShowChangePasswordDialog(true); + }, + }, + { + icon: , + title: `${t('USER_MENU.LOG_OUT')}`, + onClick: (): void => { + logOut(); + }, + }, + ], + }, + ]} + /> + + + + + } + title={`${t('TOOLBAR_MENU.HOME_PAGE')}`} + description={`${t('PAGE_DETAILS.AUTHORISED_MESSAGE')}`} + /> + + + ); }; diff --git a/login-workflow/example/src/screens/ExamplePreAuth.tsx b/login-workflow/example/src/screens/ExamplePreAuth.tsx deleted file mode 100644 index fbdd7c6c..00000000 --- a/login-workflow/example/src/screens/ExamplePreAuth.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import React from 'react'; -import logo from './logo.svg'; -import './Home.css'; -import Button from '@mui/material/Button'; -import Typography from '@mui/material/Typography'; -import { useSecurityState } from '@brightlayer-ui/react-auth-shared'; -import { Link } from 'react-router-dom'; - -export const ExamplePreAuth: React.FC = () => { - const securityState = useSecurityState(); - - return ( -
-
- logo -

Welcome to the example pre-auth screen.

- {!securityState.isAuthenticatedUser && ( - - Try as you might, but you are not authenticated at this time and therefore cannot access any - guarded routes. - - )} - {securityState.isAuthenticatedUser && ( - - You are currently authenticated and should be able to access guarded routes. - - )} - - -
-
- ); -}; diff --git a/login-workflow/example/src/screens/ExampleRegistrationSuccess.tsx b/login-workflow/example/src/screens/ExampleRegistrationSuccess.tsx deleted file mode 100644 index cd4559d0..00000000 --- a/login-workflow/example/src/screens/ExampleRegistrationSuccess.tsx +++ /dev/null @@ -1,113 +0,0 @@ -import React from 'react'; -import { RegistrationData } from '@brightlayer-ui/react-auth-workflow'; -import Button from '@mui/material/Button'; -import CardActions from '@mui/material/CardActions'; -import CardContent from '@mui/material/CardContent'; -import CardHeader from '@mui/material/CardHeader'; -import Divider from '@mui/material/Divider'; -import Typography from '@mui/material/Typography'; -import useMediaQuery from '@mui/material/useMediaQuery'; -import { Link } from 'react-router-dom'; -import { EmptyState } from '@brightlayer-ui/react-components'; -import Person from '@mui/icons-material/Person'; - -type CustomRegistrationProps = { - registrationData: RegistrationData; -}; - -export const CustomRegistrationSuccessScreen: React.FC> = (props) => { - const matchesXS = useMediaQuery('(max-width:600px)'); - - return ( - <> - - Custom Registration Success Screen - - } - sx={{ p: matchesXS ? '16px 24px 0 24px' : '32px 24px 0 24px' }} - /> - - } - title={`Congratulations ${props.registrationData?.accountDetails?.firstName || ''}${' '} - ${props.registrationData?.accountDetails?.lastName || ''}!`} - description={'You made it to the custom registration success screen!'} - /> - - - - - - - ); -}; - -export const CustomAccountAlreadyExistsScreen: React.FC = () => { - const matchesXS = useMediaQuery('(max-width:600px)'); - - return ( - <> - - Custom Account Already Exists Screen - - } - sx={{ p: matchesXS ? '16px 24px 0 24px' : '32px 24px 0 24px' }} - /> - - } - title={'Congratulations!'} - description={'You made it to the custom account already exists success screen!'} - /> - - - - - - - ); -}; diff --git a/login-workflow/example/src/screens/Home.css b/login-workflow/example/src/screens/Home.css deleted file mode 100644 index 28acc4df..00000000 --- a/login-workflow/example/src/screens/Home.css +++ /dev/null @@ -1,37 +0,0 @@ -.App { - text-align: center; -} - -.App-logo { - height: 40vmin; - pointer-events: none; -} - -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } -} - -.App-header { - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: #424e54; -} - -.App-link { - color: #61dafb; -} - -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} diff --git a/login-workflow/example/src/screens/Login.tsx b/login-workflow/example/src/screens/Login.tsx new file mode 100644 index 00000000..9f3b31fe --- /dev/null +++ b/login-workflow/example/src/screens/Login.tsx @@ -0,0 +1,19 @@ +import React from 'react'; +import { LoginScreen } from '@brightlayer-ui/react-auth-workflow'; +import EatonLogo from '../assets/images/eaton_stacked_logo.png'; +import { DebugComponent } from '../components/DebugComponent'; + +export const Login = (): JSX.Element => ( + // Everything on the login screen should work out of the box without having to specify ANY overrides for props here + } + header={} + errorDisplayConfig={{ + mode: 'message-box', + messageBoxConfig: { + dismissible: true, + position: 'top', + }, + }} + /> +); diff --git a/login-workflow/example/src/screens/index.ts b/login-workflow/example/src/screens/index.ts new file mode 100644 index 00000000..cdcdf750 --- /dev/null +++ b/login-workflow/example/src/screens/index.ts @@ -0,0 +1,2 @@ +export * from './ExampleHome'; +export * from './Login'; diff --git a/login-workflow/example/src/screens/logo.svg b/login-workflow/example/src/screens/logo.svg deleted file mode 100644 index 6b60c104..00000000 --- a/login-workflow/example/src/screens/logo.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/login-workflow/example/src/translations/dictionary/chinese.ts b/login-workflow/example/src/translations/dictionary/chinese.ts new file mode 100644 index 00000000..c51612f0 --- /dev/null +++ b/login-workflow/example/src/translations/dictionary/chinese.ts @@ -0,0 +1,23 @@ +import { AppTranslationsFile } from './types'; + +const resources: AppTranslationsFile = { + translation: { + DRAWER_MENU: { + TITLE: '標題', + DASHBOARD: '儀表板', + LOCATIONS: '地點', + }, + TOOLBAR_MENU: { + HOME_PAGE: '主頁', + }, + PAGE_DETAILS: { + AUTHORISED_MESSAGE: '授權留言', + }, + USER_MENU: { + LOG_OUT: '登出', + CHANGE_PASSWORD: '更改密碼', + MY_ACCOUNT: '我的賬戶', + }, + }, +}; +export default resources; diff --git a/login-workflow/example/src/translations/dictionary/english.ts b/login-workflow/example/src/translations/dictionary/english.ts new file mode 100644 index 00000000..88fbb7aa --- /dev/null +++ b/login-workflow/example/src/translations/dictionary/english.ts @@ -0,0 +1,23 @@ +import { AppTranslationsFile } from './types'; + +const resources: AppTranslationsFile = { + translation: { + DRAWER_MENU: { + TITLE: 'Title', + DASHBOARD: 'Dashboard', + LOCATIONS: 'Locations', + }, + TOOLBAR_MENU: { + HOME_PAGE: 'Home Page', + }, + PAGE_DETAILS: { + AUTHORISED_MESSAGE: 'Authorised Message', + }, + USER_MENU: { + LOG_OUT: 'Log out', + CHANGE_PASSWORD: 'Change Password', + MY_ACCOUNT: 'My Account', + }, + }, +}; +export default resources; diff --git a/login-workflow/example/src/translations/dictionary/french.ts b/login-workflow/example/src/translations/dictionary/french.ts new file mode 100644 index 00000000..493bf2fa --- /dev/null +++ b/login-workflow/example/src/translations/dictionary/french.ts @@ -0,0 +1,23 @@ +import { AppTranslationsFile } from './types'; + +const resources: AppTranslationsFile = { + translation: { + DRAWER_MENU: { + TITLE: 'Titre', + DASHBOARD: 'Tableau de bord', + LOCATIONS: 'Emplacements', + }, + TOOLBAR_MENU: { + HOME_PAGE: `Page d'accueil`, + }, + PAGE_DETAILS: { + AUTHORISED_MESSAGE: 'Authorised Message', + }, + USER_MENU: { + LOG_OUT: 'Se déconnecter', + CHANGE_PASSWORD: 'changer le mot de passe', + MY_ACCOUNT: 'Mon compte', + }, + }, +}; +export default resources; diff --git a/login-workflow/example/src/translations/dictionary/index.ts b/login-workflow/example/src/translations/dictionary/index.ts new file mode 100644 index 00000000..b2f372ca --- /dev/null +++ b/login-workflow/example/src/translations/dictionary/index.ts @@ -0,0 +1,19 @@ +import english from './english'; +import french from './french'; +import spanish from './spanish'; +import chinese from './chinese'; +import portuguese from './portuguese'; + +export { default as english } from './english'; +export { default as french } from './french'; +export { default as spanish } from './spanish'; +export { default as chinese } from './chinese'; +export { default as portuguese } from './portuguese'; + +export const AppDictionaries = { + english: english, + french: french, + spanish: spanish, + chinese: chinese, + portuguese: portuguese, +}; diff --git a/login-workflow/example/src/translations/dictionary/portuguese.ts b/login-workflow/example/src/translations/dictionary/portuguese.ts new file mode 100644 index 00000000..7c82d715 --- /dev/null +++ b/login-workflow/example/src/translations/dictionary/portuguese.ts @@ -0,0 +1,23 @@ +import { AppTranslationsFile } from './types'; + +const resources: AppTranslationsFile = { + translation: { + DRAWER_MENU: { + TITLE: 'Título', + DASHBOARD: 'Painel', + LOCATIONS: 'Localizações', + }, + TOOLBAR_MENU: { + HOME_PAGE: 'Pagina inicial', + }, + PAGE_DETAILS: { + AUTHORISED_MESSAGE: 'Mensagem Autorizada', + }, + USER_MENU: { + LOG_OUT: 'Sair', + CHANGE_PASSWORD: 'alterar a senha', + MY_ACCOUNT: 'Minha conta', + }, + }, +}; +export default resources; diff --git a/login-workflow/example/src/translations/dictionary/spanish.ts b/login-workflow/example/src/translations/dictionary/spanish.ts new file mode 100644 index 00000000..adb1f968 --- /dev/null +++ b/login-workflow/example/src/translations/dictionary/spanish.ts @@ -0,0 +1,23 @@ +import { AppTranslationsFile } from './types'; + +const resources: AppTranslationsFile = { + translation: { + DRAWER_MENU: { + TITLE: 'Título', + DASHBOARD: 'Panel', + LOCATIONS: 'Ubicaciones', + }, + TOOLBAR_MENU: { + HOME_PAGE: 'Página de inicio', + }, + PAGE_DETAILS: { + AUTHORISED_MESSAGE: 'Mensaje autorizado', + }, + USER_MENU: { + LOG_OUT: 'Cerrar sesión', + CHANGE_PASSWORD: 'cambiar la contraseña', + MY_ACCOUNT: 'Mi cuenta', + }, + }, +}; +export default resources; diff --git a/login-workflow/example/src/translations/dictionary/types.ts b/login-workflow/example/src/translations/dictionary/types.ts new file mode 100644 index 00000000..756f9d4c --- /dev/null +++ b/login-workflow/example/src/translations/dictionary/types.ts @@ -0,0 +1,21 @@ +export type AppTranslations = { + DRAWER_MENU: { + TITLE: string; + DASHBOARD: string; + LOCATIONS: string; + }; + TOOLBAR_MENU: { + HOME_PAGE: string; + }; + PAGE_DETAILS: { + AUTHORISED_MESSAGE: string; + }; + USER_MENU: { + LOG_OUT: string; + CHANGE_PASSWORD: string; + MY_ACCOUNT: string; + }; +}; +export type AppTranslationsFile = { + translation: AppTranslations; +}; diff --git a/login-workflow/example/src/translations/i18n.ts b/login-workflow/example/src/translations/i18n.ts new file mode 100644 index 00000000..bd510ef2 --- /dev/null +++ b/login-workflow/example/src/translations/i18n.ts @@ -0,0 +1,59 @@ +import i18next from 'i18next'; +import { AppDictionaries } from './dictionary'; +import { initReactI18next } from 'react-i18next'; +import LanguageDetector from 'i18next-browser-languagedetector'; + +void i18next + .use(initReactI18next) // passes i18n down to react-i18next + .use(LanguageDetector) // allows us to infer the language from browser language selection + .init( + { + fallbackLng: 'en', + ns: ['app'], + defaultNS: 'app', + load: 'languageOnly', + detection: { + order: ['querystring', 'localStorage', 'navigator'], + caches: ['localStorage'], + lookupLocalStorage: 'app-i18nextLng', + lookupQuerystring: 'lng', + }, + react: { useSuspense: false }, + interpolation: { escapeValue: false }, + resources: { + en: { + app: { + ...AppDictionaries.english.translation, + }, + }, + fr: { + app: { + ...AppDictionaries.french.translation, + }, + }, + es: { + app: { + ...AppDictionaries.spanish.translation, + }, + }, + zh: { + app: { + ...AppDictionaries.chinese.translation, + }, + }, + pt: { + app: { + ...AppDictionaries.portuguese.translation, + }, + }, + }, + }, + // We must provide a function as second parameter, otherwise i18next errors + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (err, _t) => { + // eslint-disable-next-line no-console + if (err) return console.log(err); + } + ); + +export default i18next; diff --git a/login-workflow/example/yarn.lock b/login-workflow/example/yarn.lock index 525c12b1..56d36f2d 100644 --- a/login-workflow/example/yarn.lock +++ b/login-workflow/example/yarn.lock @@ -3,16 +3,21 @@ "@adobe/css-tools@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.0.1.tgz#b38b444ad3aa5fedbb15f2f746dcd934226a12dd" - integrity sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g== + version "4.2.0" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.2.0.tgz#e1a84fca468f4b337816fcb7f0964beb620ba855" + integrity sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA== -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== dependencies: - "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" "@apideck/better-ajv-errors@^0.3.1": @@ -24,55 +29,56 @@ jsonpointer "^5.0.0" leven "^3.1.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.8.3": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.8.3": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" + integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.0", "@babel/compat-data@^7.20.1": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.1.tgz#f2e6ef7790d8c8dbf03d379502dcc246dcce0b30" - integrity sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ== - -"@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.2", "@babel/core@^7.7.5", "@babel/core@^7.8.0": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.2.tgz#8dc9b1620a673f92d3624bd926dc49a52cf25b92" - integrity sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.2" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-module-transforms" "^7.20.2" - "@babel/helpers" "^7.20.1" - "@babel/parser" "^7.20.2" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.1" - "@babel/types" "^7.20.2" +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.5": + version "7.21.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.9.tgz#10a2e7fda4e51742c907938ac3b7229426515514" + integrity sha512-FUGed8kfhyWvbYug/Un/VPJD41rDIgoVVcR+FuzhzOYyRz5uED+Gd3SLZml0Uw2l2aHFb7ZgdW5mGA3G2cCCnQ== + +"@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.2", "@babel/core@^7.8.0": + version "7.21.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.8.tgz#2a8c7f0f53d60100ba4c32470ba0281c92aa9aa4" + integrity sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.5" + "@babel/helper-compilation-targets" "^7.21.5" + "@babel/helper-module-transforms" "^7.21.5" + "@babel/helpers" "^7.21.5" + "@babel/parser" "^7.21.8" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.1" + json5 "^2.2.2" semver "^6.3.0" "@babel/eslint-parser@^7.16.3": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz#4f68f6b0825489e00a24b41b6a1ae35414ecd2f4" - integrity sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ== + version "7.21.8" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.21.8.tgz#59fb6fc4f3b017ab86987c076226ceef7b2b2ef2" + integrity sha512-HLhI+2q+BP3sf78mFUZNCGc10KEmoUqtUT1OCdMZsN+qr4qFeLUod62/zAnF3jNQstwyasDkZnVXwfK2Bml7MQ== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.0" -"@babel/generator@^7.20.1", "@babel/generator@^7.20.2", "@babel/generator@^7.7.2": - version "7.20.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.4.tgz#4d9f8f0c30be75fd90a0562099a26e5839602ab8" - integrity sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA== +"@babel/generator@^7.21.5", "@babel/generator@^7.7.2": + version "7.21.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.9.tgz#3a1b706e07d836e204aee0650e8ee878d3aaa241" + integrity sha512-F3fZga2uv09wFdEjEQIJxXALXfz0+JaOb7SabvVMmjHxeVTuGW8wgE8Vp1Hd7O+zMTYtcfEISGRzPkeiaPPsvg== dependencies: - "@babel/types" "^7.20.2" + "@babel/types" "^7.21.5" "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" "@babel/helper-annotate-as-pure@^7.18.6": @@ -83,43 +89,46 @@ "@babel/types" "^7.18.6" "@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz#817f73b6c59726ab39f6ba18c234268a519e5abb" + integrity sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g== dependencies: - "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/types" "^7.21.5" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" - integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz#631e6cc784c7b660417421349aac304c94115366" + integrity sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w== dependencies: - "@babel/compat-data" "^7.20.0" - "@babel/helper-validator-option" "^7.18.6" + "@babel/compat-data" "^7.21.5" + "@babel/helper-validator-option" "^7.21.0" browserslist "^4.21.3" + lru-cache "^5.1.1" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz#3c08a5b5417c7f07b5cf3dfb6dc79cbec682e8c2" - integrity sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": + version "7.21.8" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz#205b26330258625ef8869672ebca1e0dee5a0f02" + integrity sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-member-expression-to-functions" "^7.21.5" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.19.1" + "@babel/helper-replace-supers" "^7.21.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/helper-split-export-declaration" "^7.18.6" + semver "^6.3.0" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz#7976aca61c0984202baca73d84e2337a5424a41b" - integrity sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": + version "7.21.8" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz#a7886f61c2e29e21fd4aaeaf1e473deba6b571dc" + integrity sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.1.0" + regexpu-core "^5.3.1" + semver "^6.3.0" "@babel/helper-define-polyfill-provider@^0.3.3": version "0.3.3" @@ -133,25 +142,18 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== +"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz#c769afefd41d171836f7cb63e295bedf689d48ba" + integrity sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ== -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== - dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" @@ -160,33 +162,33 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-member-expression-to-functions@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" - integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== +"@babel/helper-member-expression-to-functions@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz#3b1a009af932e586af77c1030fba9ee0bde396c0" + integrity sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg== dependencies: - "@babel/types" "^7.18.9" + "@babel/types" "^7.21.5" -"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" + integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.21.4" -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" - integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz#d937c82e9af68d31ab49039136a222b17ac0b420" + integrity sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-module-imports" "^7.21.4" + "@babel/helper-simple-access" "^7.21.5" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.1" - "@babel/types" "^7.20.2" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" @@ -195,12 +197,12 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56" + integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg== -"@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": +"@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== @@ -210,25 +212,26 @@ "@babel/helper-wrap-function" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz#e1592a9b4b368aa6bdb8784a711e0bcbf0612b78" - integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw== +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz#a6ad005ba1c7d9bc2973dfde05a1bba7065dde3c" + integrity sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-member-expression-to-functions" "^7.21.5" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/traverse" "^7.19.1" - "@babel/types" "^7.19.0" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" -"@babel/helper-simple-access@^7.19.4", "@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== +"@babel/helper-simple-access@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz#d697a7971a5c39eac32c7e63c0921c06c8a249ee" + integrity sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg== dependencies: - "@babel/types" "^7.20.2" + "@babel/types" "^7.21.5" -"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": version "7.20.0" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== @@ -242,39 +245,39 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== +"@babel/helper-string-parser@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" + integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== +"@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== "@babel/helper-wrap-function@^7.18.9": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz#89f18335cff1152373222f76a4b37799636ae8b1" - integrity sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" + integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== dependencies: "@babel/helper-function-name" "^7.19.0" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" -"@babel/helpers@^7.20.1": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.1.tgz#2ab7a0fcb0a03b5bf76629196ed63c2d7311f4c9" - integrity sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg== +"@babel/helpers@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.5.tgz#5bac66e084d7a4d2d9696bdf0175a93f7fb63c08" + integrity sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA== dependencies: - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.1" - "@babel/types" "^7.20.0" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" "@babel/highlight@^7.18.6": version "7.18.6" @@ -285,15 +288,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.0.tgz#49b9b6ee213e5634fa80361dae139effef893f78" - integrity sha512-w80kxEMFhE3wjMOQkfdTvv0CSdRSJZptIlLhU4eU/coNJeWjduspUFz+IRnBbAq6m5XYBFMoT1TNkk9K9yf10g== - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.20.1", "@babel/parser@^7.20.2": - version "7.20.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.3.tgz#5358cf62e380cf69efcb87a7bb922ff88bfac6e2" - integrity sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.5", "@babel/parser@^7.21.8", "@babel/parser@^7.21.9": + version "7.21.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.9.tgz#ab18ea3b85b4bc33ba98a8d4c2032c557d23cf14" + integrity sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" @@ -302,22 +300,22 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50" - integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" + integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-proposal-optional-chaining" "^7.20.7" -"@babel/plugin-proposal-async-generator-functions@^7.20.1": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz#352f02baa5d69f4e7529bdac39aaa02d41146af9" - integrity sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g== +"@babel/plugin-proposal-async-generator-functions@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== dependencies: "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-syntax-async-generators" "^7.8.4" @@ -329,25 +327,25 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020" - integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw== +"@babel/plugin-proposal-class-static-block@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d" + integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-decorators@^7.16.4": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.2.tgz#1c6c32b2a44b154ebeec2bb534f9eaebdb541fb6" - integrity sha512-nkBH96IBmgKnbHQ5gXFrcmez+Z9S2EIDKDQGp005ROqBigc88Tky4rzCnlP/lnlj245dCEQl4/YyV0V1kYh5dw== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.21.0.tgz#70e0c89fdcd7465c97593edb8f628ba6e4199d63" + integrity sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w== dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.2" + "@babel/helper-create-class-features-plugin" "^7.21.0" "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.19.1" + "@babel/helper-replace-supers" "^7.20.7" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/plugin-syntax-decorators" "^7.19.0" + "@babel/plugin-syntax-decorators" "^7.21.0" "@babel/plugin-proposal-dynamic-import@^7.18.6": version "7.18.6" @@ -373,12 +371,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23" - integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== +"@babel/plugin-proposal-logical-assignment-operators@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" + integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": @@ -397,16 +395,16 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz#a556f59d555f06961df1e572bb5eca864c84022d" - integrity sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ== +"@babel/plugin-proposal-object-rest-spread@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== dependencies: - "@babel/compat-data" "^7.20.1" - "@babel/helper-compilation-targets" "^7.20.0" + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.1" + "@babel/plugin-transform-parameters" "^7.20.7" "@babel/plugin-proposal-optional-catch-binding@^7.18.6": version "7.18.6" @@ -416,13 +414,13 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993" - integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== +"@babel/plugin-proposal-optional-chaining@^7.16.0", "@babel/plugin-proposal-optional-chaining@^7.20.7", "@babel/plugin-proposal-optional-chaining@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-proposal-private-methods@^7.16.0", "@babel/plugin-proposal-private-methods@^7.18.6": @@ -433,14 +431,14 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz#a64137b232f0aca3733a67eb1a144c192389c503" - integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw== +"@babel/plugin-proposal-private-property-in-object@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" + integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": @@ -479,12 +477,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.19.0.tgz#5f13d1d8fce96951bea01a10424463c9a5b3a599" - integrity sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ== +"@babel/plugin-syntax-decorators@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.21.0.tgz#d2b3f31c3e86fa86e16bb540b7660c55bd7d0e78" + integrity sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -501,11 +499,11 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-flow@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz#774d825256f2379d06139be0c723c4dd444f3ca1" - integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.21.4.tgz#3e37fca4f06d93567c1cd9b75156422e90a67107" + integrity sha512-l9xd3N+XG4fZRxEP3vXdK6RW7vN1Uf5dxzRC/09wV86wqZ/YYQooBIGNsiRdfNR3/q2/5pPzV4B54J/9ctX5jw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-import-assertions@^7.20.0": version "7.20.0" @@ -514,7 +512,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.19.0" -"@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -528,12 +526,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.17.12", "@babel/plugin-syntax-jsx@^7.18.6", "@babel/plugin-syntax-jsx@^7.7.2": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" - integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== +"@babel/plugin-syntax-jsx@^7.21.4", "@babel/plugin-syntax-jsx@^7.7.2": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2" + integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" @@ -592,27 +590,27 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.20.0", "@babel/plugin-syntax-typescript@^7.7.2": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" - integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz#2751948e9b7c6d771a8efa59340c15d4a2891ff8" + integrity sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-arrow-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe" - integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== +"@babel/plugin-transform-arrow-functions@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz#9bb42a53de447936a57ba256fbf537fc312b6929" + integrity sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.21.5" -"@babel/plugin-transform-async-to-generator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615" - integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== +"@babel/plugin-transform-async-to-generator@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" + integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== dependencies: "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-remap-async-to-generator" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" "@babel/plugin-transform-block-scoped-functions@^7.18.6": version "7.18.6" @@ -621,39 +619,40 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-block-scoping@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz#f59b1767e6385c663fd0bce655db6ca9c8b236ed" - integrity sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ== +"@babel/plugin-transform-block-scoping@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" + integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-classes@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz#c0033cf1916ccf78202d04be4281d161f6709bb2" - integrity sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g== +"@babel/plugin-transform-classes@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" + integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-compilation-targets" "^7.20.7" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" + "@babel/helper-function-name" "^7.21.0" "@babel/helper-optimise-call-expression" "^7.18.6" "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.19.1" + "@babel/helper-replace-supers" "^7.20.7" "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e" - integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== +"@babel/plugin-transform-computed-properties@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz#3a2d8bb771cd2ef1cd736435f6552fe502e11b44" + integrity sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/template" "^7.20.7" -"@babel/plugin-transform-destructuring@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz#c23741cfa44ddd35f5e53896e88c75331b8b2792" - integrity sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw== +"@babel/plugin-transform-destructuring@^7.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" + integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -681,19 +680,19 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-flow-strip-types@^7.16.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz#e9e8606633287488216028719638cbbb2f2dde8f" - integrity sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg== + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.21.0.tgz#6aeca0adcb81dc627c8986e770bfaa4d9812aff5" + integrity sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-flow" "^7.18.6" -"@babel/plugin-transform-for-of@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" - integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== +"@babel/plugin-transform-for-of@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz#e890032b535f5a2e237a18535f56a9fdaa7b83fc" + integrity sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/plugin-transform-function-name@^7.18.9": version "7.18.9" @@ -718,31 +717,31 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-modules-amd@^7.19.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz#aca391801ae55d19c4d8d2ebfeaa33df5f2a2cbd" - integrity sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg== +"@babel/plugin-transform-modules-amd@^7.20.11": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" + integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== dependencies: - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-modules-commonjs@^7.19.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz#25b32feef24df8038fc1ec56038917eacb0b730c" - integrity sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ== +"@babel/plugin-transform-modules-commonjs@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz#d69fb947eed51af91de82e4708f676864e5e47bc" + integrity sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ== dependencies: - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-simple-access" "^7.19.4" + "@babel/helper-module-transforms" "^7.21.5" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-simple-access" "^7.21.5" -"@babel/plugin-transform-modules-systemjs@^7.19.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz#59e2a84064b5736a4471b1aa7b13d4431d327e0d" - integrity sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ== +"@babel/plugin-transform-modules-systemjs@^7.20.11": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" + integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== dependencies: "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-validator-identifier" "^7.19.1" "@babel/plugin-transform-modules-umd@^7.18.6": @@ -753,13 +752,13 @@ "@babel/helper-module-transforms" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz#ec7455bab6cd8fb05c525a94876f435a48128888" - integrity sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" + integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.19.0" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-create-regexp-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-new-target@^7.18.6": version "7.18.6" @@ -776,10 +775,10 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.20.1": - version "7.20.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz#7b3468d70c3c5b62e46be0a47b6045d8590fb748" - integrity sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA== +"@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz#18fc4e797cf6d6d972cb8c411dbe8a809fa157db" + integrity sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -791,9 +790,9 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-react-constant-elements@^7.12.1": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz#3f02c784e0b711970d7d8ccc96c4359d64e27ac7" - integrity sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g== + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.21.3.tgz#b32a5556100d424b25e388dd689050d78396884d" + integrity sha512-4DVcFeWe/yDYBLp0kBmOGFJ6N2UYg7coGid1gdxb4co62dy/xISDMaYBXBVXEDhfgMk7qkbcYiGtwd5Q/hwDDQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -812,15 +811,15 @@ "@babel/plugin-transform-react-jsx" "^7.18.6" "@babel/plugin-transform-react-jsx@^7.18.6": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz#b3cbb7c3a00b92ec8ae1027910e331ba5c500eb9" - integrity sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg== + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.5.tgz#bd98f3b429688243e4fa131fe1cbb2ef31ce6f38" + integrity sha512-ELdlq61FpoEkHO6gFRpfj0kUgSwQTGoaEU8eMRoS8Dv3v6e7BjEAj5WMtIBRdHUeAioMhKP5HyxNzNnP+heKbA== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.19.0" + "@babel/helper-module-imports" "^7.21.4" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/plugin-syntax-jsx" "^7.21.4" + "@babel/types" "^7.21.5" "@babel/plugin-transform-react-pure-annotations@^7.18.6": version "7.18.6" @@ -830,13 +829,13 @@ "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-regenerator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz#585c66cb84d4b4bf72519a34cfce761b8676ca73" - integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ== +"@babel/plugin-transform-regenerator@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz#576c62f9923f94bcb1c855adc53561fd7913724e" + integrity sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - regenerator-transform "^0.15.0" + "@babel/helper-plugin-utils" "^7.21.5" + regenerator-transform "^0.15.1" "@babel/plugin-transform-reserved-words@^7.18.6": version "7.18.6" @@ -846,12 +845,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-runtime@^7.16.4": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz#9d2a9dbf4e12644d6f46e5e75bfbf02b5d6e9194" - integrity sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw== + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz#2e1da21ca597a7d01fc96b699b21d8d2023191aa" + integrity sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA== dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-module-imports" "^7.21.4" + "@babel/helper-plugin-utils" "^7.20.2" babel-plugin-polyfill-corejs2 "^0.3.3" babel-plugin-polyfill-corejs3 "^0.6.0" babel-plugin-polyfill-regenerator "^0.4.1" @@ -864,13 +863,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-spread@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz#dd60b4620c2fec806d60cfaae364ec2188d593b6" - integrity sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w== +"@babel/plugin-transform-spread@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" + integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-transform-sticky-regex@^7.18.6": version "7.18.6" @@ -893,21 +892,22 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-typescript@^7.18.6": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz#91515527b376fc122ba83b13d70b01af8fe98f3f" - integrity sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag== +"@babel/plugin-transform-typescript@^7.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz#316c5be579856ea890a57ebc5116c5d064658f2b" + integrity sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.2" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.21.0" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-typescript" "^7.20.0" -"@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== +"@babel/plugin-transform-unicode-escapes@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz#1e55ed6195259b0e9061d81f5ef45a9b009fb7f2" + integrity sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/plugin-transform-unicode-regex@^7.18.6": version "7.18.6" @@ -918,30 +918,30 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" - integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== - dependencies: - "@babel/compat-data" "^7.20.1" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.18.6" + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.21.5.tgz#db2089d99efd2297716f018aeead815ac3decffb" + integrity sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg== + dependencies: + "@babel/compat-data" "^7.21.5" + "@babel/helper-compilation-targets" "^7.21.5" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-validator-option" "^7.21.0" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.20.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.20.7" + "@babel/plugin-proposal-async-generator-functions" "^7.20.7" "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.21.0" "@babel/plugin-proposal-dynamic-import" "^7.18.6" "@babel/plugin-proposal-export-namespace-from" "^7.18.9" "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-logical-assignment-operators" "^7.20.7" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.2" + "@babel/plugin-proposal-object-rest-spread" "^7.20.7" "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-optional-chaining" "^7.21.0" "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.21.0" "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" @@ -949,6 +949,7 @@ "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -958,40 +959,40 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.18.6" - "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.21.5" + "@babel/plugin-transform-async-to-generator" "^7.20.7" "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.20.2" - "@babel/plugin-transform-classes" "^7.20.2" - "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.20.2" + "@babel/plugin-transform-block-scoping" "^7.21.0" + "@babel/plugin-transform-classes" "^7.21.0" + "@babel/plugin-transform-computed-properties" "^7.21.5" + "@babel/plugin-transform-destructuring" "^7.21.3" "@babel/plugin-transform-dotall-regex" "^7.18.6" "@babel/plugin-transform-duplicate-keys" "^7.18.9" "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-for-of" "^7.21.5" "@babel/plugin-transform-function-name" "^7.18.9" "@babel/plugin-transform-literals" "^7.18.9" "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.19.6" - "@babel/plugin-transform-modules-commonjs" "^7.19.6" - "@babel/plugin-transform-modules-systemjs" "^7.19.6" + "@babel/plugin-transform-modules-amd" "^7.20.11" + "@babel/plugin-transform-modules-commonjs" "^7.21.5" + "@babel/plugin-transform-modules-systemjs" "^7.20.11" "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.20.5" "@babel/plugin-transform-new-target" "^7.18.6" "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.20.1" + "@babel/plugin-transform-parameters" "^7.21.3" "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.21.5" "@babel/plugin-transform-reserved-words" "^7.18.6" "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.19.0" + "@babel/plugin-transform-spread" "^7.20.7" "@babel/plugin-transform-sticky-regex" "^7.18.6" "@babel/plugin-transform-template-literals" "^7.18.9" "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.10" + "@babel/plugin-transform-unicode-escapes" "^7.21.5" "@babel/plugin-transform-unicode-regex" "^7.18.6" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.20.2" + "@babel/types" "^7.21.5" babel-plugin-polyfill-corejs2 "^0.3.3" babel-plugin-polyfill-corejs3 "^0.6.0" babel-plugin-polyfill-regenerator "^0.4.1" @@ -1022,60 +1023,59 @@ "@babel/plugin-transform-react-pure-annotations" "^7.18.6" "@babel/preset-typescript@^7.16.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" - integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz#68292c884b0e26070b4d66b202072d391358395f" + integrity sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-typescript" "^7.18.6" - -"@babel/runtime-corejs3@^7.10.2": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.20.1.tgz#d0775a49bb5fba77e42cbb7276c9955c7b05af8d" - integrity sha512-CGulbEDcg/ND1Im7fUNRZdGXmX2MTWVVZacQi/6DiKE5HNwZ3aVTm5PV4lO8HHz0B2h8WQyvKKjbX5XgTtydsg== - dependencies: - core-js-pure "^3.25.1" - regenerator-runtime "^0.13.10" - -"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.20.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.1.tgz#1148bb33ab252b165a06698fde7576092a78b4a9" - integrity sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg== - dependencies: - regenerator-runtime "^0.13.10" - -"@babel/template@^7.18.10", "@babel/template@^7.3.3": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" - integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.10" - "@babel/types" "^7.18.10" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-validator-option" "^7.21.0" + "@babel/plugin-syntax-jsx" "^7.21.4" + "@babel/plugin-transform-modules-commonjs" "^7.21.5" + "@babel/plugin-transform-typescript" "^7.21.3" -"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1", "@babel/traverse@^7.7.2": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.1.tgz#9b15ccbf882f6d107eeeecf263fbcdd208777ec8" - integrity sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.1" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" + integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": + version "7.21.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.21.9.tgz#bf8dad2859130ae46088a99c1f265394877446fb" + integrity sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ== + dependencies: + "@babel/code-frame" "^7.21.4" + "@babel/parser" "^7.21.9" + "@babel/types" "^7.21.5" + +"@babel/traverse@^7.20.5", "@babel/traverse@^7.21.5", "@babel/traverse@^7.7.2": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.5.tgz#ad22361d352a5154b498299d523cf72998a4b133" + integrity sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw== + dependencies: + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.5" + "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-function-name" "^7.21.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.1" - "@babel/types" "^7.20.0" + "@babel/parser" "^7.21.5" + "@babel/types" "^7.21.5" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.2.tgz#67ac09266606190f496322dbaff360fdaa5e7842" - integrity sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog== +"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6" + integrity sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q== dependencies: - "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-string-parser" "^7.21.5" "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" @@ -1101,30 +1101,30 @@ optionalDependencies: eslint-plugin-react "^7.28.0" -"@brightlayer-ui/icons-mui@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@brightlayer-ui/icons-mui/-/icons-mui-3.2.0.tgz#6ef097d8786875891ebdfd5aff0b823181adadbe" - integrity sha512-EanLzuY9a7zlSBbw5uBKiM+QGAKdyqdrfdV3VTTdRnXeA9bZny6l8Boqh2pXYaEJYlimNEoxMW3BBBEK2SmoMg== +"@brightlayer-ui/icons-mui@^3.3.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@brightlayer-ui/icons-mui/-/icons-mui-3.4.0.tgz#b5df32f89d329f9a5d2d9b01c84a645e997f3c1c" + integrity sha512-MJWXLEjnjsSeXUtpZhqsWDalzZD+L4J4whw0ErYJ/pfkcC37w3JG07pTyxFJY+Lm1v8TDjZQoaKTT3NjYOE6tA== "@brightlayer-ui/prettier-config@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@brightlayer-ui/prettier-config/-/prettier-config-1.0.3.tgz#e40a7ae7435c6fd5118acbf249080e0aa81e93af" integrity sha512-EYm3+V7Qd+oYEF+8FadsXAZqXryEHHbGnrV1BMp9selhABjceqUqXPVE4Sn3SKWQdBNJ3En2A3EzgrzRbvRTaw== -"@brightlayer-ui/react-components@^6.1.2-alpha.0": - version "6.1.2-alpha.0" - resolved "https://registry.yarnpkg.com/@brightlayer-ui/react-components/-/react-components-6.1.2-alpha.0.tgz#6fe48c2d300e1618f3ef8fdb409504a8c5637082" - integrity sha512-Rpv5Zx8OlzKSjDNEvXL7uhjeLBuaLWMTKT2rqzrL7wY3Y14Vc8NkVfIQ0EWqGMLg5wVpH8fL9KDhQSl62C4fwg== +"@brightlayer-ui/react-components@^6.1.2": + version "6.3.0" + resolved "https://registry.yarnpkg.com/@brightlayer-ui/react-components/-/react-components-6.3.0.tgz#59d03ac9f0dbbb9b56f3e639068d6463c8c70738" + integrity sha512-EQc2PfQ/jxMUzppA4Wykxp1jfN6VCvJveAGvGluCbuXf6tPrFeeAGsUfunA/IcqUnD9whidPw+E7iGaI1+dhTQ== dependencies: "@brightlayer-ui/colors" "^3.1.1" "@emotion/css" "^11.10.5" "@seznam/compose-react-refs" "^1.0.6" color "^4.2.3" -"@brightlayer-ui/react-themes@^7.1.0-alpha.0": - version "7.1.0-alpha.0" - resolved "https://registry.yarnpkg.com/@brightlayer-ui/react-themes/-/react-themes-7.1.0-alpha.0.tgz#745079123cd321eaad689fe92b53c6fd2a7d0c4a" - integrity sha512-j9RS3puo4AttidbTPtLtGxpszr1TrVq3M+iNh2gT4Lk5LGyMwE0+jcSVZrlTqZZ8rIqZUG6vGg0ElD0CsGfI4w== +"@brightlayer-ui/react-themes@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@brightlayer-ui/react-themes/-/react-themes-7.1.0.tgz#09519522ab192cdb16c47c2d15ccd238d0fc8c5e" + integrity sha512-zAESyIZJmGAcRDHwX2nB26gsloQ53Kx9FGb4I4bPdDf3Ragbaio/Is03/3CRCim5qCVwjcDqq/iy4iDqg1Q9BQ== dependencies: "@brightlayer-ui/colors" "^3.0.0" "@fontsource/open-sans" "^4.2.2" @@ -1135,11 +1135,6 @@ resolved "https://registry.yarnpkg.com/@brightlayer-ui/types/-/types-2.0.0.tgz#d8adc0cdb96c164943adbad6e74043128a8b4112" integrity sha512-DTCVwND6YC9qrkQl7pkFlN6QxDReJHtjuAiFU9HkXJN368vlw+fzHQ5/j4sB1sZl2eNwOgccv5ecl2XrlolOCw== -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== - "@csstools/normalize.css@*": version "12.0.0" resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-12.0.0.tgz#a9583a75c3f150667771f30b60d9f059473e62c4" @@ -1247,236 +1242,169 @@ integrity sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g== "@csstools/selector-specificity@^2.0.0", "@csstools/selector-specificity@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz#1bfafe4b7ed0f3e4105837e056e0a89b108ebe36" - integrity sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg== - -"@cypress/code-coverage@^3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@cypress/code-coverage/-/code-coverage-3.10.0.tgz#2132dbb7ae068cab91790926d50a9bf85140cab4" - integrity sha512-K5pW2KPpK4vKMXqxd6vuzo6m9BNgpAv1LcrrtmqAtOJ1RGoEILXYZVost0L6Q+V01NyY7n7jXIIfS7LR3nP6YA== - dependencies: - "@cypress/webpack-preprocessor" "^5.11.0" - chalk "4.1.2" - dayjs "1.10.7" - debug "4.3.4" - execa "4.1.0" - globby "11.0.4" - istanbul-lib-coverage "3.0.0" - js-yaml "3.14.1" - nyc "15.1.0" - -"@cypress/instrument-cra@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@cypress/instrument-cra/-/instrument-cra-1.4.0.tgz#c62427b9890e67544e86fd5b927cfdca3ad003d2" - integrity sha512-gXf540xL0jcUXkWyrA2Ug9rzs+jRkc9EPhnRi8XfbnRjdF4lvnn108N6x0lgTApMTbbpCDbVuskHGXDmIuD3CQ== - dependencies: - babel-plugin-istanbul "6.0.0" - debug "4.2.0" - find-yarn-workspace-root "^2.0.0" - -"@cypress/request@^2.88.10": - version "2.88.10" - resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.10.tgz#b66d76b07f860d3a4b8d7a0604d020c662752cce" - integrity sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - http-signature "~1.3.6" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^8.3.2" - -"@cypress/webpack-preprocessor@^5.11.0": - version "5.15.5" - resolved "https://registry.yarnpkg.com/@cypress/webpack-preprocessor/-/webpack-preprocessor-5.15.5.tgz#965940014e0a72366be451d8bb7efc1f46b8a713" - integrity sha512-ZV2ZylabogNDK3+xwDIWswudCJMFDT9XU6tTGni2xWow/brBvI55sEqcjvb6+9x8skMSPM6vLxdvf/FAOmNEFQ== - dependencies: - "@babel/parser" "7.13.0" - bluebird "3.7.1" - debug "^4.3.2" - fs-extra "^10.1.0" - loader-utils "^2.0.0" - lodash "^4.17.20" - md5 "2.3.0" - source-map "^0.6.1" - webpack-virtual-modules "^0.4.4" - -"@cypress/xvfb@^1.2.4": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" - integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== - dependencies: - debug "^3.1.0" - lodash.once "^4.1.1" + version "2.2.0" + resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz#2cbcf822bf3764c9658c4d2e568bd0c0cb748016" + integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== -"@emotion/babel-plugin@^11.10.5": - version "11.10.5" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.5.tgz#65fa6e1790ddc9e23cc22658a4c5dea423c55c3c" - integrity sha512-xE7/hyLHJac7D2Ve9dKroBBZqBT7WuPQmWcq7HSGb84sUuP4mlOWoB8dvVfD9yk5DHkU1m6RW7xSoDtnQHNQeA== +"@emotion/babel-plugin@^11.11.0": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c" + integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== dependencies: "@babel/helper-module-imports" "^7.16.7" - "@babel/plugin-syntax-jsx" "^7.17.12" "@babel/runtime" "^7.18.3" - "@emotion/hash" "^0.9.0" - "@emotion/memoize" "^0.8.0" - "@emotion/serialize" "^1.1.1" + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/serialize" "^1.1.2" babel-plugin-macros "^3.1.0" convert-source-map "^1.5.0" escape-string-regexp "^4.0.0" find-root "^1.1.0" source-map "^0.5.7" - stylis "4.1.3" - -"@emotion/cache@^11.10.5": - version "11.10.5" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.5.tgz#c142da9351f94e47527ed458f7bbbbe40bb13c12" - integrity sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA== - dependencies: - "@emotion/memoize" "^0.8.0" - "@emotion/sheet" "^1.2.1" - "@emotion/utils" "^1.2.0" - "@emotion/weak-memoize" "^0.3.0" - stylis "4.1.3" - -"@emotion/css@^11.10.0", "@emotion/css@^11.10.5": - version "11.10.5" - resolved "https://registry.yarnpkg.com/@emotion/css/-/css-11.10.5.tgz#ca01bb83ce60517bc3a5c01d27ccf552fed84d9d" - integrity sha512-maJy0wG82hWsiwfJpc3WrYsyVwUbdu+sdIseKUB+/OLjB8zgc3tqkT6eO0Yt0AhIkJwGGnmMY/xmQwEAgQ4JHA== - dependencies: - "@emotion/babel-plugin" "^11.10.5" - "@emotion/cache" "^11.10.5" - "@emotion/serialize" "^1.1.1" - "@emotion/sheet" "^1.2.1" - "@emotion/utils" "^1.2.0" - -"@emotion/hash@^0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7" - integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== - -"@emotion/is-prop-valid@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz#7f2d35c97891669f7e276eb71c83376a5dc44c83" - integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== + stylis "4.2.0" + +"@emotion/cache@^11.11.0": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff" + integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== + dependencies: + "@emotion/memoize" "^0.8.1" + "@emotion/sheet" "^1.2.2" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + stylis "4.2.0" + +"@emotion/css@^11.10.5", "@emotion/css@^11.11.2": + version "11.11.2" + resolved "https://registry.yarnpkg.com/@emotion/css/-/css-11.11.2.tgz#e5fa081d0c6e335352e1bc2b05953b61832dca5a" + integrity sha512-VJxe1ucoMYMS7DkiMdC2T7PWNbrEI0a39YRiyDvK2qq4lXwjRbVP/z4lpG+odCsRzadlR+1ywwrTzhdm5HNdew== + dependencies: + "@emotion/babel-plugin" "^11.11.0" + "@emotion/cache" "^11.11.0" + "@emotion/serialize" "^1.1.2" + "@emotion/sheet" "^1.2.2" + "@emotion/utils" "^1.2.1" + +"@emotion/hash@^0.9.1": + version "0.9.1" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43" + integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== + +"@emotion/is-prop-valid@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" + integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== dependencies: - "@emotion/memoize" "^0.8.0" + "@emotion/memoize" "^0.8.1" -"@emotion/memoize@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" - integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== +"@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== "@emotion/react@^11.7.1": - version "11.10.5" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.5.tgz#95fff612a5de1efa9c0d535384d3cfa115fe175d" - integrity sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A== + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.0.tgz#408196b7ef8729d8ad08fc061b03b046d1460e02" + integrity sha512-ZSK3ZJsNkwfjT3JpDAWJZlrGD81Z3ytNDsxw1LKq1o+xkmO5pnWfr6gmCC8gHEFf3nSSX/09YrG67jybNPxSUw== dependencies: "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.10.5" - "@emotion/cache" "^11.10.5" - "@emotion/serialize" "^1.1.1" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" - "@emotion/utils" "^1.2.0" - "@emotion/weak-memoize" "^0.3.0" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/cache" "^11.11.0" + "@emotion/serialize" "^1.1.2" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" hoist-non-react-statics "^3.3.1" -"@emotion/serialize@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.1.tgz#0595701b1902feded8a96d293b26be3f5c1a5cf0" - integrity sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA== +"@emotion/serialize@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.2.tgz#017a6e4c9b8a803bd576ff3d52a0ea6fa5a62b51" + integrity sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA== dependencies: - "@emotion/hash" "^0.9.0" - "@emotion/memoize" "^0.8.0" - "@emotion/unitless" "^0.8.0" - "@emotion/utils" "^1.2.0" + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/unitless" "^0.8.1" + "@emotion/utils" "^1.2.1" csstype "^3.0.2" -"@emotion/sheet@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.1.tgz#0767e0305230e894897cadb6c8df2c51e61a6c2c" - integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA== +"@emotion/sheet@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec" + integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== -"@emotion/styled@^11.10.4": - version "11.10.5" - resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.10.5.tgz#1fe7bf941b0909802cb826457e362444e7e96a79" - integrity sha512-8EP6dD7dMkdku2foLoruPCNkRevzdcBaY6q0l0OsbyJK+x8D9HWjX27ARiSIKNF634hY9Zdoedh8bJCiva8yZw== +"@emotion/styled@^11.10.8": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.11.0.tgz#26b75e1b5a1b7a629d7c0a8b708fbf5a9cdce346" + integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng== dependencies: "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.10.5" - "@emotion/is-prop-valid" "^1.2.0" - "@emotion/serialize" "^1.1.1" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" - "@emotion/utils" "^1.2.0" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/is-prop-valid" "^1.2.1" + "@emotion/serialize" "^1.1.2" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" -"@emotion/unitless@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" - integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== +"@emotion/unitless@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" + integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== -"@emotion/use-insertion-effect-with-fallbacks@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz#ffadaec35dbb7885bd54de3fa267ab2f860294df" - integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A== +"@emotion/use-insertion-effect-with-fallbacks@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963" + integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== -"@emotion/utils@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.0.tgz#9716eaccbc6b5ded2ea5a90d65562609aab0f561" - integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw== +"@emotion/utils@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4" + integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== -"@emotion/weak-memoize@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb" - integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== +"@emotion/weak-memoize@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6" + integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== -"@eslint/eslintrc@^1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.3.tgz#2b044ab39fdfa75b4688184f9e573ce3c5b0ff95" - integrity sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg== +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" + integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== + +"@eslint/eslintrc@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331" + integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.4.0" - globals "^13.15.0" + espree "^9.5.2" + globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" js-yaml "^4.1.0" minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@fontsource/open-sans@^4.2.2": - version "4.5.13" - resolved "https://registry.yarnpkg.com/@fontsource/open-sans/-/open-sans-4.5.13.tgz#2c99e4c055d129a75f14c11b77d040282e0388b8" - integrity sha512-/UzqP7ZFk145XAq8KG4pvFPP7UQhtreDGXgqXZjagCDreKxcrhwn/x7DYz9rPcycWkLUVApIybcoczGZiM0cRg== - -"@hapi/hoek@^9.0.0": - version "9.3.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" - integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== +"@eslint/js@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.41.0.tgz#080321c3b68253522f7646b55b577dd99d2950b3" + integrity sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA== -"@hapi/topo@^5.0.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" - integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== - dependencies: - "@hapi/hoek" "^9.0.0" +"@fontsource/open-sans@^4.2.2": + version "4.5.14" + resolved "https://registry.yarnpkg.com/@fontsource/open-sans/-/open-sans-4.5.14.tgz#b3e1665c0b3fdfc1f030ded2843749e3cf3a5900" + integrity sha512-mBXIIETBlW8q/ocuUN0hyGow2iuf75hQEHQt8R/RJ/HcphVbLg8KB7pHYGbFGDqs75W+SWvTC7JkVeAjT65BuQ== -"@humanwhocodes/config-array@^0.11.6": - version "0.11.7" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.7.tgz#38aec044c6c828f6ed51d5d7ae3d9b9faf6dbb0f" - integrity sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw== +"@humanwhocodes/config-array@^0.11.8": + version "0.11.8" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" @@ -1532,16 +1460,16 @@ jest-util "^28.1.3" slash "^3.0.0" -"@jest/console@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.3.1.tgz#3e3f876e4e47616ea3b1464b9fbda981872e9583" - integrity sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg== +"@jest/console@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.5.0.tgz#593a6c5c0d3f75689835f1b3b4688c4f8544cb57" + integrity sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^29.3.1" - jest-util "^29.3.1" + jest-message-util "^29.5.0" + jest-util "^29.5.0" slash "^3.0.0" "@jest/core@^27.5.1": @@ -1578,37 +1506,37 @@ slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/core@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.3.1.tgz#bff00f413ff0128f4debec1099ba7dcd649774a1" - integrity sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw== +"@jest/core@^29.3.1", "@jest/core@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.5.0.tgz#76674b96904484e8214614d17261cc491e5f1f03" + integrity sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ== dependencies: - "@jest/console" "^29.3.1" - "@jest/reporters" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/console" "^29.5.0" + "@jest/reporters" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^29.2.0" - jest-config "^29.3.1" - jest-haste-map "^29.3.1" - jest-message-util "^29.3.1" - jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-resolve-dependencies "^29.3.1" - jest-runner "^29.3.1" - jest-runtime "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" - jest-watcher "^29.3.1" + jest-changed-files "^29.5.0" + jest-config "^29.5.0" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-resolve-dependencies "^29.5.0" + jest-runner "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + jest-watcher "^29.5.0" micromatch "^4.0.4" - pretty-format "^29.3.1" + pretty-format "^29.5.0" slash "^3.0.0" strip-ansi "^6.0.0" @@ -1622,30 +1550,30 @@ "@types/node" "*" jest-mock "^27.5.1" -"@jest/environment@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.3.1.tgz#eb039f726d5fcd14698acd072ac6576d41cfcaa6" - integrity sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag== +"@jest/environment@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" + integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== dependencies: - "@jest/fake-timers" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" - jest-mock "^29.3.1" + jest-mock "^29.5.0" -"@jest/expect-utils@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.3.1.tgz#531f737039e9b9e27c42449798acb5bba01935b6" - integrity sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g== +"@jest/expect-utils@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" + integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== dependencies: - jest-get-type "^29.2.0" + jest-get-type "^29.4.3" -"@jest/expect@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.3.1.tgz#456385b62894349c1d196f2d183e3716d4c6a6cd" - integrity sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg== +"@jest/expect@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.5.0.tgz#80952f5316b23c483fbca4363ce822af79c38fba" + integrity sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g== dependencies: - expect "^29.3.1" - jest-snapshot "^29.3.1" + expect "^29.5.0" + jest-snapshot "^29.5.0" "@jest/fake-timers@^27.5.1": version "27.5.1" @@ -1659,17 +1587,17 @@ jest-mock "^27.5.1" jest-util "^27.5.1" -"@jest/fake-timers@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.3.1.tgz#b140625095b60a44de820876d4c14da1aa963f67" - integrity sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A== +"@jest/fake-timers@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" + integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== dependencies: - "@jest/types" "^29.3.1" - "@sinonjs/fake-timers" "^9.1.2" + "@jest/types" "^29.5.0" + "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^29.3.1" - jest-mock "^29.3.1" - jest-util "^29.3.1" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-util "^29.5.0" "@jest/globals@^27.5.1": version "27.5.1" @@ -1680,15 +1608,15 @@ "@jest/types" "^27.5.1" expect "^27.5.1" -"@jest/globals@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.3.1.tgz#92be078228e82d629df40c3656d45328f134a0c6" - integrity sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q== +"@jest/globals@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.5.0.tgz#6166c0bfc374c58268677539d0c181f9c1833298" + integrity sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ== dependencies: - "@jest/environment" "^29.3.1" - "@jest/expect" "^29.3.1" - "@jest/types" "^29.3.1" - jest-mock "^29.3.1" + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/types" "^29.5.0" + jest-mock "^29.5.0" "@jest/reporters@^27.5.1": version "27.5.1" @@ -1721,16 +1649,16 @@ terminal-link "^2.0.0" v8-to-istanbul "^8.1.0" -"@jest/reporters@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.3.1.tgz#9a6d78c109608e677c25ddb34f907b90e07b4310" - integrity sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA== +"@jest/reporters@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.5.0.tgz#985dfd91290cd78ddae4914ba7921bcbabe8ac9b" + integrity sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/console" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@jridgewell/trace-mapping" "^0.3.15" "@types/node" "*" chalk "^4.0.0" @@ -1743,9 +1671,9 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^29.3.1" - jest-util "^29.3.1" - jest-worker "^29.3.1" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + jest-worker "^29.5.0" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" @@ -1758,12 +1686,12 @@ dependencies: "@sinclair/typebox" "^0.24.1" -"@jest/schemas@^29.0.0": - version "29.0.0" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a" - integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA== +"@jest/schemas@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" + integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== dependencies: - "@sinclair/typebox" "^0.24.1" + "@sinclair/typebox" "^0.25.16" "@jest/source-map@^27.5.1": version "27.5.1" @@ -1774,10 +1702,10 @@ graceful-fs "^4.2.9" source-map "^0.6.0" -"@jest/source-map@^29.2.0": - version "29.2.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.2.0.tgz#ab3420c46d42508dcc3dc1c6deee0b613c235744" - integrity sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ== +"@jest/source-map@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.4.3.tgz#ff8d05cbfff875d4a791ab679b4333df47951d20" + integrity sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w== dependencies: "@jridgewell/trace-mapping" "^0.3.15" callsites "^3.0.0" @@ -1803,13 +1731,13 @@ "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-result@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.3.1.tgz#92cd5099aa94be947560a24610aa76606de78f50" - integrity sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw== +"@jest/test-result@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.5.0.tgz#7c856a6ca84f45cc36926a4e9c6b57f1973f1408" + integrity sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ== dependencies: - "@jest/console" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/console" "^29.5.0" + "@jest/types" "^29.5.0" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" @@ -1823,14 +1751,14 @@ jest-haste-map "^27.5.1" jest-runtime "^27.5.1" -"@jest/test-sequencer@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz#fa24b3b050f7a59d48f7ef9e0b782ab65123090d" - integrity sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA== +"@jest/test-sequencer@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz#34d7d82d3081abd523dbddc038a3ddcb9f6d3cc4" + integrity sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ== dependencies: - "@jest/test-result" "^29.3.1" + "@jest/test-result" "^29.5.0" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" + jest-haste-map "^29.5.0" slash "^3.0.0" "@jest/transform@^27.5.1": @@ -1854,26 +1782,26 @@ source-map "^0.6.1" write-file-atomic "^3.0.0" -"@jest/transform@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.3.1.tgz#1e6bd3da4af50b5c82a539b7b1f3770568d6e36d" - integrity sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug== +"@jest/transform@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.5.0.tgz#cf9c872d0965f0cbd32f1458aa44a2b1988b00f9" + integrity sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw== dependencies: "@babel/core" "^7.11.6" - "@jest/types" "^29.3.1" + "@jest/types" "^29.5.0" "@jridgewell/trace-mapping" "^0.3.15" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^2.0.0" fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" - jest-regex-util "^29.2.0" - jest-util "^29.3.1" + jest-haste-map "^29.5.0" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" - write-file-atomic "^4.0.1" + write-file-atomic "^4.0.2" "@jest/types@^27.5.1": version "27.5.1" @@ -1898,30 +1826,22 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jest/types@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.3.1.tgz#7c5a80777cb13e703aeec6788d044150341147e3" - integrity sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA== +"@jest/types@^29.3.1", "@jest/types@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" + integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== dependencies: - "@jest/schemas" "^29.0.0" + "@jest/schemas" "^29.4.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" @@ -1932,28 +1852,33 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": +"@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/source-map@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" - integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" + integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== dependencies: "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@1.4.14": version "1.4.14" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== dependencies: "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" @@ -1963,96 +1888,96 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== -"@mui/base@5.0.0-alpha.107": - version "5.0.0-alpha.107" - resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-alpha.107.tgz#5547bf3aaea148b58456e6898f74bc183bdcffa9" - integrity sha512-HX/BD8CSe+Y/dpbZ5aKJScJhKQ/Hw6du2yd68Upv2cO67bwixyZ64h3aNcdDu7RQzI7nrZQm0JykffP1Orgq0g== +"@mui/base@5.0.0-beta.2": + version "5.0.0-beta.2" + resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.2.tgz#d7216897c8e523c4bd26d8d292cac1bcf156dc87" + integrity sha512-R9R+aqrl1QhZJaO05rhvooqxOaf7SKpQ+EjW80sbP3ticTVmLmrn4YBLQS7/ML+WXdrkrPtqSmKFdSE5Ik3gBQ== dependencies: - "@babel/runtime" "^7.20.1" - "@emotion/is-prop-valid" "^1.2.0" - "@mui/types" "^7.2.1" - "@mui/utils" "^5.10.15" - "@popperjs/core" "^2.11.6" + "@babel/runtime" "^7.21.0" + "@emotion/is-prop-valid" "^1.2.1" + "@mui/types" "^7.2.4" + "@mui/utils" "^5.13.1" + "@popperjs/core" "^2.11.7" clsx "^1.2.1" prop-types "^15.8.1" react-is "^18.2.0" -"@mui/core-downloads-tracker@^5.10.15": - version "5.10.15" - resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.10.15.tgz#490f3dea5327c892f063496a0219c48301da0fa0" - integrity sha512-xFcS0LpdF0Q1qJrrNsYUv9PU+ovvhCEPTOMw2jcpEFtl3CA87dLpvztORR5oE2UBFjWF7qLQLOwboQU1+xC7Cw== +"@mui/core-downloads-tracker@^5.13.2": + version "5.13.2" + resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.13.2.tgz#8802f8fa81fff46e37245a59e1e547c692e11c06" + integrity sha512-aOLCXMCySMFL2WmUhnz+DjF84AoFVu8rn35OsL759HXOZMz8zhEwVf5w/xxkWx7DycM2KXDTgAvYW48nTfqTLA== -"@mui/icons-material@^5.10.16": - version "5.10.16" - resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.10.16.tgz#9c16054d0cc54d40267447128a07e79b516ead1e" - integrity sha512-jjCc0IF6iyLiucQCu5igg3fOscSqbbvRCmyRxXgzOcLR56B0sg2L8o+ZfJ0dAg59+wvgtXaxvjze/mJg0B4iWA== +"@mui/icons-material@^5.11.11": + version "5.11.16" + resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.11.16.tgz#417fa773c56672e39d6ccfed9ac55591985f0d38" + integrity sha512-oKkx9z9Kwg40NtcIajF9uOXhxiyTZrrm9nmIJ4UjkU2IdHpd4QVLbCc/5hZN/y0C6qzi2Zlxyr9TGddQx2vx2A== dependencies: - "@babel/runtime" "^7.20.1" + "@babel/runtime" "^7.21.0" "@mui/material@^5.10.15": - version "5.10.15" - resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.10.15.tgz#37345f5a3d71c662703af7b5be0cca229b2a1416" - integrity sha512-OqoHfUtVMppFHgk2M95j+pR8MWfLKhzSdz4aKEfIpFrHIHbYang+oY7Iy/exX+vqpZSEGHgHQ0cGX0hGTGx9cg== - dependencies: - "@babel/runtime" "^7.20.1" - "@mui/base" "5.0.0-alpha.107" - "@mui/core-downloads-tracker" "^5.10.15" - "@mui/system" "^5.10.15" - "@mui/types" "^7.2.1" - "@mui/utils" "^5.10.15" - "@types/react-transition-group" "^4.4.5" + version "5.13.2" + resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.13.2.tgz#2cf36faf8a90a0971b3633cbf18b95c7c7ea555b" + integrity sha512-Pfke1l0GG2OJb/Nr10aVr8huoBFcBTdWKV5iFSTEHqf9c2C1ZlyYMISn7ui6X3Gix8vr+hP5kVqH1LAWwQSb6w== + dependencies: + "@babel/runtime" "^7.21.0" + "@mui/base" "5.0.0-beta.2" + "@mui/core-downloads-tracker" "^5.13.2" + "@mui/system" "^5.13.2" + "@mui/types" "^7.2.4" + "@mui/utils" "^5.13.1" + "@types/react-transition-group" "^4.4.6" clsx "^1.2.1" - csstype "^3.1.1" + csstype "^3.1.2" prop-types "^15.8.1" react-is "^18.2.0" react-transition-group "^4.4.5" -"@mui/private-theming@^5.10.15": - version "5.10.15" - resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.10.15.tgz#f039181e197d04d100630829c58b5c33ede209bc" - integrity sha512-l7CsUj5kYdYz118/JHSvZZTYE9WnIWwln0td5jYATnYw9cNX4ygD6AkKOUYZ1Jitp1YLJqcO8jCP9E5/Nql9IQ== +"@mui/private-theming@^5.13.1": + version "5.13.1" + resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.13.1.tgz#c3e9a0b44f9c5a51b92cfcfb660536060cb61ed7" + integrity sha512-HW4npLUD9BAkVppOUZHeO1FOKUJWAwbpy0VQoGe3McUYTlck1HezGHQCfBQ5S/Nszi7EViqiimECVl9xi+/WjQ== dependencies: - "@babel/runtime" "^7.20.1" - "@mui/utils" "^5.10.15" + "@babel/runtime" "^7.21.0" + "@mui/utils" "^5.13.1" prop-types "^15.8.1" -"@mui/styled-engine@^5.10.14": - version "5.10.14" - resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.10.14.tgz#4395198a1919254a3edabf6e8fc8d43c9c59b5c3" - integrity sha512-bgKdM57ExogWpIfhL/ngSlzF4FhbH00vYF+Y5VALTob4uslFqje0xzoWmbfcCn4cZt2NXxZJIwhsq4vzo5itlw== +"@mui/styled-engine@^5.13.2": + version "5.13.2" + resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.13.2.tgz#c87bd61c0ab8086d34828b6defe97c02bcd642ef" + integrity sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw== dependencies: - "@babel/runtime" "^7.20.1" - "@emotion/cache" "^11.10.5" - csstype "^3.1.1" + "@babel/runtime" "^7.21.0" + "@emotion/cache" "^11.11.0" + csstype "^3.1.2" prop-types "^15.8.1" -"@mui/system@^5.10.15": - version "5.10.15" - resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.10.15.tgz#4bb58d1d1a531137559b775038a18d6050d9ee57" - integrity sha512-WZmgmpYTMXAaD++QetaaM/miwhNh1JJY1dH7MJH/3Fuv3r3gnhfzE6A55lDqWxkQmlWUO2DCn/cnNZ0FkSdZUg== +"@mui/system@^5.13.2": + version "5.13.2" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.13.2.tgz#c9aa821049fc75d8ade1c0646dc4d2b67605b8fc" + integrity sha512-TPyWmRJPt0JPVxacZISI4o070xEJ7ftxpVtu6LWuYVOUOINlhoGOclam4iV8PDT3EMQEHuUrwU49po34UdWLlw== dependencies: - "@babel/runtime" "^7.20.1" - "@mui/private-theming" "^5.10.15" - "@mui/styled-engine" "^5.10.14" - "@mui/types" "^7.2.1" - "@mui/utils" "^5.10.15" + "@babel/runtime" "^7.21.0" + "@mui/private-theming" "^5.13.1" + "@mui/styled-engine" "^5.13.2" + "@mui/types" "^7.2.4" + "@mui/utils" "^5.13.1" clsx "^1.2.1" - csstype "^3.1.1" + csstype "^3.1.2" prop-types "^15.8.1" -"@mui/types@^7.2.1": - version "7.2.1" - resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.1.tgz#1eb2bc182c595029884047f2525ad4dbefea318e" - integrity sha512-c5mSM7ivD8EsqK6HUi9hQPr5V7TJ/IRThUQ9nWNYPdhCGriTSQV4vL6DflT99LkM+wLiIS1rVjphpEWxERep7A== +"@mui/types@^7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.4.tgz#b6fade19323b754c5c6de679a38f068fd50b9328" + integrity sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA== -"@mui/utils@^5.10.15": - version "5.10.15" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.10.15.tgz#54fc1b373508d20dd5568070b2dcc0818e6bebba" - integrity sha512-6AW4MLBUijJi31hxx+6utTJM2q/4hbO+QiMdtwM+f4Iy+BfFnh/elhb08apxNYLfuugPnXXpkDmzEjg+8uDU9g== +"@mui/utils@^5.13.1": + version "5.13.1" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.13.1.tgz#86199e46014215f95da046a5ec803f4a39c96eee" + integrity sha512-6lXdWwmlUbEU2jUI8blw38Kt+3ly7xkmV9ljzY4Q20WhsJMWiNry9CX8M+TaP/HbtuyR8XKsdMgQW7h7MM3n3A== dependencies: - "@babel/runtime" "^7.20.1" + "@babel/runtime" "^7.21.0" "@types/prop-types" "^15.7.5" - "@types/react-is" "^16.7.1 || ^17.0.0" + "@types/react-is" "^18.2.0" prop-types "^15.8.1" react-is "^18.2.0" @@ -2085,9 +2010,9 @@ fastq "^1.6.0" "@pmmmwh/react-refresh-webpack-plugin@^0.5.3": - version "0.5.9" - resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.9.tgz#35aae6624a6270ca7ad755800b7eec417fa6f830" - integrity sha512-7QV4cqUwhkDIHpMAZ9mestSJ2DMIotVTbOUwbiudhjCRTAWWKIaBecELiEM2LT3AHFeOAaHIcFu4dbXjX+9GBA== + version "0.5.10" + resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz#2eba163b8e7dbabb4ce3609ab5e32ab63dda3ef8" + integrity sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA== dependencies: ansi-html-community "^0.0.8" common-path-prefix "^3.0.0" @@ -2095,19 +2020,19 @@ error-stack-parser "^2.0.6" find-up "^5.0.0" html-entities "^2.1.0" - loader-utils "^2.0.3" + loader-utils "^2.0.4" schema-utils "^3.0.0" source-map "^0.7.3" -"@popperjs/core@^2.11.6": - version "2.11.6" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" - integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== +"@popperjs/core@^2.11.7": + version "2.11.7" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.7.tgz#ccab5c8f7dc557a52ca3288c10075c9ccd37fff7" + integrity sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw== -"@remix-run/router@1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.0.3.tgz#953b88c20ea00d0eddaffdc1b115c08474aa295d" - integrity sha512-ceuyTSs7PZ/tQqi19YZNBc5X7kj1f8p+4DIyrcIYFY9h+hd1OKm4RqtiWldR9eGEvIiJfsqwM4BsuCtRIuEw6Q== +"@remix-run/router@1.6.2": + version "1.6.2" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.6.2.tgz#bbe75f8c59e0b7077584920ce2cc76f8f354934d" + integrity sha512-LzqpSrMK/3JBAVBI9u3NWtOhWNw5AMQfrUFYB0+bDHTSw17z++WJLsPsxAuK+oSddsxk4d7F/JcdDPM1M5YAhA== "@rollup/plugin-babel@^5.2.0": version "5.3.1" @@ -2147,44 +2072,46 @@ picomatch "^2.2.2" "@rushstack/eslint-patch@^1.1.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" - integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== + version "1.3.0" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.3.0.tgz#f5635b36fc0dad96ef1e542a302cd914230188c0" + integrity sha512-IthPJsJR85GhOkp3Hvp8zFOPK5ynKn6STyHa/WZpioK7E1aYDiBzpqQPrngc14DszIUkIrdd3k9Iu0XSzlP/1w== "@seznam/compose-react-refs@^1.0.6": version "1.0.6" resolved "https://registry.yarnpkg.com/@seznam/compose-react-refs/-/compose-react-refs-1.0.6.tgz#6ec4e70bdd6e32f8e70b4100f27267cf306bd8df" integrity sha512-izzOXQfeQLonzrIQb8u6LQ8dk+ymz3WXTIXjvOlTXHq6sbzROg3NWU+9TTAOpEoK9Bth24/6F/XrfHJ5yR5n6Q== -"@sideway/address@^4.1.3": - version "4.1.4" - resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" - integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/formula@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c" - integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg== - -"@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== - "@sinclair/typebox@^0.24.1": version "0.24.51" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== +"@sinclair/typebox@^0.25.16": + version "0.25.24" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== + "@sinonjs/commons@^1.7.0": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.5.tgz#e280c94c95f206dcfd5aca00a43f2156b758c764" - integrity sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA== + version "1.8.6" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" + integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/commons@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== dependencies: type-detect "4.0.8" +"@sinonjs/fake-timers@^10.0.2": + version "10.2.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.2.0.tgz#b3e322a34c5f26e3184e7f6115695f299c1b1194" + integrity sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg== + dependencies: + "@sinonjs/commons" "^3.0.0" + "@sinonjs/fake-timers@^8.0.1": version "8.1.0" resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" @@ -2192,13 +2119,6 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== - dependencies: - "@sinonjs/commons" "^1.7.0" - "@surma/rollup-plugin-off-main-thread@^2.2.3": version "2.2.3" resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz#ee34985952ca21558ab0d952f00298ad2190c053" @@ -2313,13 +2233,13 @@ loader-utils "^2.0.0" "@testing-library/dom@^8.5.0": - version "8.19.0" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.19.0.tgz#bd3f83c217ebac16694329e413d9ad5fdcfd785f" - integrity sha512-6YWYPPpxG3e/xOo6HIWwB/58HukkwIVTOaZ0VwdMVjhRUX/01E4FtQbck9GazOOj7MXHc5RBzMrU86iBJHbI+A== + version "8.20.0" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.0.tgz#914aa862cef0f5e89b98cc48e3445c4c921010f6" + integrity sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA== dependencies: "@babel/code-frame" "^7.10.4" "@babel/runtime" "^7.12.5" - "@types/aria-query" "^4.2.0" + "@types/aria-query" "^5.0.1" aria-query "^5.0.0" chalk "^4.1.0" dom-accessibility-api "^0.5.9" @@ -2365,18 +2285,18 @@ resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== -"@types/aria-query@^4.2.0": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" - integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== +"@types/aria-query@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc" + integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": - version "7.1.20" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.20.tgz#e168cdd612c92a2d335029ed62ac94c95b362359" - integrity sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ== + version "7.20.0" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" + integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" "@types/babel__generator" "*" "@types/babel__template" "*" "@types/babel__traverse" "*" @@ -2397,9 +2317,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.2.tgz#235bf339d17185bdec25e024ca19cce257cc7309" - integrity sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg== + version "7.18.5" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.5.tgz#c107216842905afafd3b6e774f6f935da6f5db80" + integrity sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q== dependencies: "@babel/types" "^7.3.0" @@ -2419,9 +2339,9 @@ "@types/node" "*" "@types/connect-history-api-fallback@^1.3.5": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" - integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + version "1.5.0" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#9fd20b3974bdc2bcd4ac6567e2e0f6885cb2cf41" + integrity sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" @@ -2442,44 +2362,40 @@ "@types/estree" "*" "@types/eslint@*", "@types/eslint@^7.29.0 || ^8.4.1": - version "8.4.10" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.10.tgz#19731b9685c19ed1552da7052b6f668ed7eb64bb" - integrity sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw== + version "8.40.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.40.0.tgz#ae73dc9ec5237f2794c4f79efd6a4c73b13daf23" + integrity sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g== dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" + integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/estree@^0.0.51": - version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== - -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": - version "4.17.31" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz#a1139efeab4e7323834bb0226e62ac019f474b2f" - integrity sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q== +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + version "4.17.35" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz#c95dd4424f0d32e525d23812aa8ab8e4d3906c4f" + integrity sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" + "@types/send" "*" "@types/express@*", "@types/express@^4.17.13": - version "4.17.14" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.14.tgz#143ea0557249bc1b3b54f15db4c81c3d4eb3569c" - integrity sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg== + version "4.17.17" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== dependencies: "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.18" + "@types/express-serve-static-core" "^4.17.33" "@types/qs" "*" "@types/serve-static" "*" @@ -2488,17 +2404,18 @@ resolved "https://registry.yarnpkg.com/@types/find-cache-dir/-/find-cache-dir-3.2.1.tgz#7b959a4b9643a1e6a1a5fe49032693cc36773501" integrity sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw== -"@types/fs-extra@^9.0.13": - version "9.0.13" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" - integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== +"@types/fs-extra@^11.0.1": + version "11.0.1" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-11.0.1.tgz#f542ec47810532a8a252127e6e105f487e0a6ea5" + integrity sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA== dependencies: + "@types/jsonfile" "*" "@types/node" "*" "@types/graceful-fs@^4.1.2", "@types/graceful-fs@^4.1.3": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + version "4.1.6" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== dependencies: "@types/node" "*" @@ -2508,9 +2425,9 @@ integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== "@types/http-proxy@^1.17.8": - version "1.17.9" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a" - integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== + version "1.17.11" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.11.tgz#0ca21949a5588d55ac2b659b69035c84bd5da293" + integrity sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA== dependencies: "@types/node" "*" @@ -2533,10 +2450,10 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@*", "@types/jest@^29.0.0": - version "29.2.3" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.3.tgz#f5fd88e43e5a9e4221ca361e23790d48fcf0a211" - integrity sha512-6XwoEbmatfyoCjWRX7z0fKMmgYKe9+/HrviJ5k0X/tjJWHGAezZOfYaxqQKuzG/TvQyr+ktjm4jgbk0s4/oF2w== +"@types/jest@*", "@types/jest@^29.2.4": + version "29.5.1" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.1.tgz#83c818aa9a87da27d6da85d3378e5a34d2f31a47" + integrity sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -2551,32 +2468,39 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/jsonfile@*": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@types/jsonfile/-/jsonfile-6.1.1.tgz#ac84e9aefa74a2425a0fb3012bdea44f58970f1b" + integrity sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png== + dependencies: + "@types/node" "*" + "@types/lodash-es@^4.17.6": - version "4.17.6" - resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.6.tgz#c2ed4c8320ffa6f11b43eb89e9eaeec65966a0a0" - integrity sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg== + version "4.17.7" + resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.7.tgz#22edcae9f44aff08546e71db8925f05b33c7cc40" + integrity sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ== dependencies: "@types/lodash" "*" "@types/lodash@*": - version "4.14.190" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.190.tgz#d8e99647af141c63902d0ca53cf2b34d2df33545" - integrity sha512-5iJ3FBJBvQHQ8sFhEhJfjUP+G+LalhavTkYyrAYqz5MEJG+erSv0k9KJLb6q7++17Lafk1scaTIFXcMJlwK8Mw== + version "4.14.194" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" + integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== "@types/mime@*": version "3.0.1" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== -"@types/node@*": - version "18.11.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" - integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== -"@types/node@^14.14.31": - version "14.18.33" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.33.tgz#8c29a0036771569662e4635790ffa9e057db379b" - integrity sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg== +"@types/node@*": + version "20.2.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.3.tgz#b31eb300610c3835ac008d690de6f87e28f9b878" + integrity sha512-pg9d0yC4rVNWQzX8U7xb4olIOFuuVL9za3bzMT2pu2SU0SNEi66i2qrvhE2qt0HvkhuCaWJu7pLNOt/Pj8BIrw== "@types/node@^17.0.23": version "17.0.45" @@ -2589,9 +2513,9 @@ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/prettier@^2.1.5": - version "2.7.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" - integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== + version "2.7.2" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" + integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== "@types/prop-types@*", "@types/prop-types@^15.7.5": version "15.7.5" @@ -2614,30 +2538,30 @@ integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== "@types/react-dom@^18.0.0": - version "18.0.9" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.9.tgz#ffee5e4bfc2a2f8774b15496474f8e7fe8d0b504" - integrity sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg== + version "18.2.4" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.4.tgz#13f25bfbf4e404d26f62ac6e406591451acba9e0" + integrity sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw== dependencies: "@types/react" "*" -"@types/react-is@^16.7.1 || ^17.0.0": - version "17.0.3" - resolved "https://registry.yarnpkg.com/@types/react-is/-/react-is-17.0.3.tgz#2d855ba575f2fc8d17ef9861f084acc4b90a137a" - integrity sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw== +"@types/react-is@^18.2.0": + version "18.2.0" + resolved "https://registry.yarnpkg.com/@types/react-is/-/react-is-18.2.0.tgz#2f5137853a46017b3d56447940fb3eb92bbf24a5" + integrity sha512-1vz2yObaQkLL7YFe/pme2cpvDsCwI1WXIfL+5eLz0MI9gFG24Re16RzUsI8t9XZn9ZWvgLNDrJBmrqXJO7GNQQ== dependencies: "@types/react" "*" -"@types/react-transition-group@^4.4.5": - version "4.4.5" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416" - integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA== +"@types/react-transition-group@^4.4.6": + version "4.4.6" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.6.tgz#18187bcda5281f8e10dfc48f0943e2fdf4f75e2e" + integrity sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^18.0.25": - version "18.0.25" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.25.tgz#8b1dcd7e56fe7315535a4af25435e0bb55c8ae44" - integrity sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g== +"@types/react@*", "@types/react@^18.0.31": + version "18.2.7" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.7.tgz#dfb4518042a3117a045b8c222316f83414a783b3" + integrity sha512-ojrXpSH2XFCmHm7Jy3q44nXDyN54+EYKP2lBhJ2bqfyPj6cIUW/FZW/Csdia34NQgq7KYcAlHi5184m4X88+yw== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2656,14 +2580,22 @@ integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== "@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + version "0.16.3" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" + integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== + +"@types/semver@^7.3.12", "@types/semver@^7.3.13": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== -"@types/semver@^7.3.12": - version "7.3.13" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" - integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== +"@types/send@*": + version "0.17.1" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz#ed4932b8a2a805f1fe362a70f4e62d0ac994e301" + integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + dependencies: + "@types/mime" "^1" + "@types/node" "*" "@types/serve-index@^1.9.1": version "1.9.1" @@ -2673,23 +2605,13 @@ "@types/express" "*" "@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" - integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== + version "1.15.1" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.1.tgz#86b1753f0be4f9a1bee68d459fcda5be4ea52b5d" + integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== dependencies: "@types/mime" "*" "@types/node" "*" -"@types/sinonjs__fake-timers@8.1.1": - version "8.1.1" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" - integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== - -"@types/sizzle@^2.3.2": - version "2.3.3" - resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" - integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== - "@types/sockjs@^0.3.33": version "0.3.33" resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" @@ -2703,21 +2625,21 @@ integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== "@types/testing-library__jest-dom@^5.9.1": - version "5.14.5" - resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz#d113709c90b3c75fdb127ec338dad7d5f86c974f" - integrity sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ== + version "5.14.6" + resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.6.tgz#4887f6e1af11215428ab02777873bcede98a53b0" + integrity sha512-FkHXCb+ikSoUP4Y4rOslzTdX5sqYwMxfefKh1GmZ8ce1GOkEHntSp6b5cGadmNfp5e4BMEWOMx+WSKd5/MqlDA== dependencies: "@types/jest" "*" "@types/trusted-types@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756" - integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.3.tgz#a136f83b0758698df454e328759dbd3d44555311" + integrity sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g== "@types/ws@^8.5.1": - version "8.5.3" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" - integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== + version "8.5.4" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.4.tgz#bb10e36116d6e570dd943735f86c933c1587b8a5" + integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== dependencies: "@types/node" "*" @@ -2727,240 +2649,234 @@ integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@types/yargs@^16.0.0": - version "16.0.4" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" - integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== + version "16.0.5" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.5.tgz#12cc86393985735a283e387936398c2f9e5f88e3" + integrity sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ== dependencies: "@types/yargs-parser" "*" "@types/yargs@^17.0.8": - version "17.0.14" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.14.tgz#0943473052c24bd8cf2d1de25f1a710259327237" - integrity sha512-9Pj7abXoW1RSTcZaL2Hk6G2XyLMlp5ECdVC/Zf2p/KBjC3srijLGgRAXOBjtFrJoIrvxdTKyKDA14bEcbxBaWw== + version "17.0.24" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" + integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== dependencies: "@types/yargs-parser" "*" "@types/yarnpkg__lockfile@^1.1.5": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@types/yarnpkg__lockfile/-/yarnpkg__lockfile-1.1.5.tgz#9639020e1fb65120a2f4387db8f1e8b63efdf229" - integrity sha512-8NYnGOctzsI4W0ApsP/BIHD/LnxpJ6XaGf2AZmz4EyDYJMxtprN4279dLNI1CPZcwC9H18qYcaFv4bXi0wmokg== - -"@types/yauzl@^2.9.1": - version "2.10.0" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" - integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== - dependencies: - "@types/node" "*" - -"@typescript-eslint/eslint-plugin@^5.38.0", "@typescript-eslint/eslint-plugin@^5.5.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.44.0.tgz#105788f299050c917eb85c4d9fd04b089e3740de" - integrity sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw== - dependencies: - "@typescript-eslint/scope-manager" "5.44.0" - "@typescript-eslint/type-utils" "5.44.0" - "@typescript-eslint/utils" "5.44.0" + version "1.1.6" + resolved "https://registry.yarnpkg.com/@types/yarnpkg__lockfile/-/yarnpkg__lockfile-1.1.6.tgz#60a35ede6197d8cbedd5bb8393f3921e8d56d44b" + integrity sha512-kbdQa3J+hVCkqmGQm31fthEwGxszZtepw84p9QGCiJB7TmiPqPAf3/g9eZUnkCeanmiFOaG4pVhiPDyqJxaoaw== + +"@typescript-eslint/eslint-plugin@^5.5.0", "@typescript-eslint/eslint-plugin@^5.54.0": + version "5.59.7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.7.tgz#e470af414f05ecfdc05a23e9ce6ec8f91db56fe2" + integrity sha512-BL+jYxUFIbuYwy+4fF86k5vdT9lT0CNJ6HtwrIvGh0PhH8s0yy5rjaKH2fDCrz5ITHy07WCzVGNvAmjJh4IJFA== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.59.7" + "@typescript-eslint/type-utils" "5.59.7" + "@typescript-eslint/utils" "5.59.7" debug "^4.3.4" + grapheme-splitter "^1.0.4" ignore "^5.2.0" natural-compare-lite "^1.4.0" - regexpp "^3.2.0" semver "^7.3.7" tsutils "^3.21.0" "@typescript-eslint/experimental-utils@^5.0.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.44.0.tgz#51ee9699532270ce3c95e2dee4313d18c24fad56" - integrity sha512-j8GLemAySe8oUCgILdUaT66pemdWSYcwUYG2Pb71O119hCdvkU+4q8sUTbnDg8NhlZEzSWG2N1v4IxT1kEZrGg== + version "5.59.7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.59.7.tgz#77188db1240d173ed5b49ea51f3e90f188a54083" + integrity sha512-jqM0Cjfvta/sBlY1MxdXYv853/dJUC2wmUWnKoG2srwp0njNGQ6Zu/XLWoRFiLvocQbzBbpHkPFwKgC2UqyovA== dependencies: - "@typescript-eslint/utils" "5.44.0" + "@typescript-eslint/utils" "5.59.7" -"@typescript-eslint/parser@^5.41.0", "@typescript-eslint/parser@^5.5.0", "@typescript-eslint/parser@^5.9.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.44.0.tgz#99e2c710a2252191e7a79113264f438338b846ad" - integrity sha512-H7LCqbZnKqkkgQHaKLGC6KUjt3pjJDx8ETDqmwncyb6PuoigYajyAwBGz08VU/l86dZWZgI4zm5k2VaKqayYyA== +"@typescript-eslint/parser@^5.49.0", "@typescript-eslint/parser@^5.5.0", "@typescript-eslint/parser@^5.9.0": + version "5.59.7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.7.tgz#02682554d7c1028b89aa44a48bf598db33048caa" + integrity sha512-VhpsIEuq/8i5SF+mPg9jSdIwgMBBp0z9XqjiEay+81PYLJuroN+ET1hM5IhkiYMJd9MkTz8iJLt7aaGAgzWUbQ== dependencies: - "@typescript-eslint/scope-manager" "5.44.0" - "@typescript-eslint/types" "5.44.0" - "@typescript-eslint/typescript-estree" "5.44.0" + "@typescript-eslint/scope-manager" "5.59.7" + "@typescript-eslint/types" "5.59.7" + "@typescript-eslint/typescript-estree" "5.59.7" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.44.0.tgz#988c3f34b45b3474eb9ff0674c18309dedfc3e04" - integrity sha512-2pKml57KusI0LAhgLKae9kwWeITZ7IsZs77YxyNyIVOwQ1kToyXRaJLl+uDEXzMN5hnobKUOo2gKntK9H1YL8g== +"@typescript-eslint/scope-manager@5.59.7": + version "5.59.7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.7.tgz#0243f41f9066f3339d2f06d7f72d6c16a16769e2" + integrity sha512-FL6hkYWK9zBGdxT2wWEd2W8ocXMu3K94i3gvMrjXpx+koFYdYV7KprKfirpgY34vTGzEPPuKoERpP8kD5h7vZQ== dependencies: - "@typescript-eslint/types" "5.44.0" - "@typescript-eslint/visitor-keys" "5.44.0" + "@typescript-eslint/types" "5.59.7" + "@typescript-eslint/visitor-keys" "5.59.7" -"@typescript-eslint/type-utils@5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.44.0.tgz#bc5a6e8a0269850714a870c9268c038150dfb3c7" - integrity sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w== +"@typescript-eslint/type-utils@5.59.7": + version "5.59.7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.7.tgz#89c97291371b59eb18a68039857c829776f1426d" + integrity sha512-ozuz/GILuYG7osdY5O5yg0QxXUAEoI4Go3Do5xeu+ERH9PorHBPSdvD3Tjp2NN2bNLh1NJQSsQu2TPu/Ly+HaQ== dependencies: - "@typescript-eslint/typescript-estree" "5.44.0" - "@typescript-eslint/utils" "5.44.0" + "@typescript-eslint/typescript-estree" "5.59.7" + "@typescript-eslint/utils" "5.59.7" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.44.0.tgz#f3f0b89aaff78f097a2927fe5688c07e786a0241" - integrity sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ== +"@typescript-eslint/types@5.59.7": + version "5.59.7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.7.tgz#6f4857203fceee91d0034ccc30512d2939000742" + integrity sha512-UnVS2MRRg6p7xOSATscWkKjlf/NDKuqo5TdbWck6rIRZbmKpVNTLALzNvcjIfHBE7736kZOFc/4Z3VcZwuOM/A== -"@typescript-eslint/typescript-estree@5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.44.0.tgz#0461b386203e8d383bb1268b1ed1da9bc905b045" - integrity sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw== +"@typescript-eslint/typescript-estree@5.59.7": + version "5.59.7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.7.tgz#b887acbd4b58e654829c94860dbff4ac55c5cff8" + integrity sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ== dependencies: - "@typescript-eslint/types" "5.44.0" - "@typescript-eslint/visitor-keys" "5.44.0" + "@typescript-eslint/types" "5.59.7" + "@typescript-eslint/visitor-keys" "5.59.7" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.44.0", "@typescript-eslint/utils@^5.13.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.44.0.tgz#d733da4d79d6c30f1a68b531cdda1e0c1f00d52d" - integrity sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw== +"@typescript-eslint/utils@5.59.7", "@typescript-eslint/utils@^5.58.0": + version "5.59.7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.7.tgz#7adf068b136deae54abd9a66ba5a8780d2d0f898" + integrity sha512-yCX9WpdQKaLufz5luG4aJbOpdXf/fjwGMcLFXZVPUz3QqLirG5QcwwnIHNf8cjLjxK4qtzTO8udUtMQSAToQnQ== dependencies: + "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.44.0" - "@typescript-eslint/types" "5.44.0" - "@typescript-eslint/typescript-estree" "5.44.0" + "@typescript-eslint/scope-manager" "5.59.7" + "@typescript-eslint/types" "5.59.7" + "@typescript-eslint/typescript-estree" "5.59.7" eslint-scope "^5.1.1" - eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.44.0.tgz#10740dc28902bb903d12ee3a005cc3a70207d433" - integrity sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ== +"@typescript-eslint/visitor-keys@5.59.7": + version "5.59.7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.7.tgz#09c36eaf268086b4fbb5eb9dc5199391b6485fc5" + integrity sha512-tyN+X2jvMslUszIiYbF0ZleP+RqQsFVpGrKI6e0Eet1w8WmhsAtmzaqm8oM8WJQ1ysLwhnsK/4hYHJjOgJVfQQ== dependencies: - "@typescript-eslint/types" "5.44.0" + "@typescript-eslint/types" "5.59.7" eslint-visitor-keys "^3.3.0" -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== +"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" + integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== +"@webassemblyjs/helper-buffer@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" + integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" "@xtuc/long" "4.2.2" -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== +"@webassemblyjs/helper-wasm-section@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" + integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== - -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== - dependencies: - "@webassemblyjs/ast" "1.11.1" +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" + integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-opt" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/wast-printer" "1.11.6" + +"@webassemblyjs/wasm-gen@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" + integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" + integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + +"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" + integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" + integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== + dependencies: + "@webassemblyjs/ast" "1.11.6" "@xtuc/long" "4.2.2" "@xtuc/ieee754@^1.2.0": @@ -2999,44 +2915,35 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== +acorn-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-node@^1.8.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" - integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== - dependencies: - acorn "^7.0.0" - acorn-walk "^7.0.0" - xtend "^4.0.2" - -acorn-walk@^7.0.0, acorn-walk@^7.1.1: +acorn-walk@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn@^7.0.0, acorn@^7.1.1: +acorn@^7.1.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.2.4, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: - version "8.8.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" - integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== address@^1.0.1, address@^1.1.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.1.tgz#25bb61095b7522d65b357baa11bc05492d4c8acd" - integrity sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA== + version "1.2.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== adjust-sourcemap-loader@^4.0.0: version "4.0.0" @@ -3053,14 +2960,6 @@ agent-base@6: dependencies: debug "4" -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - ajv-formats@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" @@ -3073,7 +2972,7 @@ ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv-keywords@^5.0.0: +ajv-keywords@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== @@ -3090,22 +2989,17 @@ ajv@^6.10.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.6.0, ajv@^8.8.0: - version "8.11.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.2.tgz#aecb20b50607acf2569b6382167b65a96008bb78" - integrity sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg== +ajv@^8.0.0, ajv@^8.6.0, ajv@^8.9.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" uri-js "^4.2.2" -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.1: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -3146,6 +3040,11 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -3154,23 +3053,6 @@ anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -append-transform@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" - integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== - dependencies: - default-require-extensions "^3.0.0" - -arch@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" - integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== - -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== - arg@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" @@ -3188,15 +3070,7 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" - integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== - dependencies: - "@babel/runtime" "^7.10.2" - "@babel/runtime-corejs3" "^7.10.2" - -aria-query@^5.0.0: +aria-query@^5.0.0, aria-query@^5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== @@ -3208,6 +3082,14 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -3218,7 +3100,7 @@ array-flatten@^2.1.2: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.4, array-includes@^3.1.5, array-includes@^3.1.6: +array-includes@^3.1.5, array-includes@^3.1.6: version "3.1.6" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== @@ -3234,7 +3116,7 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.flat@^1.2.5: +array.prototype.flat@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== @@ -3281,29 +3163,12 @@ asap@~2.0.6: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== - ast-types-flow@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async@^3.2.0, async@^3.2.3: +async@^3.2.3: version "3.2.4" resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== @@ -3319,12 +3184,12 @@ at-least-node@^1.0.0: integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== autoprefixer@^10.4.13: - version "10.4.13" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" - integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== + version "10.4.14" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" + integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== dependencies: - browserslist "^4.21.4" - caniuse-lite "^1.0.30001426" + browserslist "^4.21.5" + caniuse-lite "^1.0.30001464" fraction.js "^4.2.0" normalize-range "^0.1.2" picocolors "^1.0.0" @@ -3335,32 +3200,17 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== - -axe-core@^4.4.3: - version "4.5.2" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.5.2.tgz#823fdf491ff717ac3c58a52631d4206930c1d9f7" - integrity sha512-u2MVsXfew5HBvjsczCv+xlwdNnB1oQR9HlAcsejZttNjKKSkeDNVwB1vMThIUIFI9GoT57Vtk8iQLwqOfAkboA== +axe-core@^4.6.2: + version "4.7.1" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.1.tgz#04392c9ccb3d7d7c5d2f8684f148d56d3442f33d" + integrity sha512-sCXXUhA+cljomZ3ZAwb8i1p3oOlkABzPy08ZDAoGcYuvtBPlQ1Ytde129ArXyHWDhfeewq7rlx9F+cUx2SSlkg== -axios@^0.21.1: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== +axobject-query@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" + integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== dependencies: - follow-redirects "^1.14.0" - -axobject-query@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" - integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== + deep-equal "^2.0.5" babel-jest@^27.4.2, babel-jest@^27.5.1: version "27.5.1" @@ -3376,15 +3226,15 @@ babel-jest@^27.4.2, babel-jest@^27.5.1: graceful-fs "^4.2.9" slash "^3.0.0" -babel-jest@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.3.1.tgz#05c83e0d128cd48c453eea851482a38782249f44" - integrity sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA== +babel-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" + integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q== dependencies: - "@jest/transform" "^29.3.1" + "@jest/transform" "^29.5.0" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.2.0" + babel-preset-jest "^29.5.0" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" @@ -3399,17 +3249,6 @@ babel-loader@^8.2.3: make-dir "^3.1.0" schema-utils "^2.6.5" -babel-plugin-istanbul@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" - integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^4.0.0" - test-exclude "^6.0.0" - babel-plugin-istanbul@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" @@ -3431,10 +3270,10 @@ babel-plugin-jest-hoist@^27.5.1: "@types/babel__core" "^7.0.0" "@types/babel__traverse" "^7.0.6" -babel-plugin-jest-hoist@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz#23ee99c37390a98cfddf3ef4a78674180d823094" - integrity sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA== +babel-plugin-jest-hoist@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" + integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -3510,12 +3349,12 @@ babel-preset-jest@^27.5.1: babel-plugin-jest-hoist "^27.5.1" babel-preset-current-node-syntax "^1.0.0" -babel-preset-jest@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz#3048bea3a1af222e3505e4a767a974c95a7620dc" - integrity sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA== +babel-preset-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" + integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== dependencies: - babel-plugin-jest-hoist "^29.2.0" + babel-plugin-jest-hoist "^29.5.0" babel-preset-current-node-syntax "^1.0.0" babel-preset-react-app@^10.0.1: @@ -3545,11 +3384,6 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - bash-glob@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bash-glob/-/bash-glob-2.0.0.tgz#a8ef19450783403ed93fccca2dbe09f2cf6320dc" @@ -3576,13 +3410,6 @@ batch@0.6.1: resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== - dependencies: - tweetnacl "^0.14.3" - bfj@^7.0.2: version "7.0.2" resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.0.2.tgz#1988ce76f3add9ac2913fd8ba47aad9e651bfbb2" @@ -3603,17 +3430,7 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -blob-util@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" - integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== - -bluebird@3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.1.tgz#df70e302b471d7473489acf26a93d63b53f874de" - integrity sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg== - -bluebird@3.7.2, bluebird@^3.5.5, bluebird@^3.7.2: +bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -3637,9 +3454,9 @@ body-parser@1.20.1: unpipe "1.0.0" bonjour-service@^1.0.11: - version "1.0.14" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.0.14.tgz#c346f5bc84e87802d08f8d5a60b93f758e514ee7" - integrity sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ== + version "1.1.1" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.1.1.tgz#960948fa0e0153f5d26743ab15baf8e33752c135" + integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== dependencies: array-flatten "^2.1.2" dns-equal "^1.0.0" @@ -3678,15 +3495,15 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.18.1, browserslist@^4.21.3, browserslist@^4.21.4: - version "4.21.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== dependencies: - caniuse-lite "^1.0.30001400" - electron-to-chromium "^1.4.251" - node-releases "^2.0.6" - update-browserslist-db "^1.0.9" + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" bser@2.1.1: version "2.1.1" @@ -3695,24 +3512,11 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== - buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - builtin-modules@^3.1.0: version "3.3.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" @@ -3728,21 +3532,6 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -cachedir@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" - integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== - -caching-transform@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" - integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== - dependencies: - hasha "^5.0.0" - make-dir "^3.0.0" - package-hash "^4.0.0" - write-file-atomic "^3.0.0" - call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -3769,7 +3558,7 @@ camelcase-css@^2.0.1: resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== -camelcase@^5.0.0, camelcase@^5.3.1: +camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -3789,29 +3578,16 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001426: - version "1.0.30001434" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz#ec1ec1cfb0a93a34a0600d37903853030520a4e5" - integrity sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: + version "1.0.30001489" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001489.tgz#ca82ee2d4e4dbf2bd2589c9360d3fcc2c7ba3bd8" + integrity sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ== case-sensitive-paths-webpack-plugin@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== - -chalk@4.1.2, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chalk@^2.0.0, chalk@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -3829,10 +3605,18 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^5.0.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.1.2.tgz#d957f370038b75ac572471e83be4c5ca9f8e8c45" - integrity sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ== +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" + integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== char-regex@^1.0.2: version "1.0.2" @@ -3844,16 +3628,6 @@ char-regex@^2.0.0: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-2.0.1.tgz#6dafdb25f9d3349914079f010ba8d0e6ff9cd01e" integrity sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw== -charenc@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== - -check-more-types@2.24.0, check-more-types@^2.24.0: - version "2.24.0" - resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" - integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== - check-types@^11.1.1: version "11.2.2" resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.2.tgz#7afc0b6a860d686885062f2dba888ba5710335b4" @@ -3880,9 +3654,9 @@ chrome-trace-event@^1.0.2: integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== ci-info@^3.2.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.6.2.tgz#362ea15378f1c39378ba786affbc1c9ef015ecfd" - integrity sha512-lVZdhvbEudris15CLytp2u6Y0p5EKfztae9Fqa189MfNmln9F33XuH69v5fvNfiRN5/0eAUz2yJL3mo+nhaRKg== + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== cjs-module-lexer@^1.0.0: version "1.2.2" @@ -3890,50 +3664,12 @@ cjs-module-lexer@^1.0.0: integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== clean-css@^5.2.2: - version "5.3.1" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.1.tgz#d0610b0b90d125196a2894d35366f734e5d7aa32" - integrity sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg== + version "5.3.2" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" + integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== dependencies: source-map "~0.6.0" -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-table3@~0.6.1: - version "0.6.3" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" - integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== - dependencies: - string-width "^4.2.0" - optionalDependencies: - "@colors/colors" "1.5.0" - -cli-truncate@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== - dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -3995,7 +3731,7 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== @@ -4029,32 +3765,37 @@ colord@^2.9.1: resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== -colorette@^2.0.10, colorette@^2.0.16: - version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== +colorette@^2.0.10: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== colors@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: +combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + commander@^2.11.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== commander@^7.2.0: version "7.2.0" @@ -4066,11 +3807,6 @@ commander@^8.3.0: resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== -commander@^9.4.0: - version "9.4.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.1.tgz#d1dd8f2ce6faf93147295c0df13c7c21141cfbdd" - integrity sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw== - common-path-prefix@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" @@ -4134,9 +3870,9 @@ content-disposition@0.5.4: safe-buffer "5.2.1" content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.9.0" @@ -4159,26 +3895,21 @@ cookie@0.5.0: integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== core-js-compat@^3.25.1: - version "3.26.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.26.1.tgz#0e710b09ebf689d719545ac36e49041850f943df" - integrity sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A== + version "3.30.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.2.tgz#83f136e375babdb8c80ad3c22d67c69098c1dd8b" + integrity sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA== dependencies: - browserslist "^4.21.4" + browserslist "^4.21.5" -core-js-pure@^3.23.3, core-js-pure@^3.25.1: - version "3.26.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.26.1.tgz#653f4d7130c427820dcecd3168b594e8bb095a33" - integrity sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ== +core-js-pure@^3.23.3: + version "3.30.2" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.30.2.tgz#005a82551f4af3250dcfb46ed360fad32ced114e" + integrity sha512-p/npFUJXXBkCCTIlEGBdghofn00jWG6ZOtdoIXSJmAu2QBvN0IqpZXWweOytcwE6cfx8ZvVUy1vw8zxhe4Y2vg== core-js@^3.19.2: - version "3.26.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.26.1.tgz#7a9816dabd9ee846c1c0fe0e8fcad68f3709134e" - integrity sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA== - -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + version "3.30.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.30.2.tgz#6528abfda65e5ad728143ea23f7a14f0dcf503fc" + integrity sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg== core-util-is@~1.0.0: version "1.0.3" @@ -4216,7 +3947,7 @@ cross-spawn@^5.1.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -4225,11 +3956,6 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -crypt@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== - crypto-random-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" @@ -4243,9 +3969,9 @@ css-blank-pseudo@^3.0.3: postcss-selector-parser "^6.0.9" css-declaration-sorter@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz#be5e1d71b7a992433fb1c542c7a1b835e45682ec" - integrity sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w== + version "6.4.0" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz#630618adc21724484b3e9505bce812def44000ad" + integrity sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew== css-has-pseudo@^3.0.4: version "3.0.4" @@ -4255,14 +3981,14 @@ css-has-pseudo@^3.0.4: postcss-selector-parser "^6.0.9" css-loader@^6.5.1: - version "6.7.2" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.2.tgz#26bc22401b5921686a10fbeba75d124228302304" - integrity sha512-oqGbbVcBJkm8QwmnNzrFrWTnudnRZC+1eXikLJl0n4ljcfotgRifpg2a1lKy8jTrc4/d9A/ap1GFq1jDKG7J+Q== + version "6.7.4" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.4.tgz#a5d8ec28a73f3e0823998cfee2a1f7e564b91f9b" + integrity sha512-0Y5uHtK5BswfaGJ+jrO+4pPg1msFBc0pwPIE1VqfpmVn6YbDfYfXMj8rfd7nt+4goAhJueO+H/I40VWJfcP1mQ== dependencies: icss-utils "^5.1.0" - postcss "^8.4.18" + postcss "^8.4.21" postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" + postcss-modules-local-by-default "^4.0.1" postcss-modules-scope "^3.0.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" @@ -4343,31 +4069,31 @@ css.escape@^1.5.1: integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== cssdb@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.1.0.tgz#574f97235a83eb753a29f0b1f2cbacac0d628bb8" - integrity sha512-Sd99PrFgx28ez4GHu8yoQIufc/70h9oYowDf4EjeIKi8mac9whxRjhM3IaMr6EllP6KKKWtJrMfN6C7T9tIWvQ== + version "7.6.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.6.0.tgz#beac8f7a5f676db62d3c33da517ef4c9eb008f8b" + integrity sha512-Nna7rph8V0jC6+JBY4Vk4ndErUmfJfV6NJCaZdurL0omggabiy+QB2HCQtu5c/ACLZ0I7REv7A4QyPIoYzZx0w== cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-default@^5.2.13: - version "5.2.13" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz#e7353b0c57975d1bdd97ac96e68e5c1b8c68e990" - integrity sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ== +cssnano-preset-default@^5.2.14: + version "5.2.14" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8" + integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== dependencies: css-declaration-sorter "^6.3.1" cssnano-utils "^3.1.0" postcss-calc "^8.2.3" - postcss-colormin "^5.3.0" + postcss-colormin "^5.3.1" postcss-convert-values "^5.1.3" postcss-discard-comments "^5.1.2" postcss-discard-duplicates "^5.1.0" postcss-discard-empty "^5.1.1" postcss-discard-overridden "^5.1.0" postcss-merge-longhand "^5.1.7" - postcss-merge-rules "^5.1.3" + postcss-merge-rules "^5.1.4" postcss-minify-font-values "^5.1.0" postcss-minify-gradients "^5.1.1" postcss-minify-params "^5.1.4" @@ -4382,7 +4108,7 @@ cssnano-preset-default@^5.2.13: postcss-normalize-url "^5.1.0" postcss-normalize-whitespace "^5.1.1" postcss-ordered-values "^5.1.3" - postcss-reduce-initial "^5.1.1" + postcss-reduce-initial "^5.1.2" postcss-reduce-transforms "^5.1.0" postcss-svgo "^5.1.0" postcss-unique-selectors "^5.1.1" @@ -4393,11 +4119,11 @@ cssnano-utils@^3.1.0: integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== cssnano@^5.0.6: - version "5.1.14" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.14.tgz#07b0af6da73641276fe5a6d45757702ebae2eb05" - integrity sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw== + version "5.1.15" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" + integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== dependencies: - cssnano-preset-default "^5.2.13" + cssnano-preset-default "^5.2.14" lilconfig "^2.0.3" yaml "^1.10.2" @@ -4425,76 +4151,16 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -csstype@^3.0.2, csstype@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" - integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== - -cypress-localstorage-commands@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cypress-localstorage-commands/-/cypress-localstorage-commands-2.2.1.tgz#9895d75a3e8059e78d61231c5794dc46e0fc5fdd" - integrity sha512-m7IwoM+BMOJj7FzzN4It268c/i/Ur72CQX8JwLICkQ6ZgF1XNJOIKlQ7Rszg45ATLTjVTL1QElKCZECoU8cthQ== - -cypress@^10.8.0: - version "10.11.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-10.11.0.tgz#e9fbdd7638bae3d8fb7619fd75a6330d11ebb4e8" - integrity sha512-lsaE7dprw5DoXM00skni6W5ElVVLGAdRUUdZjX2dYsGjbY/QnpzWZ95Zom1mkGg0hAaO/QVTZoFVS7Jgr/GUPA== - dependencies: - "@cypress/request" "^2.88.10" - "@cypress/xvfb" "^1.2.4" - "@types/node" "^14.14.31" - "@types/sinonjs__fake-timers" "8.1.1" - "@types/sizzle" "^2.3.2" - arch "^2.2.0" - blob-util "^2.0.2" - bluebird "^3.7.2" - buffer "^5.6.0" - cachedir "^2.3.0" - chalk "^4.1.0" - check-more-types "^2.24.0" - cli-cursor "^3.1.0" - cli-table3 "~0.6.1" - commander "^5.1.0" - common-tags "^1.8.0" - dayjs "^1.10.4" - debug "^4.3.2" - enquirer "^2.3.6" - eventemitter2 "6.4.7" - execa "4.1.0" - executable "^4.1.1" - extract-zip "2.0.1" - figures "^3.2.0" - fs-extra "^9.1.0" - getos "^3.2.1" - is-ci "^3.0.0" - is-installed-globally "~0.4.0" - lazy-ass "^1.6.0" - listr2 "^3.8.3" - lodash "^4.17.21" - log-symbols "^4.0.0" - minimist "^1.2.6" - ospath "^1.2.2" - pretty-bytes "^5.6.0" - proxy-from-env "1.0.0" - request-progress "^3.0.0" - semver "^7.3.2" - supports-color "^8.1.1" - tmp "~0.2.1" - untildify "^4.0.0" - yauzl "^2.10.0" +csstype@^3.0.2, csstype@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== damerau-levenshtein@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== - dependencies: - assert-plus "^1.0.0" - data-urls@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" @@ -4505,64 +4171,37 @@ data-urls@^2.0.0: whatwg-url "^8.0.0" date-fns@^2.29.2: - version "2.29.3" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" - integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== - -dayjs@1.10.7: - version "1.10.7" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.7.tgz#2cf5f91add28116748440866a0a1d26f3a6ce468" - integrity sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig== - -dayjs@^1.10.4: - version "1.11.6" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.6.tgz#2e79a226314ec3ec904e3ee1dd5a4f5e5b1c7afb" - integrity sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ== + version "2.30.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== + dependencies: + "@babel/runtime" "^7.21.0" -debug@2.6.9, debug@^2.6.0, debug@^2.6.9: +debug@2.6.9, debug@^2.6.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" - integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== - dependencies: - ms "2.1.2" - -debug@4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -debug@^3.1.0, debug@^3.2.7: +debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - decimal.js@^10.2.1: - version "10.4.2" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.2.tgz#0341651d1d997d86065a2ce3a441fbd0d8e8b98e" - integrity sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA== + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== dedent@^0.7.0: version "0.7.0" @@ -4570,25 +4209,28 @@ dedent@^0.7.0: integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== deep-equal@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.1.0.tgz#5ba60402cf44ab92c2c07f3f3312c3d857a0e1dd" - integrity sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA== + version "2.2.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.1.tgz#c72ab22f3a7d3503a4ca87dde976fe9978816739" + integrity sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ== dependencies: + array-buffer-byte-length "^1.0.0" call-bind "^1.0.2" - es-get-iterator "^1.1.2" - get-intrinsic "^1.1.3" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.0" is-arguments "^1.1.1" + is-array-buffer "^3.0.2" is-date-object "^1.0.5" is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" isarray "^2.0.5" object-is "^1.1.5" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" + regexp.prototype.flags "^1.5.0" side-channel "^1.0.4" which-boxed-primitive "^1.0.2" which-collection "^1.0.1" - which-typed-array "^1.1.8" + which-typed-array "^1.1.9" deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" @@ -4596,9 +4238,9 @@ deep-is@^0.1.3, deep-is@~0.1.3: integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== default-gateway@^6.0.3: version "6.0.3" @@ -4607,31 +4249,19 @@ default-gateway@^6.0.3: dependencies: execa "^5.0.0" -default-require-extensions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.1.tgz#bfae00feeaeada68c2ae256c62540f60b80625bd" - integrity sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw== - dependencies: - strip-bom "^4.0.0" - define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== dependencies: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -defined@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" - integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -4670,15 +4300,6 @@ detect-port-alt@^1.1.6: address "^1.0.1" debug "^2.6.0" -detective@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.1.tgz#6af01eeda11015acb0e73f933242b70f24f91034" - integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw== - dependencies: - acorn-node "^1.8.2" - defined "^1.0.0" - minimist "^1.2.6" - didyoumean@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" @@ -4689,10 +4310,10 @@ diff-sequences@^27.5.1: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== -diff-sequences@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.3.1.tgz#104b5b95fe725932421a9c6e5b4bef84c3f2249e" - integrity sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ== +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== dir-glob@^3.0.1: version "3.0.1" @@ -4712,9 +4333,9 @@ dns-equal@^1.0.0: integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== dns-packet@^5.2.2: - version "5.4.0" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.4.0.tgz#1f88477cf9f27e78a213fb6d118ae38e759a879b" - integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g== + version "5.6.0" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.0.tgz#2202c947845c7a63c23ece58f2f70ff6ab4c2f7d" + integrity sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ== dependencies: "@leichtgewicht/ip-codec" "^2.0.1" @@ -4733,9 +4354,9 @@ doctrine@^3.0.0: esutils "^2.0.2" dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: - version "0.5.14" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz#56082f71b1dc7aac69d83c4285eef39c15d93f56" - integrity sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg== + version "0.5.16" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== dom-converter@^0.2.0: version "0.2.0" @@ -4828,7 +4449,7 @@ dotenv@^10.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== -duplexer@^0.1.2, duplexer@~0.1.1: +duplexer@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== @@ -4838,30 +4459,22 @@ each-parallel-async@^1.0.0: resolved "https://registry.yarnpkg.com/each-parallel-async/-/each-parallel-async-1.0.0.tgz#91783e190000c7dd588336b2d468ebaf71980f7b" integrity sha512-P/9kLQiQj0vZNzphvKKTgRgMnlqs5cJsxeAiuog1jrUnwv0Z3hVUwJDQiP7MnLb2I9S15nR9SRUceFT9IxtqRg== -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== ejs@^3.1.6: - version "3.1.8" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" - integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== + version "3.1.9" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.251: - version "1.4.284" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" - integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== +electron-to-chromium@^1.4.284: + version "1.4.405" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.405.tgz#487bdba2d82a59b092d6b6e4602bf733cec6a7ef" + integrity sha512-JdDgnwU69FMZURoesf9gNOej2Cms1XJFfLk24y1IBtnAdhTcJY/mXnokmpmxHN59PcykBP4bgUU98vLY44Lhuw== emittery@^0.10.2: version "0.10.2" @@ -4898,28 +4511,14 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^5.10.0: - version "5.12.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" - integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== +enhanced-resolve@^5.14.1: + version "5.14.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz#de684b6803724477a4af5d74ccae5de52c25f6b3" + integrity sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - entities@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" @@ -4944,59 +4543,79 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.3.4" -es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.20.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" - integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== +es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: + version "1.21.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" + integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== dependencies: + array-buffer-byte-length "^1.0.0" + available-typed-arrays "^1.0.5" call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function-bind "^1.1.1" function.prototype.name "^1.1.5" - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.0" get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" has "^1.0.3" has-property-descriptors "^1.0.0" + has-proto "^1.0.1" has-symbols "^1.0.3" - internal-slot "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" is-string "^1.0.7" + is-typed-array "^1.1.10" is-weakref "^1.0.2" - object-inspect "^1.12.2" + object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" regexp.prototype.flags "^1.4.3" safe-regex-test "^1.0.0" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" es-array-method-boxes-properly@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== -es-get-iterator@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" - integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.1.0" - has-symbols "^1.0.1" - is-arguments "^1.1.0" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" is-map "^2.0.2" is-set "^2.0.2" - is-string "^1.0.5" + is-string "^1.0.7" isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== +es-module-lexer@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527" + integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" es-shim-unscopables@^1.0.0: version "1.0.0" @@ -5014,11 +4633,6 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es6-error@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" - integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -5057,9 +4671,9 @@ escodegen@^2.0.0: source-map "~0.6.1" "eslint-config-prettier@>= 8.0.0", eslint-config-prettier@^8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" - integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + version "8.8.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz#bfda738d412adc917fd7b038857110efe98c9348" + integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== eslint-config-react-app@^7.0.1: version "7.0.1" @@ -5081,18 +4695,19 @@ eslint-config-react-app@^7.0.1: eslint-plugin-react-hooks "^4.3.0" eslint-plugin-testing-library "^5.0.1" -eslint-import-resolver-node@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" - integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== +eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== dependencies: debug "^3.2.7" - resolve "^1.20.0" + is-core-module "^2.11.0" + resolve "^1.22.1" -eslint-module-utils@^2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" - integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== +eslint-module-utils@^2.7.4: + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== dependencies: debug "^3.2.7" @@ -5105,22 +4720,24 @@ eslint-plugin-flowtype@^8.0.3: string-natural-compare "^3.0.1" eslint-plugin-import@^2.25.3: - version "2.26.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" - integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== + version "2.27.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== dependencies: - array-includes "^3.1.4" - array.prototype.flat "^1.2.5" - debug "^2.6.9" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.7.3" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" has "^1.0.3" - is-core-module "^2.8.1" + is-core-module "^2.11.0" is-glob "^4.0.3" minimatch "^3.1.2" - object.values "^1.1.5" - resolve "^1.22.0" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" tsconfig-paths "^3.14.1" eslint-plugin-jest@^25.3.0: @@ -5131,22 +4748,25 @@ eslint-plugin-jest@^25.3.0: "@typescript-eslint/experimental-utils" "^5.0.0" eslint-plugin-jsx-a11y@^6.5.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz#93736fc91b83fdc38cc8d115deedfc3091aef1ff" - integrity sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q== + version "6.7.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz#fca5e02d115f48c9a597a6894d5bcec2f7a76976" + integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== dependencies: - "@babel/runtime" "^7.18.9" - aria-query "^4.2.2" - array-includes "^3.1.5" + "@babel/runtime" "^7.20.7" + aria-query "^5.1.3" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" ast-types-flow "^0.0.7" - axe-core "^4.4.3" - axobject-query "^2.2.0" + axe-core "^4.6.2" + axobject-query "^3.1.1" damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" has "^1.0.3" - jsx-ast-utils "^3.3.2" - language-tags "^1.0.5" + jsx-ast-utils "^3.3.3" + language-tags "=1.0.5" minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" semver "^6.3.0" eslint-plugin-react-hooks@^4.3.0: @@ -5155,9 +4775,9 @@ eslint-plugin-react-hooks@^4.3.0: integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.28.0, eslint-plugin-react@^7.30.1: - version "7.31.11" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz#011521d2b16dcf95795df688a4770b4eaab364c8" - integrity sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw== + version "7.32.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" + integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== dependencies: array-includes "^3.1.6" array.prototype.flatmap "^1.3.1" @@ -5171,16 +4791,16 @@ eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.28.0, eslint-plugin-react@^7 object.hasown "^1.1.2" object.values "^1.1.6" prop-types "^15.8.1" - resolve "^2.0.0-next.3" + resolve "^2.0.0-next.4" semver "^6.3.0" string.prototype.matchall "^4.0.8" eslint-plugin-testing-library@^5.0.1: - version "5.9.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.9.1.tgz#12e4bd34c48683ee98af4df2e3318ec9f51dcf8a" - integrity sha512-6BQp3tmb79jLLasPHJmy8DnxREe+2Pgf7L+7o09TSWPfdqqtQfRZmZNetr5mOs3yqZk/MRNxpN3RUpJe0wB4LQ== + version "5.11.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.0.tgz#0bad7668e216e20dd12f8c3652ca353009163121" + integrity sha512-ELY7Gefo+61OfXKlQeXNIDVVLPcvKTeiQOoMZG9TeuWa7Ln4dUNRv8JdRWBQI9Mbb427XGlVB1aa1QPZxBJM8Q== dependencies: - "@typescript-eslint/utils" "^5.13.0" + "@typescript-eslint/utils" "^5.58.0" eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" @@ -5190,30 +4810,23 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== +eslint-scope@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" + integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: +eslint-visitor-keys@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" + integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== eslint-webpack-plugin@^3.1.1: version "3.2.0" @@ -5226,13 +4839,16 @@ eslint-webpack-plugin@^3.1.1: normalize-path "^3.0.0" schema-utils "^4.0.0" -eslint@^8.12.0, eslint@^8.3.0: - version "8.28.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.28.0.tgz#81a680732634677cc890134bcdd9fdfea8e63d6e" - integrity sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ== +eslint@^8.3.0, eslint@^8.31.0: + version "8.41.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.41.0.tgz#3062ca73363b4714b16dbc1e60f035e6134b6f1c" + integrity sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q== dependencies: - "@eslint/eslintrc" "^1.3.3" - "@humanwhocodes/config-array" "^0.11.6" + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.0.3" + "@eslint/js" "8.41.0" + "@humanwhocodes/config-array" "^0.11.8" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" ajv "^6.10.0" @@ -5241,24 +4857,22 @@ eslint@^8.12.0, eslint@^8.3.0: debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.3.0" - espree "^9.4.0" - esquery "^1.4.0" + eslint-scope "^7.2.0" + eslint-visitor-keys "^3.4.1" + espree "^9.5.2" + esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" find-up "^5.0.0" glob-parent "^6.0.2" - globals "^13.15.0" - grapheme-splitter "^1.0.4" + globals "^13.19.0" + graphemer "^1.4.0" ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" - js-sdsl "^4.1.4" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" @@ -5266,29 +4880,28 @@ eslint@^8.12.0, eslint@^8.3.0: minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.1" - regexpp "^3.2.0" strip-ansi "^6.0.1" strip-json-comments "^3.1.0" text-table "^0.2.0" -espree@^9.4.0: - version "9.4.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" - integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== +espree@^9.5.2: + version "9.5.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" + integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== dependencies: acorn "^8.8.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.1" esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" @@ -5324,24 +4937,6 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== -event-stream@=3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" - integrity sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g== - dependencies: - duplexer "~0.1.1" - from "~0" - map-stream "~0.1.0" - pause-stream "0.0.11" - split "0.3" - stream-combiner "~0.0.4" - through "~2.3.1" - -eventemitter2@6.4.7: - version "6.4.7" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" - integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== - eventemitter3@^4.0.0: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" @@ -5352,22 +4947,7 @@ events@^3.2.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - -execa@5.1.1, execa@^5.0.0: +execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== @@ -5382,13 +4962,6 @@ execa@5.1.1, execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -executable@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" - integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== - dependencies: - pify "^2.2.0" - exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -5404,16 +4977,16 @@ expect@^27.5.1: jest-matcher-utils "^27.5.1" jest-message-util "^27.5.1" -expect@^29.0.0, expect@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.3.1.tgz#92877aad3f7deefc2e3f6430dd195b92295554a6" - integrity sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA== +expect@^29.0.0, expect@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" + integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== dependencies: - "@jest/expect-utils" "^29.3.1" - jest-get-type "^29.2.0" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-util "^29.3.1" + "@jest/expect-utils" "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" express@^4.17.3: version "4.18.2" @@ -5459,38 +5032,12 @@ extend-shallow@^2.0.1: dependencies: is-extendable "^0.1.0" -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extract-zip@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" - integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== - dependencies: - debug "^4.1.1" - get-stream "^5.1.0" - yauzl "^2.10.0" - optionalDependencies: - "@types/yauzl" "^2.9.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.1.1, fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: +fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== @@ -5512,9 +5059,9 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" @@ -5532,20 +5079,6 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== - dependencies: - pend "~1.2.0" - -figures@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -5561,7 +5094,7 @@ file-loader@^6.2.0: loader-utils "^2.0.0" schema-utils "^3.0.0" -filelist@^1.0.1: +filelist@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== @@ -5593,7 +5126,7 @@ finalhandler@1.2.0: statuses "2.0.1" unpipe "~1.0.0" -find-cache-dir@^3.2.0, find-cache-dir@^3.3.1: +find-cache-dir@^3.3.1: version "3.3.2" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== @@ -5646,13 +5179,6 @@ find-up@^6.3.0: locate-path "^7.1.0" path-exists "^5.0.0" -find-yarn-workspace-root@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" - integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== - dependencies: - micromatch "^4.0.2" - flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -5666,7 +5192,7 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== -follow-redirects@^1.0.0, follow-redirects@^1.14.0: +follow-redirects@^1.0.0: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== @@ -5678,23 +5204,10 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -foreground-child@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" - integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^3.0.2" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== - fork-ts-checker-webpack-plugin@^6.5.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz#4f67183f2f9eb8ba7df7177ce3cf3e75cdafb340" - integrity sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA== + version "6.5.3" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" + integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== dependencies: "@babel/code-frame" "^7.8.3" "@types/json-schema" "^7.0.5" @@ -5719,15 +5232,6 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" @@ -5743,16 +5247,6 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -from@~0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" - integrity sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g== - -fromentries@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" - integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== - fs-extra@^10.0.0, fs-extra@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" @@ -5762,7 +5256,7 @@ fs-extra@^10.0.0, fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^9.0.0, fs-extra@^9.0.1, fs-extra@^9.1.0: +fs-extra@^9.0.0, fs-extra@^9.0.1: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -5802,7 +5296,7 @@ function.prototype.name@^1.1.5: es-abstract "^1.19.0" functions-have-names "^1.2.2" -functions-have-names@^1.2.2: +functions-have-names@^1.2.2, functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -5812,18 +5306,19 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1, get-caller-file@^2.0.5: +get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== dependencies: function-bind "^1.1.1" has "^1.0.3" + has-proto "^1.0.1" has-symbols "^1.0.3" get-own-enumerable-property-symbols@^3.0.0: @@ -5836,13 +5331,6 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stream@^5.0.0, get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - get-stream@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" @@ -5856,20 +5344,6 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -getos@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" - integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== - dependencies: - async "^3.2.0" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== - dependencies: - assert-plus "^1.0.0" - glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -5889,6 +5363,18 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== +glob@7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -5901,13 +5387,6 @@ glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -global-dirs@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" - integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== - dependencies: - ini "2.0.0" - global-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -5929,24 +5408,19 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.15.0: - version "13.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.18.0.tgz#fb224daeeb2bb7d254cd2c640f003528b8d0c1dc" - integrity sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A== +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== dependencies: type-fest "^0.20.2" -globby@11.0.4: - version "11.0.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" - integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" + define-properties "^1.1.3" globby@^11.0.4, globby@^11.1.0: version "11.1.0" @@ -5960,10 +5434,10 @@ globby@^11.0.4, globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -globby@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.2.tgz#29047105582427ab6eca4f905200667b056da515" - integrity sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ== +globby@^13.1.3: + version "13.1.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.4.tgz#2f91c116066bcec152465ba36e5caa4a13c01317" + integrity sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g== dependencies: dir-glob "^3.0.1" fast-glob "^3.2.11" @@ -5978,16 +5452,21 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== grapheme-splitter@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + gzip-size@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" @@ -6027,6 +5506,11 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" @@ -6046,14 +5530,6 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hasha@^5.0.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" - integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== - dependencies: - is-stream "^2.0.0" - type-fest "^0.8.0" - he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -6119,9 +5595,9 @@ html-parse-stringify@^3.0.1: void-elements "3.1.0" html-webpack-plugin@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" - integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== + version "5.5.1" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.1.tgz#826838e31b427f5f7f30971f8d8fa2422dfa6763" + integrity sha512-cTUzZ1+NqjGEKjmVgZKLMdiFg3m9MdRXkZW2OEe69WYVi5ONLMmlnSZdXzGGMOq0C8jGDrL6EWyEDDUioHO/pA== dependencies: "@types/html-minifier-terser" "^6.0.0" html-minifier-terser "^6.0.2" @@ -6199,15 +5675,6 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" -http-signature@~1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" - integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== - dependencies: - assert-plus "^1.0.0" - jsprim "^2.0.2" - sshpk "^1.14.1" - https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" @@ -6216,22 +5683,17 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== - human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -i18next@^20.0.0: - version "20.6.1" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-20.6.1.tgz#535e5f6e5baeb685c7d25df70db63bf3cc0aa345" - integrity sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A== +i18next@^23.2.11: + version "23.2.11" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.2.11.tgz#0c6f3a637fa87d3243e64b78ad285b7f77d41353" + integrity sha512-MA4FsxOjyCaOZtRDB4yuwjCvqYEioD4G4LlXOn7SO3rnQUlxTufyLsOqfL9MKakeLRBkefe8bqcs0D6Z/xFk1w== dependencies: - "@babel/runtime" "^7.12.0" + "@babel/runtime" "^7.22.5" iconv-lite@0.4.24: version "0.4.24" @@ -6264,20 +5726,15 @@ identity-obj-proxy@^3.0.0: dependencies: harmony-reflect "^1.4.6" -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.1.4, ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== immer@^9.0.7: - version "9.0.16" - resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.16.tgz#8e7caab80118c2b54b37ad43e05758cdefad0198" - integrity sha512-qenGE7CstVm1NrHQbMh8YaSzTZTFNP3zPqr3YU0S0UY441j4bJTg4A2Hh5KAhwgaiU6ZZ1Ar6y/2f4TblnMReQ== + version "9.0.21" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" + integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.3.0" @@ -6323,22 +5780,17 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - ini@^1.3.5: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== +internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== dependencies: - get-intrinsic "^1.1.0" + get-intrinsic "^1.2.0" has "^1.0.3" side-channel "^1.0.4" @@ -6352,7 +5804,7 @@ ipaddr.js@^2.0.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== -is-arguments@^1.1.0, is-arguments@^1.1.1: +is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== @@ -6360,6 +5812,15 @@ is-arguments@^1.1.0, is-arguments@^1.1.1: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -6392,27 +5853,15 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@~1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-ci@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" - integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== - dependencies: - ci-info "^3.2.0" - -is-core-module@^2.8.1, is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== +is-core-module@^2.11.0, is-core-module@^2.9.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== dependencies: has "^1.0.3" @@ -6455,14 +5904,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-installed-globally@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" - integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== - dependencies: - global-dirs "^3.0.0" - is-path-inside "^3.0.2" - is-map@^2.0.1, is-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" @@ -6495,7 +5936,7 @@ is-obj@^1.0.1: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== -is-path-inside@^3.0.2, is-path-inside@^3.0.3: +is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== @@ -6559,7 +6000,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10: +is-typed-array@^1.1.10, is-typed-array@^1.1.9: version "1.1.10" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== @@ -6570,16 +6011,11 @@ is-typed-array@^1.1.10: gopd "^1.0.1" has-tostringtag "^1.0.0" -is-typedarray@^1.0.0, is-typedarray@~1.0.0: +is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - is-weakmap@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" @@ -6600,7 +6036,7 @@ is-weakset@^2.0.1: call-bind "^1.0.2" get-intrinsic "^1.1.1" -is-windows@^1.0.1, is-windows@^1.0.2: +is-windows@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -6627,38 +6063,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== - -istanbul-lib-coverage@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" - integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== - istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== -istanbul-lib-hook@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" - integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== - dependencies: - append-transform "^2.0.0" - -istanbul-lib-instrument@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== - dependencies: - "@babel/core" "^7.7.5" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: version "5.2.1" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" @@ -6670,18 +6079,6 @@ istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: istanbul-lib-coverage "^3.2.0" semver "^6.3.0" -istanbul-lib-processinfo@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz#366d454cd0dcb7eb6e0e419378e60072c8626169" - integrity sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg== - dependencies: - archy "^1.0.0" - cross-spawn "^7.0.3" - istanbul-lib-coverage "^3.2.0" - p-map "^3.0.0" - rimraf "^3.0.0" - uuid "^8.3.2" - istanbul-lib-report@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" @@ -6700,7 +6097,7 @@ istanbul-lib-source-maps@^4.0.0: istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^3.0.2, istanbul-reports@^3.1.3: +istanbul-reports@^3.1.3: version "3.1.5" resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== @@ -6709,14 +6106,14 @@ istanbul-reports@^3.0.2, istanbul-reports@^3.1.3: istanbul-lib-report "^3.0.0" jake@^10.8.5: - version "10.8.5" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" - integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== + version "10.8.6" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.6.tgz#227a96786a1e035214e0ba84b482d6223d41ef04" + integrity sha512-G43Ub9IYEFfu72sua6rzooi8V8Gz2lkfk48rW20vEWCGizeaEPlKB1Kh8JIA84yQbiAEfqlPmSpGgCKKxH3rDA== dependencies: async "^3.2.3" chalk "^4.0.2" - filelist "^1.0.1" - minimatch "^3.0.4" + filelist "^1.0.4" + minimatch "^3.1.2" jest-changed-files@^27.5.1: version "27.5.1" @@ -6727,10 +6124,10 @@ jest-changed-files@^27.5.1: execa "^5.0.0" throat "^6.0.1" -jest-changed-files@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.2.0.tgz#b6598daa9803ea6a4dce7968e20ab380ddbee289" - integrity sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA== +jest-changed-files@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" + integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== dependencies: execa "^5.0.0" p-limit "^3.1.0" @@ -6760,28 +6157,29 @@ jest-circus@^27.5.1: stack-utils "^2.0.3" throat "^6.0.1" -jest-circus@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.3.1.tgz#177d07c5c0beae8ef2937a67de68f1e17bbf1b4a" - integrity sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg== +jest-circus@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.5.0.tgz#b5926989449e75bff0d59944bae083c9d7fb7317" + integrity sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA== dependencies: - "@jest/environment" "^29.3.1" - "@jest/expect" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.0" is-generator-fn "^2.0.0" - jest-each "^29.3.1" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-runtime "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" + jest-each "^29.5.0" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" p-limit "^3.1.0" - pretty-format "^29.3.1" + pretty-format "^29.5.0" + pure-rand "^6.0.0" slash "^3.0.0" stack-utils "^2.0.3" @@ -6804,20 +6202,20 @@ jest-cli@^27.5.1: yargs "^16.2.0" jest-cli@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.3.1.tgz#e89dff427db3b1df50cea9a393ebd8640790416d" - integrity sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ== + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.5.0.tgz#b34c20a6d35968f3ee47a7437ff8e53e086b4a67" + integrity sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw== dependencies: - "@jest/core" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/core" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" + jest-config "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" prompts "^2.0.1" yargs "^17.3.1" @@ -6851,31 +6249,31 @@ jest-config@^27.5.1: slash "^3.0.0" strip-json-comments "^3.1.1" -jest-config@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.3.1.tgz#0bc3dcb0959ff8662957f1259947aedaefb7f3c6" - integrity sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg== +jest-config@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.5.0.tgz#3cc972faec8c8aaea9ae158c694541b79f3748da" + integrity sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.3.1" - "@jest/types" "^29.3.1" - babel-jest "^29.3.1" + "@jest/test-sequencer" "^29.5.0" + "@jest/types" "^29.5.0" + babel-jest "^29.5.0" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^29.3.1" - jest-environment-node "^29.3.1" - jest-get-type "^29.2.0" - jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-runner "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" + jest-circus "^29.5.0" + jest-environment-node "^29.5.0" + jest-get-type "^29.4.3" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-runner "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^29.3.1" + pretty-format "^29.5.0" slash "^3.0.0" strip-json-comments "^3.1.1" @@ -6889,15 +6287,15 @@ jest-diff@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-diff@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.3.1.tgz#d8215b72fed8f1e647aed2cae6c752a89e757527" - integrity sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw== +jest-diff@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" + integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== dependencies: chalk "^4.0.0" - diff-sequences "^29.3.1" - jest-get-type "^29.2.0" - pretty-format "^29.3.1" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" jest-docblock@^27.5.1: version "27.5.1" @@ -6906,10 +6304,10 @@ jest-docblock@^27.5.1: dependencies: detect-newline "^3.0.0" -jest-docblock@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.2.0.tgz#307203e20b637d97cee04809efc1d43afc641e82" - integrity sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A== +jest-docblock@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" + integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== dependencies: detect-newline "^3.0.0" @@ -6924,16 +6322,16 @@ jest-each@^27.5.1: jest-util "^27.5.1" pretty-format "^27.5.1" -jest-each@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.3.1.tgz#bc375c8734f1bb96625d83d1ca03ef508379e132" - integrity sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA== +jest-each@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.5.0.tgz#fc6e7014f83eac68e22b7195598de8554c2e5c06" + integrity sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.5.0" chalk "^4.0.0" - jest-get-type "^29.2.0" - jest-util "^29.3.1" - pretty-format "^29.3.1" + jest-get-type "^29.4.3" + jest-util "^29.5.0" + pretty-format "^29.5.0" jest-environment-jsdom@^27.5.1: version "27.5.1" @@ -6960,27 +6358,27 @@ jest-environment-node@^27.5.1: jest-mock "^27.5.1" jest-util "^27.5.1" -jest-environment-node@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.3.1.tgz#5023b32472b3fba91db5c799a0d5624ad4803e74" - integrity sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag== +jest-environment-node@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.5.0.tgz#f17219d0f0cc0e68e0727c58b792c040e332c967" + integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw== dependencies: - "@jest/environment" "^29.3.1" - "@jest/fake-timers" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" - jest-mock "^29.3.1" - jest-util "^29.3.1" + jest-mock "^29.5.0" + jest-util "^29.5.0" jest-get-type@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== -jest-get-type@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.2.0.tgz#726646f927ef61d583a3b3adb1ab13f3a5036408" - integrity sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA== +jest-get-type@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" + integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== jest-haste-map@^27.5.1: version "27.5.1" @@ -7002,20 +6400,20 @@ jest-haste-map@^27.5.1: optionalDependencies: fsevents "^2.3.2" -jest-haste-map@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.3.1.tgz#af83b4347f1dae5ee8c2fb57368dc0bb3e5af843" - integrity sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A== +jest-haste-map@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de" + integrity sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.5.0" "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.9" - jest-regex-util "^29.2.0" - jest-util "^29.3.1" - jest-worker "^29.3.1" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" + jest-worker "^29.5.0" micromatch "^4.0.4" walker "^1.0.8" optionalDependencies: @@ -7052,13 +6450,13 @@ jest-leak-detector@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-leak-detector@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz#95336d020170671db0ee166b75cd8ef647265518" - integrity sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA== +jest-leak-detector@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz#cf4bdea9615c72bac4a3a7ba7e7930f9c0610c8c" + integrity sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow== dependencies: - jest-get-type "^29.2.0" - pretty-format "^29.3.1" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" jest-matcher-utils@^27.5.1: version "27.5.1" @@ -7070,15 +6468,15 @@ jest-matcher-utils@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-matcher-utils@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz#6e7f53512f80e817dfa148672bd2d5d04914a572" - integrity sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ== +jest-matcher-utils@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" + integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== dependencies: chalk "^4.0.0" - jest-diff "^29.3.1" - jest-get-type "^29.2.0" - pretty-format "^29.3.1" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" jest-message-util@^27.5.1: version "27.5.1" @@ -7110,18 +6508,18 @@ jest-message-util@^28.1.3: slash "^3.0.0" stack-utils "^2.0.3" -jest-message-util@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.3.1.tgz#37bc5c468dfe5120712053dd03faf0f053bd6adb" - integrity sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA== +jest-message-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" + integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.3.1" + "@jest/types" "^29.5.0" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.3.1" + pretty-format "^29.5.0" slash "^3.0.0" stack-utils "^2.0.3" @@ -7133,14 +6531,14 @@ jest-mock@^27.5.1: "@jest/types" "^27.5.1" "@types/node" "*" -jest-mock@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.3.1.tgz#60287d92e5010979d01f218c6b215b688e0f313e" - integrity sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA== +jest-mock@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" + integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.5.0" "@types/node" "*" - jest-util "^29.3.1" + jest-util "^29.5.0" jest-pnp-resolver@^1.2.2: version "1.2.3" @@ -7157,10 +6555,10 @@ jest-regex-util@^28.0.0: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== -jest-regex-util@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.2.0.tgz#82ef3b587e8c303357728d0322d48bbfd2971f7b" - integrity sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA== +jest-regex-util@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" + integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== jest-resolve-dependencies@^27.5.1: version "27.5.1" @@ -7171,13 +6569,13 @@ jest-resolve-dependencies@^27.5.1: jest-regex-util "^27.5.1" jest-snapshot "^27.5.1" -jest-resolve-dependencies@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz#a6a329708a128e68d67c49f38678a4a4a914c3bf" - integrity sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA== +jest-resolve-dependencies@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz#f0ea29955996f49788bf70996052aa98e7befee4" + integrity sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg== dependencies: - jest-regex-util "^29.2.0" - jest-snapshot "^29.3.1" + jest-regex-util "^29.4.3" + jest-snapshot "^29.5.0" jest-resolve@^27.4.2, jest-resolve@^27.5.1: version "27.5.1" @@ -7195,19 +6593,19 @@ jest-resolve@^27.4.2, jest-resolve@^27.5.1: resolve.exports "^1.1.0" slash "^3.0.0" -jest-resolve@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.3.1.tgz#9a4b6b65387a3141e4a40815535c7f196f1a68a7" - integrity sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw== +jest-resolve@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.5.0.tgz#b053cc95ad1d5f6327f0ac8aae9f98795475ecdc" + integrity sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" + jest-haste-map "^29.5.0" jest-pnp-resolver "^1.2.2" - jest-util "^29.3.1" - jest-validate "^29.3.1" + jest-util "^29.5.0" + jest-validate "^29.5.0" resolve "^1.20.0" - resolve.exports "^1.1.0" + resolve.exports "^2.0.0" slash "^3.0.0" jest-runner@^27.5.1: @@ -7237,30 +6635,30 @@ jest-runner@^27.5.1: source-map-support "^0.5.6" throat "^6.0.1" -jest-runner@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.3.1.tgz#a92a879a47dd096fea46bb1517b0a99418ee9e2d" - integrity sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA== +jest-runner@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.5.0.tgz#6a57c282eb0ef749778d444c1d758c6a7693b6f8" + integrity sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ== dependencies: - "@jest/console" "^29.3.1" - "@jest/environment" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/console" "^29.5.0" + "@jest/environment" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" emittery "^0.13.1" graceful-fs "^4.2.9" - jest-docblock "^29.2.0" - jest-environment-node "^29.3.1" - jest-haste-map "^29.3.1" - jest-leak-detector "^29.3.1" - jest-message-util "^29.3.1" - jest-resolve "^29.3.1" - jest-runtime "^29.3.1" - jest-util "^29.3.1" - jest-watcher "^29.3.1" - jest-worker "^29.3.1" + jest-docblock "^29.4.3" + jest-environment-node "^29.5.0" + jest-haste-map "^29.5.0" + jest-leak-detector "^29.5.0" + jest-message-util "^29.5.0" + jest-resolve "^29.5.0" + jest-runtime "^29.5.0" + jest-util "^29.5.0" + jest-watcher "^29.5.0" + jest-worker "^29.5.0" p-limit "^3.1.0" source-map-support "0.5.13" @@ -7292,31 +6690,31 @@ jest-runtime@^27.5.1: slash "^3.0.0" strip-bom "^4.0.0" -jest-runtime@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.3.1.tgz#21efccb1a66911d6d8591276a6182f520b86737a" - integrity sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A== - dependencies: - "@jest/environment" "^29.3.1" - "@jest/fake-timers" "^29.3.1" - "@jest/globals" "^29.3.1" - "@jest/source-map" "^29.2.0" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" +jest-runtime@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.5.0.tgz#c83f943ee0c1da7eb91fa181b0811ebd59b03420" + integrity sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/globals" "^29.5.0" + "@jest/source-map" "^29.4.3" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" glob "^7.1.3" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" - jest-message-util "^29.3.1" - jest-mock "^29.3.1" - jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" slash "^3.0.0" strip-bom "^4.0.0" @@ -7356,10 +6754,10 @@ jest-snapshot@^27.5.1: pretty-format "^27.5.1" semver "^7.3.2" -jest-snapshot@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.3.1.tgz#17bcef71a453adc059a18a32ccbd594b8cc4e45e" - integrity sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA== +jest-snapshot@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.5.0.tgz#c9c1ce0331e5b63cd444e2f95a55a73b84b1e8ce" + integrity sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" @@ -7367,23 +6765,22 @@ jest-snapshot@^29.3.1: "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/traverse" "^7.7.2" "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/expect-utils" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@types/babel__traverse" "^7.0.6" "@types/prettier" "^2.1.5" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^29.3.1" + expect "^29.5.0" graceful-fs "^4.2.9" - jest-diff "^29.3.1" - jest-get-type "^29.2.0" - jest-haste-map "^29.3.1" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-util "^29.3.1" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" natural-compare "^1.4.0" - pretty-format "^29.3.1" + pretty-format "^29.5.0" semver "^7.3.5" jest-util@^27.5.1: @@ -7410,12 +6807,12 @@ jest-util@^28.1.3: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-util@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.3.1.tgz#1dda51e378bbcb7e3bc9d8ab651445591ed373e1" - integrity sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ== +jest-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" + integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.5.0" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" @@ -7434,17 +6831,17 @@ jest-validate@^27.5.1: leven "^3.1.0" pretty-format "^27.5.1" -jest-validate@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.3.1.tgz#d56fefaa2e7d1fde3ecdc973c7f7f8f25eea704a" - integrity sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g== +jest-validate@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc" + integrity sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.5.0" camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^29.2.0" + jest-get-type "^29.4.3" leven "^3.1.0" - pretty-format "^29.3.1" + pretty-format "^29.5.0" jest-watch-typeahead@^1.0.0: version "1.1.0" @@ -7486,18 +6883,18 @@ jest-watcher@^28.0.0: jest-util "^28.1.3" string-length "^4.0.1" -jest-watcher@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.3.1.tgz#3341547e14fe3c0f79f9c3a4c62dbc3fc977fd4a" - integrity sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg== +jest-watcher@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.5.0.tgz#cf7f0f949828ba65ddbbb45c743a382a4d911363" + integrity sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA== dependencies: - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" emittery "^0.13.1" - jest-util "^29.3.1" + jest-util "^29.5.0" string-length "^4.0.1" jest-worker@^26.2.1: @@ -7527,13 +6924,13 @@ jest-worker@^28.0.2: merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.3.1.tgz#e9462161017a9bb176380d721cab022661da3d6b" - integrity sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw== +jest-worker@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" + integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== dependencies: "@types/node" "*" - jest-util "^29.3.1" + jest-util "^29.5.0" merge-stream "^2.0.0" supports-color "^8.0.0" @@ -7556,28 +6953,17 @@ jest@^27.4.3: import-local "^3.0.2" jest-cli "^27.5.1" -joi@^17.4.0: - version "17.7.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.7.0.tgz#591a33b1fe1aca2bc27f290bcad9b9c1c570a6b3" - integrity sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg== - dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.3" - "@sideway/formula" "^3.0.0" - "@sideway/pinpoint" "^2.0.0" - -js-sdsl@^4.1.4: - version "4.2.0" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.2.0.tgz#278e98b7bea589b8baaf048c20aeb19eb7ad09d0" - integrity sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ== +jiti@^1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.18.2.tgz#80c3ef3d486ebf2450d9335122b32d121f2a83cd" + integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.14.1, js-yaml@^3.13.1: +js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -7592,11 +6978,6 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== - jsdom@^16.6.0: version "16.7.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" @@ -7655,7 +7036,7 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json-schema@0.4.0, json-schema@^0.4.0: +json-schema@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== @@ -7665,22 +7046,17 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.0, json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== +json5@^2.1.2, json5@^2.2.0, json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^6.0.1: version "6.1.0" @@ -7696,17 +7072,7 @@ jsonpointer@^5.0.0: resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== -jsprim@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d" - integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.2: +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== @@ -7725,26 +7091,29 @@ kleur@^3.0.3: integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== klona@^2.0.4, klona@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" - integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== + version "2.0.6" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" + integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== language-subtag-registry@~0.3.2: version "0.3.22" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== -language-tags@^1.0.5: +language-tags@=1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== dependencies: language-subtag-registry "~0.3.2" -lazy-ass@1.6.0, lazy-ass@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" - integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== +launch-editor@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.0.tgz#4c0c1a6ac126c572bd9ff9a30da1d2cae66defd7" + integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.7.3" leven@^3.1.0: version "3.1.0" @@ -7767,36 +7136,22 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -lilconfig@^2.0.3, lilconfig@^2.0.5, lilconfig@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" - integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== +lilconfig@^2.0.3, lilconfig@^2.0.5, lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -listr2@^3.8.3: - version "3.14.0" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" - integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== - dependencies: - cli-truncate "^2.1.0" - colorette "^2.0.16" - log-update "^4.0.0" - p-map "^4.0.0" - rfdc "^1.3.0" - rxjs "^7.5.1" - through "^2.3.8" - wrap-ansi "^7.0.0" - loader-runner@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-utils@^2.0.0, loader-utils@^2.0.3: +loader-utils@^2.0.0, loader-utils@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== @@ -7833,9 +7188,9 @@ locate-path@^6.0.0: p-locate "^5.0.0" locate-path@^7.1.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.1.1.tgz#8e1e5a75c7343770cef02ff93c4bf1f0aa666374" - integrity sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg== + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== dependencies: p-locate "^6.0.0" @@ -7849,11 +7204,6 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== -lodash.flattendeep@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" - integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== - lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -7864,11 +7214,6 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.once@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" - integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== - lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -7884,24 +7229,6 @@ lodash@4.17.21, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log-update@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" - integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== - dependencies: - ansi-escapes "^4.3.0" - cli-cursor "^3.1.0" - slice-ansi "^4.0.0" - wrap-ansi "^6.2.0" - loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -7924,6 +7251,13 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -7932,9 +7266,9 @@ lru-cache@^6.0.0: yallist "^4.0.0" lz-string@^1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" - integrity sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ== + version "1.5.0" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== magic-string@^0.25.0, magic-string@^0.25.7: version "0.25.9" @@ -7957,20 +7291,6 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" -map-stream@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" - integrity sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g== - -md5@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" - integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== - dependencies: - charenc "0.0.2" - crypt "0.0.2" - is-buffer "~1.1.6" - mdn-data@2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" @@ -7987,9 +7307,9 @@ media-typer@0.3.0: integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== memfs@^3.1.2, memfs@^3.4.3: - version "3.4.12" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.12.tgz#d00f8ad8dab132dc277c659dc85bfd14b07d03bd" - integrity sha512-BcjuQn6vfqP+k100e0E9m61Hyqa//Brp+I3f0OBmN0ATHlFA8vx3Lt8z57R3u2bPqe3WGDBC+nF72fTH7isyEw== + version "3.5.1" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.5.1.tgz#f0cd1e2bfaef58f6fe09bfb9c2288f07fea099ec" + integrity sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA== dependencies: fs-monkey "^1.0.3" @@ -8026,7 +7346,7 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -8049,9 +7369,9 @@ min-indent@^1.0.0: integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== mini-css-extract-plugin@^2.4.5: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.0.tgz#d7d9ba0c5b596d155e36e2b174082fc7f010dd64" - integrity sha512-auqtVo8KhTScMsba7MbijqZTfibbXiBNlPAQbsVt7enQfcDYLdgG57eGxMqwVU3mfeWANY4F1wUg+rMF+ycZgw== + version "2.7.6" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d" + integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== dependencies: schema-utils "^4.0.0" @@ -8068,16 +7388,16 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: brace-expansion "^1.1.7" minimatch@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" - integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== mkdirp@~0.5.1: version "0.5.6" @@ -8109,10 +7429,19 @@ multicast-dns@^7.2.5: dns-packet "^5.2.2" thunky "^1.0.2" -nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== natural-compare-lite@^1.4.0: version "1.4.0" @@ -8159,17 +7488,10 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-preload@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" - integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== - dependencies: - process-on-spawn "^1.0.0" - -node-releases@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== +node-releases@^2.0.8: + version "2.0.12" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" + integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -8186,7 +7508,7 @@ normalize-url@^6.0.1: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== -npm-run-path@^4.0.0, npm-run-path@^4.0.1: +npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== @@ -8208,44 +7530,11 @@ nth-check@^2.0.1: boolbase "^1.0.0" nwsapi@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" - integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== - -nyc@15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" - integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== - dependencies: - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - caching-transform "^4.0.0" - convert-source-map "^1.7.0" - decamelize "^1.2.0" - find-cache-dir "^3.2.0" - find-up "^4.1.0" - foreground-child "^2.0.0" - get-package-type "^0.1.0" - glob "^7.1.6" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-hook "^3.0.0" - istanbul-lib-instrument "^4.0.0" - istanbul-lib-processinfo "^2.0.2" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - make-dir "^3.0.0" - node-preload "^0.2.1" - p-map "^3.0.0" - process-on-spawn "^1.0.0" - resolve-from "^5.0.0" - rimraf "^3.0.0" - signal-exit "^3.0.2" - spawn-wrap "^2.0.0" - test-exclude "^6.0.0" - yargs "^15.0.2" + version "2.2.4" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.4.tgz#fd59d5e904e8e1f03c25a7d5a15cfa16c714a1e5" + integrity sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g== -object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -8255,10 +7544,10 @@ object-hash@^3.0.0: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== -object-inspect@^1.12.2, object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== object-is@^1.1.5: version "1.1.5" @@ -8302,14 +7591,15 @@ object.fromentries@^2.0.6: es-abstract "^1.20.4" object.getownpropertydescriptors@^2.1.0: - version "2.1.5" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz#db5a9002489b64eef903df81d6623c07e5b4b4d3" - integrity sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw== + version "2.1.6" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz#5e5c384dd209fa4efffead39e3a0512770ccc312" + integrity sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ== dependencies: array.prototype.reduce "^1.0.5" call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.21.2" + safe-array-concat "^1.0.0" object.hasown@^1.1.2: version "1.1.2" @@ -8319,7 +7609,7 @@ object.hasown@^1.1.2: define-properties "^1.1.4" es-abstract "^1.20.4" -object.values@^1.1.0, object.values@^1.1.5, object.values@^1.1.6: +object.values@^1.1.0, object.values@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== @@ -8345,14 +7635,14 @@ on-headers@~1.0.2: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" -onetime@^5.1.0, onetime@^5.1.2: +onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -8360,9 +7650,9 @@ onetime@^5.1.0, onetime@^5.1.2: mimic-fn "^2.1.0" open@^8.0.9, open@^8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" - integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== dependencies: define-lazy-prop "^2.0.0" is-docker "^2.1.1" @@ -8392,11 +7682,6 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -ospath@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" - integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== - p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -8446,20 +7731,6 @@ p-locate@^6.0.0: dependencies: p-limit "^4.0.0" -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - p-retry@^4.5.0: version "4.6.2" resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" @@ -8473,16 +7744,6 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -package-hash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" - integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== - dependencies: - graceful-fs "^4.1.15" - hasha "^5.0.0" - lodash.flattendeep "^4.4.0" - release-zalgo "^1.0.0" - param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" @@ -8566,18 +7827,6 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pause-stream@0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" - integrity sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A== - dependencies: - through "~2.3" - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -8598,12 +7847,12 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatc resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^2.2.0, pify@^2.3.0: +pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== -pirates@^4.0.4: +pirates@^4.0.1, pirates@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== @@ -8677,12 +7926,12 @@ postcss-color-rebeccapurple@^7.1.1: dependencies: postcss-value-parser "^4.2.0" -postcss-colormin@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.0.tgz#3cee9e5ca62b2c27e84fce63affc0cfb5901956a" - integrity sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg== +postcss-colormin@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" + integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== dependencies: - browserslist "^4.16.6" + browserslist "^4.21.4" caniuse-api "^3.0.0" colord "^2.9.1" postcss-value-parser "^4.2.0" @@ -8703,9 +7952,9 @@ postcss-custom-media@^8.0.2: postcss-value-parser "^4.2.0" postcss-custom-properties@^12.1.10: - version "12.1.10" - resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.1.10.tgz#624517179fd4cf50078a7a60f628d5782e7d4903" - integrity sha512-U3BHdgrYhCrwTVcByFHs9EOBoqcKq4Lf3kXwbTi4hhq0qWhl/pDWq2THbv/ICX/Fl9KqeHBb8OVrTf2OaYF07A== + version "12.1.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz#d14bb9b3989ac4d40aaa0e110b43be67ac7845cf" + integrity sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ== dependencies: postcss-value-parser "^4.2.0" @@ -8794,10 +8043,10 @@ postcss-image-set-function@^4.0.7: dependencies: postcss-value-parser "^4.2.0" -postcss-import@^14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0" - integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw== +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== dependencies: postcss-value-parser "^4.0.0" read-cache "^1.0.0" @@ -8808,10 +8057,10 @@ postcss-initial@^4.0.1: resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== -postcss-js@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.0.tgz#31db79889531b80dc7bc9b0ad283e418dce0ac00" - integrity sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ== +postcss-js@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== dependencies: camelcase-css "^2.0.1" @@ -8823,13 +8072,13 @@ postcss-lab-function@^4.2.1: "@csstools/postcss-progressive-custom-properties" "^1.1.0" postcss-value-parser "^4.2.0" -postcss-load-config@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" - integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== +postcss-load-config@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.1.tgz#152383f481c2758274404e4962743191d73875bd" + integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== dependencies: lilconfig "^2.0.5" - yaml "^1.10.2" + yaml "^2.1.1" postcss-loader@^6.2.1: version "6.2.1" @@ -8858,10 +8107,10 @@ postcss-merge-longhand@^5.1.7: postcss-value-parser "^4.2.0" stylehacks "^5.1.1" -postcss-merge-rules@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz#8f97679e67cc8d08677a6519afca41edf2220894" - integrity sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA== +postcss-merge-rules@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" + integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== dependencies: browserslist "^4.21.4" caniuse-api "^3.0.0" @@ -8905,10 +8154,10 @@ postcss-modules-extract-imports@^3.0.0: resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== +postcss-modules-local-by-default@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" + integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== dependencies: icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" @@ -8928,12 +8177,12 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-nested@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.0.tgz#1572f1984736578f360cffc7eb7dca69e30d1735" - integrity sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w== +postcss-nested@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" + integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== dependencies: - postcss-selector-parser "^6.0.10" + postcss-selector-parser "^6.0.11" postcss-nesting@^10.2.0: version "10.2.0" @@ -9016,9 +8265,9 @@ postcss-normalize@^10.0.1: sanitize.css "*" postcss-opacity-percentage@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz#bd698bb3670a0a27f6d657cc16744b3ebf3b1145" - integrity sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w== + version "1.1.3" + resolved "https://registry.yarnpkg.com/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz#5b89b35551a556e20c5d23eb5260fbfcf5245da6" + integrity sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A== postcss-ordered-values@^5.1.3: version "5.1.3" @@ -9109,10 +8358,10 @@ postcss-pseudo-class-any-link@^7.1.6: dependencies: postcss-selector-parser "^6.0.10" -postcss-reduce-initial@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz#c18b7dfb88aee24b1f8e4936541c29adbd35224e" - integrity sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w== +postcss-reduce-initial@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" + integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== dependencies: browserslist "^4.21.4" caniuse-api "^3.0.0" @@ -9136,10 +8385,10 @@ postcss-selector-not@^6.0.1: dependencies: postcss-selector-parser "^6.0.10" -postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.0.11" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" - integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: + version "6.0.13" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -9172,12 +8421,12 @@ postcss@^7.0.35: picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.3.5, postcss@^8.4.18, postcss@^8.4.4: - version "8.4.19" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.19.tgz#61178e2add236b17351897c8bcc0b4c8ecab56fc" - integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA== +postcss@^8.3.5, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.4: + version "8.4.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.23.tgz#df0aee9ac7c5e53e1075c24a3613496f9e6552ab" + integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== dependencies: - nanoid "^3.3.4" + nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" @@ -9191,12 +8440,12 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== -prettier@^2.3.1: - version "2.8.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.0.tgz#c7df58393c9ba77d6fba3921ae01faf994fb9dc9" - integrity sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA== +prettier@^2.8.1: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== -pretty-bytes@^5.3.0, pretty-bytes@^5.4.1, pretty-bytes@^5.6.0: +pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== @@ -9228,12 +8477,12 @@ pretty-format@^28.1.3: ansi-styles "^5.0.0" react-is "^18.0.0" -pretty-format@^29.0.0, pretty-format@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.3.1.tgz#1841cac822b02b4da8971dacb03e8a871b4722da" - integrity sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg== +pretty-format@^29.0.0, pretty-format@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" + integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== dependencies: - "@jest/schemas" "^29.0.0" + "@jest/schemas" "^29.4.3" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -9242,13 +8491,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process-on-spawn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" - integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== - dependencies: - fromentries "^1.2.0" - promise@^8.1.0: version "8.3.0" resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" @@ -9281,40 +8523,25 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-from-env@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" - integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== - -ps-tree@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.2.0.tgz#5e7425b89508736cdd4f2224d028f7bb3f722ebd" - integrity sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA== - dependencies: - event-stream "=3.3.4" - pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== -psl@^1.1.28, psl@^1.1.33: +psl@^1.1.33: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +pure-rand@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" + integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== q@^1.1.2: version "1.5.1" @@ -9328,11 +8555,6 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== - querystringify@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" @@ -9343,11 +8565,6 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - raf@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" @@ -9432,12 +8649,12 @@ react-error-overlay@^6.0.11: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== -react-i18next@^12.0.0: - version "12.0.0" - resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-12.0.0.tgz#634015a2c035779c5736ae4c2e5c34c1659753b1" - integrity sha512-/O7N6aIEAl1FaWZBNvhdIo9itvF/MO/nRKr9pYqRc9LhuC1u21SlfwpiYQqvaeNSEW3g3qUXLREOWMt+gxrWbg== +react-i18next@^13.0.3: + version "13.0.3" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-13.0.3.tgz#8eedc5c2ab57f4641540778cc7373c8ed891523c" + integrity sha512-/t4kt4Y2o+21hbvx+o9zpVnmoiud7KLDncyZFGN0U6TGAWYaXdTsp/ytAHFcKKSAODg4noIMaOO3X7bMgCqLHw== dependencies: - "@babel/runtime" "^7.14.5" + "@babel/runtime" "^7.22.5" html-parse-stringify "^3.0.1" react-is@^16.13.1, react-is@^16.7.0: @@ -9460,20 +8677,20 @@ react-refresh@^0.11.0: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046" integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== -react-router-dom@^6.3.0: - version "6.4.3" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.4.3.tgz#70093b5f65f85f1df9e5d4182eb7ff3a08299275" - integrity sha512-MiaYQU8CwVCaOfJdYvt84KQNjT78VF0TJrA17SIQgNHRvLnXDJO6qsFqq8F/zzB1BWZjCFIrQpu4QxcshitziQ== +react-router-dom@^6.8.0: + version "6.11.2" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.11.2.tgz#324d55750ffe2ecd54ca4ec6b7bc7ab01741f170" + integrity sha512-JNbKtAeh1VSJQnH6RvBDNhxNwemRj7KxCzc5jb7zvDSKRnPWIFj9pO+eXqjM69gQJ0r46hSz1x4l9y0651DKWw== dependencies: - "@remix-run/router" "1.0.3" - react-router "6.4.3" + "@remix-run/router" "1.6.2" + react-router "6.11.2" -react-router@6.4.3: - version "6.4.3" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.4.3.tgz#9ed3ee4d6e95889e9b075a5d63e29acc7def0d49" - integrity sha512-BT6DoGn6aV1FVP5yfODMOiieakp3z46P1Fk0RNzJMACzE7C339sFuHebfvWtnB4pzBvXXkHP2vscJzWRuUjTtA== +react-router@6.11.2: + version "6.11.2" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.11.2.tgz#006301c4da1a173d7ad76b7ecd2da01b9dd3837a" + integrity sha512-74z9xUSaSX07t3LM+pS6Un0T55ibUE/79CzfZpy5wsPDZaea1F8QkrsiyRnA2YQ7LwE/umaydzXZV80iDCPkMg== dependencies: - "@remix-run/router" "1.0.3" + "@remix-run/router" "1.6.2" react-scripts@^5.0.0: version "5.0.1" @@ -9555,9 +8772,9 @@ read-cache@^1.0.0: pify "^2.3.0" readable-stream@^2.0.1: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -9568,9 +8785,9 @@ readable-stream@^2.0.1: util-deprecate "~1.0.1" readable-stream@^3.0.6: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" @@ -9610,12 +8827,12 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.10, regenerator-runtime@^0.13.9: +regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.9: version "0.13.11" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-transform@^0.15.0: +regenerator-transform@^0.15.1: version "0.15.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== @@ -9627,37 +8844,27 @@ regex-parser@^2.2.11: resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== +regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + define-properties "^1.2.0" + functions-have-names "^1.2.3" -regexpu-core@^5.1.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" - integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: + "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" regenerate-unicode-properties "^10.1.0" - regjsgen "^0.7.1" regjsparser "^0.9.1" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" -regjsgen@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.7.1.tgz#ee5ef30e18d3f09b7c369b76e7c2373ed25546f6" - integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== - regjsparser@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" @@ -9670,13 +8877,6 @@ relateurl@^0.2.7: resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== -release-zalgo@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" - integrity sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA== - dependencies: - es6-error "^4.0.1" - renderkid@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" @@ -9688,13 +8888,6 @@ renderkid@^3.0.0: lodash "^4.17.21" strip-ansi "^6.0.1" -request-progress@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" - integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== - dependencies: - throttleit "^1.0.0" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -9705,11 +8898,6 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -9744,20 +8932,25 @@ resolve-url-loader@^4.0.0: source-map "0.6.1" resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== + version "1.1.1" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" + integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== + +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@^1.1.7, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== +resolve@^1.1.7, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.2: + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.11.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.3: +resolve@^2.0.0-next.4: version "2.0.0-next.4" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== @@ -9766,14 +8959,6 @@ resolve@^2.0.0-next.3: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - retry@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" @@ -9784,11 +8969,6 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== - rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -9820,19 +9000,22 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^7.1.0, rxjs@^7.5.1: - version "7.5.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39" - integrity sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA== +safe-array-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" + integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== dependencies: - tslib "^2.1.0" + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + has-symbols "^1.0.3" + isarray "^2.0.5" safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -9846,7 +9029,7 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -9901,24 +9084,24 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.2.tgz#36c10abca6f7577aeae136c804b0c741edeadc99" + integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== dependencies: "@types/json-schema" "^7.0.8" ajv "^6.12.5" ajv-keywords "^3.5.2" schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + version "4.0.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.1.tgz#eb2d042df8b01f4b5c276a2dfd41ba0faab72e8d" + integrity sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ== dependencies: "@types/json-schema" "^7.0.9" - ajv "^8.8.0" + ajv "^8.9.0" ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" + ajv-keywords "^5.1.0" select-hose@^2.0.0: version "2.0.0" @@ -9933,14 +9116,14 @@ selfsigned@^2.1.1: node-forge "^1" semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" @@ -9970,10 +9153,10 @@ serialize-javascript@^4.0.0: dependencies: randombytes "^2.1.0" -serialize-javascript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== dependencies: randombytes "^2.1.0" @@ -10000,11 +9183,6 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" @@ -10040,9 +9218,9 @@ shebang-regex@^3.0.0: integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@^1.7.3: - version "1.7.4" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.4.tgz#33fe15dee71ab2a81fcbd3a52106c5cfb9fb75d8" - integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== side-channel@^1.0.4: version "1.0.4" @@ -10080,24 +9258,6 @@ slash@^4.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== -slice-ansi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - sockjs@^0.3.24: version "0.3.24" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" @@ -10174,18 +9334,6 @@ sourcemap-codec@^1.4.8: resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== -spawn-wrap@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" - integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== - dependencies: - foreground-child "^2.0.0" - is-windows "^1.0.2" - make-dir "^3.0.0" - rimraf "^3.0.0" - signal-exit "^3.0.2" - which "^2.0.1" - spdy-transport@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" @@ -10209,33 +9357,11 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" -split@0.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" - integrity sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA== - dependencies: - through "2" - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -sshpk@^1.14.1: - version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - stable@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" @@ -10253,19 +9379,6 @@ stackframe@^1.3.4: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== -start-server-and-test@^1.14.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/start-server-and-test/-/start-server-and-test-1.14.0.tgz#c57f04f73eac15dd51733b551d775b40837fdde3" - integrity sha512-on5ELuxO2K0t8EmNj9MtVlFqwBMxfWOhu4U7uZD1xccVpFlOQKR93CSe0u98iQzfNxRyaNTb/CdadbNllplTsw== - dependencies: - bluebird "3.7.2" - check-more-types "2.24.0" - debug "4.3.2" - execa "5.1.1" - lazy-ass "1.6.0" - ps-tree "1.2.0" - wait-on "6.0.0" - statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" @@ -10276,12 +9389,12 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -stream-combiner@~0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" - integrity sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw== +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== dependencies: - duplexer "~0.1.1" + internal-slot "^1.0.4" string-length@^4.0.1: version "4.0.2" @@ -10327,7 +9440,16 @@ string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: regexp.prototype.flags "^1.4.3" side-channel "^1.0.4" -string.prototype.trimend@^1.0.5: +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimend@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== @@ -10336,7 +9458,7 @@ string.prototype.trimend@^1.0.5: define-properties "^1.1.4" es-abstract "^1.20.4" -string.prototype.trimstart@^1.0.5: +string.prototype.trimstart@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== @@ -10415,9 +9537,9 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== style-loader@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" - integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== + version "3.3.3" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.3.tgz#bba8daac19930169c0c9c96706749a597ae3acff" + integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw== stylehacks@^5.1.1: version "5.1.1" @@ -10427,10 +9549,23 @@ stylehacks@^5.1.1: browserslist "^4.21.4" postcss-selector-parser "^6.0.4" -stylis@4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" - integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== +stylis@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== + +sucrase@^3.32.0: + version "3.32.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.32.0.tgz#c4a95e0f1e18b6847127258a75cf360bc568d4a7" + integrity sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "7.1.6" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" supports-color@^5.3.0: version "5.5.0" @@ -10446,7 +9581,7 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0, supports-color@^8.1.1: +supports-color@^8.0.0: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -10524,33 +9659,33 @@ synp@^1.9.10: sort-object-keys "^1.1.3" tailwindcss@^3.0.2: - version "3.2.4" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.2.4.tgz#afe3477e7a19f3ceafb48e4b083e292ce0dc0250" - integrity sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ== + version "3.3.2" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.2.tgz#2f9e35d715fdf0bbf674d90147a0684d7054a2d3" + integrity sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w== dependencies: + "@alloc/quick-lru" "^5.2.0" arg "^5.0.2" chokidar "^3.5.3" - color-name "^1.1.4" - detective "^5.2.1" didyoumean "^1.2.2" dlv "^1.1.3" fast-glob "^3.2.12" glob-parent "^6.0.2" is-glob "^4.0.3" - lilconfig "^2.0.6" + jiti "^1.18.2" + lilconfig "^2.1.0" micromatch "^4.0.5" normalize-path "^3.0.0" object-hash "^3.0.0" picocolors "^1.0.0" - postcss "^8.4.18" - postcss-import "^14.1.0" - postcss-js "^4.0.0" - postcss-load-config "^3.1.4" - postcss-nested "6.0.0" - postcss-selector-parser "^6.0.10" + postcss "^8.4.23" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.1" + postcss-nested "^6.0.1" + postcss-selector-parser "^6.0.11" postcss-value-parser "^4.2.0" - quick-lru "^5.1.1" - resolve "^1.22.1" + resolve "^1.22.2" + sucrase "^3.32.0" tapable@^1.0.0: version "1.1.3" @@ -10585,21 +9720,21 @@ terminal-link@^2.0.0: ansi-escapes "^4.2.1" supports-hyperlinks "^2.0.0" -terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.2.5: - version "5.3.6" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" - integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== +terser-webpack-plugin@^5.2.5, terser-webpack-plugin@^5.3.7: + version "5.3.9" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" + integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== dependencies: - "@jridgewell/trace-mapping" "^0.3.14" + "@jridgewell/trace-mapping" "^0.3.17" jest-worker "^27.4.5" schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - terser "^5.14.1" + serialize-javascript "^6.0.1" + terser "^5.16.8" -terser@^5.0.0, terser@^5.10.0, terser@^5.14.1: - version "5.15.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.15.1.tgz#8561af6e0fd6d839669c73b92bdd5777d870ed6c" - integrity sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw== +terser@^5.0.0, terser@^5.10.0, terser@^5.16.8: + version "5.17.6" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.17.6.tgz#d810e75e1bb3350c799cd90ebefe19c9412c12de" + integrity sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" @@ -10620,33 +9755,30 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -throat@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" - integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" -throttleit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" - integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g== +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" -through@2, through@^2.3.8, through@~2.3, through@~2.3.1: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +throat@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.2.tgz#51a3fbb5e11ae72e2cf74861ed5c8020f89f29fe" + integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ== thunky@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== -tmp@~0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -10679,14 +9811,6 @@ tough-cookie@^4.0.0: universalify "^0.2.0" url-parse "^1.5.3" -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" @@ -10706,13 +9830,18 @@ tryer@^1.0.1: resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + tsconfig-paths@^3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== + version "3.14.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== dependencies: "@types/json5" "^0.0.29" - json5 "^1.0.1" + json5 "^1.0.2" minimist "^1.2.6" strip-bom "^3.0.0" @@ -10721,10 +9850,10 @@ tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" - integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== +tslib@^2.0.3, tslib@^2.5.0: + version "2.5.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338" + integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA== tsutils@^3.21.0: version "3.21.0" @@ -10733,18 +9862,6 @@ tsutils@^3.21.0: dependencies: tslib "^1.8.1" -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -10779,11 +9896,6 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^0.8.0: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -10792,6 +9904,15 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -10800,9 +9921,9 @@ typedarray-to-buffer@^3.1.5: is-typedarray "^1.0.0" typescript@^4.3.2: - version "4.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" - integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== unbox-primitive@^1.0.2: version "1.0.2" @@ -10864,20 +9985,15 @@ unquote@~1.1.1: resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" integrity sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg== -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== - upath@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== +update-browserslist-db@^1.0.10: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -10937,9 +10053,9 @@ v8-to-istanbul@^8.1.0: source-map "^0.7.3" v8-to-istanbul@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" - integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== + version "9.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" + integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" @@ -10950,15 +10066,6 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - void-elements@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" @@ -10978,17 +10085,6 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" -wait-on@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-6.0.0.tgz#7e9bf8e3d7fe2daecbb7a570ac8ca41e9311c7e7" - integrity sha512-tnUJr9p5r+bEYXPUdRseolmz5XqJTTj98JgOsfBn7Oz2dxfE2g3zw1jE+Mo8lopM3j3et/Mq1yW7kKX6qw7RVw== - dependencies: - axios "^0.21.1" - joi "^17.4.0" - lodash "^4.17.21" - minimist "^1.2.5" - rxjs "^7.1.0" - walker@^1.0.7, walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" @@ -11038,9 +10134,9 @@ webpack-dev-middleware@^5.3.1: schema-utils "^4.0.0" webpack-dev-server@^4.6.0: - version "4.11.1" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz#ae07f0d71ca0438cf88446f09029b92ce81380b5" - integrity sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw== + version "4.15.0" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz#87ba9006eca53c551607ea0d663f4ae88be7af21" + integrity sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" @@ -11061,6 +10157,7 @@ webpack-dev-server@^4.6.0: html-entities "^2.3.2" http-proxy-middleware "^2.0.3" ipaddr.js "^2.0.1" + launch-editor "^2.6.0" open "^8.0.9" p-retry "^4.5.0" rimraf "^3.0.2" @@ -11070,7 +10167,7 @@ webpack-dev-server@^4.6.0: sockjs "^0.3.24" spdy "^4.0.2" webpack-dev-middleware "^5.3.1" - ws "^8.4.2" + ws "^8.13.0" webpack-manifest-plugin@^4.0.2: version "4.1.1" @@ -11101,27 +10198,22 @@ webpack-sources@^3.2.3: resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack-virtual-modules@^0.4.4: - version "0.4.6" - resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz#3e4008230731f1db078d9cb6f68baf8571182b45" - integrity sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA== - webpack@^5.64.4: - version "5.75.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.75.0.tgz#1e440468647b2505860e94c9ff3e44d5b582c152" - integrity sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ== + version "5.84.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.84.0.tgz#011115617668744aece87a9eb68534487d84de1a" + integrity sha512-XezNK3kwJq6IyeoZmZ1uEqQs+42nTqIi4jYM/YjLwaJedUC1N3bwnCC0+UcnHJPfqWX0kGrQnMIvZZyWYaIZrA== dependencies: "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" + "@types/estree" "^1.0.0" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" acorn "^8.7.1" - acorn-import-assertions "^1.7.6" + acorn-import-assertions "^1.9.0" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" - es-module-lexer "^0.9.0" + enhanced-resolve "^5.14.1" + es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" @@ -11130,9 +10222,9 @@ webpack@^5.64.4: loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.0" + schema-utils "^3.1.2" tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" + terser-webpack-plugin "^5.3.7" watchpack "^2.4.0" webpack-sources "^3.2.3" @@ -11206,12 +10298,7 @@ which-collection@^1.0.1: is-weakmap "^2.0.1" is-weakset "^2.0.1" -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== - -which-typed-array@^1.1.8: +which-typed-array@^1.1.9: version "1.1.9" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== @@ -11238,9 +10325,9 @@ which@^2.0.1: isexe "^2.0.0" word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + version "1.2.4" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f" + integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA== workbox-background-sync@6.5.4: version "6.5.4" @@ -11411,15 +10498,6 @@ workbox-window@6.5.4: "@types/trusted-types" "^2.0.2" workbox-core "6.5.4" -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -11444,7 +10522,7 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write-file-atomic@^4.0.1: +write-file-atomic@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== @@ -11457,10 +10535,10 @@ ws@^7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -ws@^8.4.2: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" - integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== +ws@^8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== xml-name-validator@^3.0.0: version "3.0.0" @@ -11472,16 +10550,6 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xtend@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -11492,6 +10560,11 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" @@ -11502,13 +10575,10 @@ yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" +yaml@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.0.tgz#47ebe58ee718f772ce65862beb1db816210589a0" + integrity sha512-8/1wgzdKc7bc9E6my5wZjmdavHLvO/QOmLG1FBugblEvY4IXrLjlViIOmL24HthU042lWTDRO90Fz1Yp66UnMw== yargs-parser@^20.2.2: version "20.2.9" @@ -11520,23 +10590,6 @@ yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^15.0.2: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" @@ -11551,9 +10604,9 @@ yargs@^16.2.0: yargs-parser "^20.2.2" yargs@^17.3.1: - version "17.6.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" - integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" escalade "^3.1.1" @@ -11564,36 +10617,28 @@ yargs@^17.3.1: yargs-parser "^21.1.1" yarn-audit-fix@^9.3.5: - version "9.3.7" - resolved "https://registry.yarnpkg.com/yarn-audit-fix/-/yarn-audit-fix-9.3.7.tgz#bd8c66ce2edecd930d99d55e9c6470aabdd35811" - integrity sha512-zYSp7fp3oJhGGt7o4/DvwQJTfV8M0ozOUPVpHmCAeQkJhNDj/3Zq8vLYToyffvzy2A86zZKEMPTQsLrNvYvqqA== + version "9.3.10" + resolved "https://registry.yarnpkg.com/yarn-audit-fix/-/yarn-audit-fix-9.3.10.tgz#42ece922adddf11477a696c106a172df611e681f" + integrity sha512-q4MeQuPTRNORLlxRwOJAdMOdMlqsgmbsym3SkNvD6kklMOVRWqZRlZyAlmmUepNgBaFOYI2NQCejgRz2VEIkAg== dependencies: "@types/find-cache-dir" "^3.2.1" - "@types/fs-extra" "^9.0.13" + "@types/fs-extra" "^11.0.1" "@types/lodash-es" "^4.17.6" - "@types/semver" "^7.3.12" + "@types/semver" "^7.3.13" "@types/yarnpkg__lockfile" "^1.1.5" "@yarnpkg/lockfile" "^1.1.0" - chalk "^5.0.1" - commander "^9.4.0" + chalk "^5.2.0" + commander "^10.0.0" find-cache-dir "^4.0.0" find-up "^6.3.0" fs-extra "^10.1.0" - globby "^13.1.2" + globby "^13.1.3" js-yaml "^4.1.0" lodash-es "^4.17.21" pkg-dir "^7.0.0" - semver "^7.3.7" + semver "^7.3.8" synp "^1.9.10" - tslib "^2.4.0" - -yauzl@^2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" + tslib "^2.5.0" yocto-queue@^0.1.0: version "0.1.0" diff --git a/login-workflow/media/default-login-error.png b/login-workflow/media/default-login-error.png deleted file mode 100644 index cc507f32..00000000 Binary files a/login-workflow/media/default-login-error.png and /dev/null differ diff --git a/login-workflow/media/home.png b/login-workflow/media/home.png deleted file mode 100644 index bedb86c3..00000000 Binary files a/login-workflow/media/home.png and /dev/null differ diff --git a/login-workflow/media/login.png b/login-workflow/media/login.png index e3e97b34..3f80a81a 100644 Binary files a/login-workflow/media/login.png and b/login-workflow/media/login.png differ diff --git a/login-workflow/media/password.png b/login-workflow/media/password.png index aa289cfe..a4a95c5e 100644 Binary files a/login-workflow/media/password.png and b/login-workflow/media/password.png differ diff --git a/login-workflow/media/screens/account-details.png b/login-workflow/media/screens/account-details.png new file mode 100644 index 00000000..2bc198ad Binary files /dev/null and b/login-workflow/media/screens/account-details.png differ diff --git a/login-workflow/media/screens/change-password.png b/login-workflow/media/screens/change-password.png new file mode 100644 index 00000000..1c1d88ae Binary files /dev/null and b/login-workflow/media/screens/change-password.png differ diff --git a/login-workflow/media/screens/contact-support.png b/login-workflow/media/screens/contact-support.png new file mode 100644 index 00000000..6cf54956 Binary files /dev/null and b/login-workflow/media/screens/contact-support.png differ diff --git a/login-workflow/media/screens/create-account.png b/login-workflow/media/screens/create-account.png new file mode 100644 index 00000000..17d0fc00 Binary files /dev/null and b/login-workflow/media/screens/create-account.png differ diff --git a/login-workflow/media/screens/create-password.png b/login-workflow/media/screens/create-password.png new file mode 100644 index 00000000..ecd2d4c6 Binary files /dev/null and b/login-workflow/media/screens/create-password.png differ diff --git a/login-workflow/media/screens/error-box.png b/login-workflow/media/screens/error-box.png new file mode 100644 index 00000000..e5c76592 Binary files /dev/null and b/login-workflow/media/screens/error-box.png differ diff --git a/login-workflow/media/screens/error-dialog.png b/login-workflow/media/screens/error-dialog.png new file mode 100644 index 00000000..3d2534d4 Binary files /dev/null and b/login-workflow/media/screens/error-dialog.png differ diff --git a/login-workflow/media/screens/eula.png b/login-workflow/media/screens/eula.png new file mode 100644 index 00000000..6dd261e7 Binary files /dev/null and b/login-workflow/media/screens/eula.png differ diff --git a/login-workflow/media/screens/forgot-password.png b/login-workflow/media/screens/forgot-password.png new file mode 100644 index 00000000..996a9810 Binary files /dev/null and b/login-workflow/media/screens/forgot-password.png differ diff --git a/login-workflow/media/screens/login.png b/login-workflow/media/screens/login.png new file mode 100644 index 00000000..757835bc Binary files /dev/null and b/login-workflow/media/screens/login.png differ diff --git a/login-workflow/media/screens/password-field.png b/login-workflow/media/screens/password-field.png new file mode 100644 index 00000000..551ed375 Binary files /dev/null and b/login-workflow/media/screens/password-field.png differ diff --git a/login-workflow/media/screens/registration-success.png b/login-workflow/media/screens/registration-success.png new file mode 100644 index 00000000..550055ed Binary files /dev/null and b/login-workflow/media/screens/registration-success.png differ diff --git a/login-workflow/media/screens/reset-password.png b/login-workflow/media/screens/reset-password.png new file mode 100644 index 00000000..ed53cd78 Binary files /dev/null and b/login-workflow/media/screens/reset-password.png differ diff --git a/login-workflow/media/screens/set-password.png b/login-workflow/media/screens/set-password.png new file mode 100644 index 00000000..3e340e52 Binary files /dev/null and b/login-workflow/media/screens/set-password.png differ diff --git a/login-workflow/media/screens/success.png b/login-workflow/media/screens/success.png new file mode 100644 index 00000000..09cbbcd5 Binary files /dev/null and b/login-workflow/media/screens/success.png differ diff --git a/login-workflow/media/screens/verify-email.png b/login-workflow/media/screens/verify-email.png new file mode 100644 index 00000000..e3494230 Binary files /dev/null and b/login-workflow/media/screens/verify-email.png differ diff --git a/login-workflow/media/screens/workflow-card.png b/login-workflow/media/screens/workflow-card.png new file mode 100644 index 00000000..2cdc9ace Binary files /dev/null and b/login-workflow/media/screens/workflow-card.png differ diff --git a/login-workflow/package.json b/login-workflow/package.json index 2fd8508d..2d4d2d31 100644 --- a/login-workflow/package.json +++ b/login-workflow/package.json @@ -1,53 +1,50 @@ { "name": "@brightlayer-ui/react-auth-workflow", - "version": "3.1.1", + "version": "4.0.0", "author": "Brightlayer UI (https://github.com/brightlayer-ui)", "license": "BSD-3-Clause", "description": "Re-usable workflow components for Authentication and Registration within Eaton applications.", "main": "dist/index.js", "scripts": { - "initialize": "bash scripts/initializeSubmodule.sh", - "install:dependencies": "cd example && yarn && cd ../shared-auth && yarn && cd .. && yarn", - "test": "jest src", + "install:dependencies": "cd example && yarn && cd .. && yarn", + "test": "jest --maxWorkers=50%", + "test:ci": "jest", "build": "tsc --p tsconfig.lib.json && cp -r src/assets/. dist/assets && cp -r src/index.css dist/index.css", "link:workflow": "bash ./scripts/linkWorkflow.sh", "lint": "eslint \"src/**/**.{tsx,ts}\"", "lint:fix": "eslint \"src/**/**.{tsx,ts}\" --fix", - "start:example": "yarn initialize && yarn install:dependencies && yarn link:workflow && cd example && yarn start", + "start:example": "yarn install:dependencies && yarn link:workflow && cd example && yarn start", "prettier": "prettier \"**/**.{ts,tsx,js,jsx,json,css,scss,html}\" --write", "prettier:check": "prettier \"**/**.{ts,tsx,js,jsx,json,css,scss,html}\" --check", "publish:package": "set npm_config_yes=true && npx -p @brightlayer-ui/publish blui-publish", - "tag:package": "npx -p @brightlayer-ui/tag blui-tag", - "update:submodule": "git submodule update --remote", + "tag:package": "npx -p @brightlayer-ui/tag blui-tag -s -blui-react-auth-workflow", "generate:licenses": "npm-license-crawler -onlyDirectDependencies -json LICENSES.json", "precommit": "yarn prettier && yarn lint && yarn test && yarn build", - "coverage": "yarn test --coverage --watchAll=false --no-cache", - "cy:stage": "yarn initialize && yarn install:dependencies && yarn link:workflow", - "cytest": "cd example && yarn start-server-and-test start http://localhost:3000 cy:run" + "coverage": "yarn test --coverage --watchAll=false --no-cache" }, "prettier": "@brightlayer-ui/prettier-config", "dependencies": { - "@brightlayer-ui/react-auth-shared": "^3.7.4", "dompurify": "^2.2.9", "i18next-browser-languagedetector": "^6.1.0" }, "peerDependencies": { - "@brightlayer-ui/colors": "^3.0.0", "@brightlayer-ui/react-components": "^6.1.2", "@emotion/react": "^11.7.1", "@emotion/styled": "^11.6.0", "@mui/icons-material": "^5.10.15", "@mui/material": "^5.10.15", "date-fns": "^2.14.0", - "i18next": "^19.3.4 || ^20.0.0", + "i18next": "^23.0.1", "react": "^16.13.1 || ^17.0.0 || ^18.0.0", "react-dom": "^16.8.6 || ^17.0.0 || ^18.0.0", - "react-i18next": "^11.3.4", - "react-router-dom": "^6.0.0" + "react-i18next": "^13.0.0" + }, + "optionalDependencies": { + "react-router-dom": "^6.8.0" }, "repository": { "type": "git", - "url": "https://github.com/brightlayer-ui/react-workflows/tree/master/login-workflow" + "url": "https://github.com/etn-ccis/blui-react-workflows/tree/master/login-workflow" }, "keywords": [ "brightlayer-ui", @@ -79,25 +76,26 @@ "@emotion/styled": "^11.6.0", "@mui/icons-material": "^5.3.1", "@mui/material": "^5.4.1", - "@testing-library/jest-dom": "^5.16.4", + "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^13.3.0", + "@testing-library/user-event": "^14.4.3", "@types/color": "^3.0.1", "@types/dompurify": "^2.2.2", "@types/jest": "^27.4.1", "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0", "@types/react-router-dom": "^5.1.7", - "@typescript-eslint/eslint-plugin": "^5.17.0", - "@typescript-eslint/parser": "^5.17.0", + "@typescript-eslint/eslint-plugin": "^6.7.3", + "@typescript-eslint/parser": "^6.7.3", "babel-jest": "^28.1.3", "clsx": "^1.1.1", "date-fns": "^2.22.1", - "eslint": "^8.12.0", + "eslint": "^8.50.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-react": "^7.29.4", "eslint-plugin-react-hooks": "^4.4.0", "firebase-tools": "^11.0.1", - "i18next": "^20.3.1", + "i18next": "^23.2.6", "identity-obj-proxy": "^3.0.0", "jest": "^29.3.1", "jest-environment-jsdom": "^29.3.1", @@ -105,11 +103,11 @@ "prettier": "^2.3.1", "react": "^18.0.0", "react-dom": "^18.0.0", - "react-i18next": "^11.10.0", - "react-router-dom": "^6.0.0", + "react-i18next": "^13.2.2", + "react-router-dom": "^6.8.0", "regenerator-runtime": "^0.13.7", "ts-jest": "^29.0.0-next.1", - "typescript": "^4.3.2" + "typescript": "^5.0.3" }, "jest": { "coverageDirectory": "./coverage/", diff --git a/login-workflow/scripts/initializeSubmodule.sh b/login-workflow/scripts/initializeSubmodule.sh deleted file mode 100755 index 507342ec..00000000 --- a/login-workflow/scripts/initializeSubmodule.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -BLUE='\033[0;34m' -BBLUE='\033[1;34m' #BOLD -PURPLE='\033[0;35m' -RED='\033[0;31m' -BRED='\033[1;31m' #BOLD -GREEN='\033[0;32m' -BGREEN='\033[1;32m' #BOLD -GRAY='\033[1;30m' -NC='\033[0m' # No Color - -echo -e "${BLUE}Initializing Showcase Submodule...${NC}" -if [ ! -f ./shared-auth/package.json ]; - then git submodule init && git submodule update; - else echo -e "${BBLUE}Already initialized${NC}" && exit 0; -fi -echo -e "${BBLUE}Initialization Complete${NC}\r\n" diff --git a/login-workflow/scripts/linkWorkflow.sh b/login-workflow/scripts/linkWorkflow.sh index 3263e347..ea47636a 100644 --- a/login-workflow/scripts/linkWorkflow.sh +++ b/login-workflow/scripts/linkWorkflow.sh @@ -9,19 +9,6 @@ BGREEN='\033[1;32m' #BOLD GRAY='\033[1;30m' NC='\033[0m' # No Color -echo -e "${BLUE}Building auth-shared package...${NC}" -cd ./shared-auth && yarn build && cd .. - -echo -en "${BLUE}Creating new folder in login-workflow node_modules...${NC}" -rm -rf "./node_modules/@brightlayer-ui/react-auth-shared" -mkdir -p "./node_modules/@brightlayer-ui/react-auth-shared" -echo -e "${GREEN}Done${NC}" - -echo -en "${BLUE}Copying auth-shared build output into node_modules...${NC}"; -cp -r ./shared-auth/package.json ./node_modules/@brightlayer-ui/react-auth-shared/package.json -cp -r ./shared-auth/lib/. ./node_modules/@brightlayer-ui/react-auth-shared/lib -echo -e "${GREEN}Done${NC}" - echo -e "${BLUE}Building workflow package...${NC}" yarn build @@ -30,18 +17,10 @@ rm -rf "./example/node_modules/.cache" rm -rf "./example/node_modules/@brightlayer-ui/react-auth-workflow" mkdir -p "./example/node_modules/@brightlayer-ui/react-auth-workflow" -rm -rf "./example/node_modules/@brightlayer-ui/react-auth-shared" -mkdir -p "./example/node_modules/@brightlayer-ui/react-auth-shared" -echo -e "${GREEN}Done${NC}" - echo -en "${BLUE}Copying build output into node_modules...${NC}"; cp -r ./package.json ./example/node_modules/@brightlayer-ui/react-auth-workflow/package.json cp -r ./dist/. ./example/node_modules/@brightlayer-ui/react-auth-workflow/dist -cp -r ./shared-auth/package.json ./example/node_modules/@brightlayer-ui/react-auth-shared/package.json -cp -r ./shared-auth/lib/. ./example/node_modules/@brightlayer-ui/react-auth-shared/lib -echo -e "${GREEN}Done${NC}" - echo -en "\r\n${BLUE}Linking Components: ${NC}" if [ ! -f ./example/node_modules/@brightlayer-ui/react-auth-workflow/package.json ]; then echo -e "${BRED}Not Linked${NC}" && exit 1; fi if [ ! -s ./example/node_modules/@brightlayer-ui/react-auth-workflow ]; @@ -50,12 +29,4 @@ if [ ! -s ./example/node_modules/@brightlayer-ui/react-auth-workflow ]; then echo -e "${BRED}Not Linked${NC}" && exit 1; fi; fi - -if [ ! -f ./example/node_modules/@brightlayer-ui/react-auth-shared/package.json ]; then echo -e "${BRED}Not Linked${NC}" && exit 1; fi -if [ ! -s ./example/node_modules/@brightlayer-ui/react-auth-shared ]; - then - if [ ! -f ./example/node_modules/@brightlayer-ui/react-auth-shared/lib/commonjs/index.js ]; - then echo -e "${BRED}Not Linked${NC}" && exit 1; - fi; -fi echo -e "${GRAY}Complete${NC}\r\n" \ No newline at end of file diff --git a/login-workflow/shared-auth b/login-workflow/shared-auth deleted file mode 160000 index 792a7901..00000000 --- a/login-workflow/shared-auth +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 792a7901102a66107245a7b273d777a4e06c2a81 diff --git a/login-workflow/src/components/AuthGuard.tsx b/login-workflow/src/components/AuthGuard.tsx deleted file mode 100644 index 8dc61b3c..00000000 --- a/login-workflow/src/components/AuthGuard.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import React, { useEffect } from 'react'; -import { useSecurityState } from '@brightlayer-ui/react-auth-shared'; -import { Outlet, useLocation, useNavigate } from 'react-router-dom'; -import { useRoutes } from '../contexts/RoutingContext'; - -/** - * Component that renders a conditional Route. If the user is not authenticated, this route - * will redirect to the login route. If the user is authenticated, it will render the provided - * content. - * - * @category Component - */ -export const AuthGuard = (): JSX.Element | null => { - const securityState = useSecurityState(); - const location = useLocation(); - const { routes } = useRoutes(); - const navigate = useNavigate(); - - useEffect(() => { - if (!securityState.isAuthenticatedUser) { - navigate(routes.LOGIN, { replace: true, state: { from: location } }); - } - }, [securityState, navigate, location, routes.LOGIN]); - - return ; -}; diff --git a/login-workflow/src/components/BrandedCardContainer.tsx b/login-workflow/src/components/BrandedCardContainer.tsx deleted file mode 100644 index dd6c9de0..00000000 --- a/login-workflow/src/components/BrandedCardContainer.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import React from 'react'; -import Card from '@mui/material/Card'; -import { useTheme } from '@mui/material/styles'; -import { Spinner } from './Spinner'; -import backgroundImage from '../assets/images/background.svg'; -import { useInjectedUIContext } from '@brightlayer-ui/react-auth-shared'; -import Box from '@mui/material/Box'; - -/** - * Component that renders a blue textured background and centers its children in the screen. - * - * @param children the content to render on the blue background - * - * @category Component - */ -export const BrandedBackground: React.FC> = (props) => { - const { background } = useInjectedUIContext(); - const theme = useTheme(); - - return ( - - {props.children} - - ); -}; - -export type BrandedCardContainerProps = { - loading?: boolean; -}; - -/** - * Component that renders a card centered on a blue textured background. - * - * @param loading if true a loading spinner will be displayed blocking the content - * - * @category Component - */ -export const BrandedCardContainer: React.FC< - React.PropsWithChildren> -> = (props) => { - const { children, loading, ...otherProps } = props; - const theme = useTheme(); - - return ( - - - - {children} - - - ); -}; diff --git a/login-workflow/src/components/ChangePasswordDialog/ChangePasswordDialog.test.tsx b/login-workflow/src/components/ChangePasswordDialog/ChangePasswordDialog.test.tsx new file mode 100644 index 00000000..aac9fc39 --- /dev/null +++ b/login-workflow/src/components/ChangePasswordDialog/ChangePasswordDialog.test.tsx @@ -0,0 +1,102 @@ +import React from 'react'; +import '@testing-library/jest-dom'; +import { cleanup, fireEvent, render, RenderResult, screen, waitFor } from '@testing-library/react'; +import { ChangePasswordDialog } from './ChangePasswordDialog'; +import { AuthContextProvider } from '../../contexts'; +import { BrowserRouter } from 'react-router-dom'; +import { ChangePasswordDialogProps } from './types'; +import { authContextProviderProps } from '../../testUtils'; + +afterEach(cleanup); + +describe('Change Password Dialog tests', () => { + let updateFields: any; + + afterEach(() => { + jest.clearAllMocks(); + }); + + beforeEach(() => { + updateFields = jest.fn(); + }); + + const renderer = (props?: ChangePasswordDialogProps): RenderResult => + render( + + + + + + ); + + it('renders without crashing', () => { + const { getByLabelText } = renderer({ + open: true, + currentPasswordLabel: 'Current Password', + }); + const currentPasswordInput = getByLabelText('Current Password'); + expect(currentPasswordInput).toHaveValue(''); + expect(screen.findAllByRole('input')).not.toBeNull(); + }); + + it('should display input field with passed prop', () => { + const { getByLabelText } = renderer({ + open: true, + currentPasswordLabel: 'Current Password', + }); + + const currentPasswordInput = getByLabelText('Current Password'); + expect(currentPasswordInput).toHaveValue(''); + fireEvent.change(currentPasswordInput, { target: { value: 'Abc@2023' } }); + expect(currentPasswordInput).toHaveValue('Abc@2023'); + }); + + it('should display input fields with passed props', () => { + const { getByLabelText } = renderer({ + open: true, + PasswordProps: { + newPasswordLabel: 'New Password', + confirmPasswordLabel: 'Confirm New Password', + onPasswordChange: updateFields, + passwordRequirements: [], + }, + }); + + const newPasswordInput = getByLabelText('New Password'); + expect(newPasswordInput).toHaveValue(''); + const confirmPasswordInput = getByLabelText('Confirm New Password'); + expect(confirmPasswordInput).toHaveValue(''); + fireEvent.change(newPasswordInput, { target: { value: 'Abc@1234' } }); + expect(newPasswordInput).toHaveValue('Abc@1234'); + fireEvent.change(confirmPasswordInput, { target: { value: 'Abc@1234' } }); + expect(confirmPasswordInput).toHaveValue('Abc@1234'); + }); + + it('should show success screen, when okay button is clicked', async () => { + const { getByLabelText } = renderer({ + open: true, + showSuccessScreen: true, + PasswordProps: { + newPasswordLabel: 'New Password', + confirmPasswordLabel: 'Confirm New Password', + onPasswordChange: updateFields, + passwordRequirements: [], + }, + }); + + const currentPasswordInput = getByLabelText('Current Password'); + fireEvent.change(currentPasswordInput, { target: { value: 'Abc@1234' } }); + const newPasswordInput = getByLabelText('New Password'); + const confirmPasswordInput = getByLabelText('Confirm New Password'); + fireEvent.change(newPasswordInput, { target: { value: 'Abc@1234' } }); + expect(newPasswordInput).toHaveValue('Abc@1234'); + fireEvent.change(confirmPasswordInput, { target: { value: 'Abc@1234' } }); + expect(confirmPasswordInput).toHaveValue('Abc@1234'); + + fireEvent.click(screen.getByText('Okay')); + expect(screen.getByText('Okay')).toBeEnabled(); + fireEvent.click(screen.getByText('Okay')); + + await waitFor(() => expect(screen.getByText('Your password was successfully reset.'))); + }); +}); diff --git a/login-workflow/src/components/ChangePasswordDialog/ChangePasswordDialog.tsx b/login-workflow/src/components/ChangePasswordDialog/ChangePasswordDialog.tsx new file mode 100644 index 00000000..425fd6c4 --- /dev/null +++ b/login-workflow/src/components/ChangePasswordDialog/ChangePasswordDialog.tsx @@ -0,0 +1,185 @@ +import React, { useCallback, useRef, useState } from 'react'; +import { defaultPasswordRequirements } from '../../constants'; +import { useAuthContext } from '../../contexts'; +import { ChangePasswordDialogBase } from './ChangePasswordDialogBase'; +import { ChangePasswordDialogProps } from './types'; +import CheckCircle from '@mui/icons-material/CheckCircle'; +import { useTranslation } from 'react-i18next'; + +/** + * Component that renders a dialog with textField to enter current password and a change password form with a new password and confirm password inputs. + * It includes callbacks so you can respond to changes in the inputs. + * + * @param dialogTitle title to display in the dialog + * @param dialogDescription description to display in the dialog + * @param currentPasswordLabel label to display for the current password field + * @param previousLabel label to display for the previous button + * @param nextLabel label to display for the next button + * @param currentPasswordChange called when the current password field changes + * @param enableButton boolean to enable and disable the button + * @param onFinish function called when the button is clicked on success screen + * @param onSubmit Callback function to call when the form is submitted + * @param onPrevious called when the previous button is clicked + * @param loading boolean that indicates whether the loading spinner should be displayed + * @param currentPasswordTextFieldProps props to pass to the current password field. + * @param showSuccessScreen boolean that determines whether to show the success screen or not + * @param slots used for ChangePasswordDialog SuccessScreen props + * @param slotProps props that will be passed to the SuccessScreen component + * + * @category Component + */ + +export const ChangePasswordDialog: React.FC = (props) => { + const { t } = useTranslation(); + const passwordRef = useRef(null); + const confirmRef = useRef(null); + + const { + open, + dialogTitle = t('bluiAuth:CHANGE_PASSWORD.PASSWORD'), + dialogDescription = t('bluiAuth:CHANGE_PASSWORD.PASSWORD_INFO'), + currentPasswordLabel = t('bluiCommon:LABELS.CURRENT_PASSWORD'), + previousLabel = t('bluiCommon:ACTIONS.BACK'), + nextLabel = t('bluiCommon:ACTIONS.OKAY'), + onPrevious, + onFinish, + PasswordProps, + ErrorDialogProps, + loading, + currentPasswordTextFieldProps, + slots = {}, + slotProps = {}, + } = props; + + const [currentInput, setCurrentInput] = useState(''); + const [passwordInput, setPasswordInput] = useState(''); + const [confirmInput, setConfirmInput] = useState(''); + const [showErrorDialog, setShowErrorDialog] = useState(false); + const [isLoading, setIsLoading] = useState(loading); + const [showSuccessScreen, setShowSuccessScreen] = useState(false); + const { actions } = useAuthContext(); + + const passwordRequirements = defaultPasswordRequirements(t); + + const updateFields = useCallback( + (fields: { password: string; confirm: string }) => { + setPasswordInput(fields.password); + setConfirmInput(fields.confirm); + }, + [setPasswordInput, setConfirmInput] + ); + + const areValidMatchingPasswords = useCallback((): boolean => { + if (PasswordProps?.passwordRequirements?.length === 0) { + return confirmInput === passwordInput; + } + for (let i = 0; i < passwordRequirements.length; i++) { + if (!new RegExp(passwordRequirements[i].regex).test(passwordInput)) return false; + } + return confirmInput === passwordInput; + }, [PasswordProps?.passwordRequirements?.length, passwordRequirements, passwordInput, confirmInput]); + + const checkPasswords = + currentInput !== '' && passwordInput !== '' && confirmInput !== '' && areValidMatchingPasswords(); + + const changePasswordSubmit = useCallback(async () => { + if (checkPasswords) { + try { + setIsLoading(true); + await actions.changePassword(currentInput, passwordInput); + if (props.showSuccessScreen === false) { + onFinish?.(); + } + setShowSuccessScreen(true); + } catch { + setShowErrorDialog(true); + } finally { + setIsLoading(false); + } + } + }, [ + checkPasswords, + currentInput, + passwordInput, + actions, + setIsLoading, + setShowErrorDialog, + onFinish, + props.showSuccessScreen, + ]); + + const passwordProps = { + newPasswordLabel: t('bluiAuth:CHANGE_PASSWORD.NEW_PASSWORD'), + confirmPasswordLabel: t('bluiAuth:CHANGE_PASSWORD.CONFIRM_NEW_PASSWORD'), + passwordRef, + confirmRef, + initialNewPasswordValue: passwordInput, + initialConfirmPasswordValue: confirmInput, + passwordRequirements, + passwordNotMatchError: t('bluiCommon:FORMS.PASS_MATCH_ERROR'), + ...PasswordProps, + onPasswordChange: (passwordData: { password: string; confirm: string }): void => { + updateFields(passwordData); + PasswordProps?.onPasswordChange?.(passwordData); + }, + onSubmit: async (): Promise => { + await changePasswordSubmit(); + PasswordProps?.onSubmit?.(); + }, + }; + + const errorDialogProps = { + open: showErrorDialog, + title: t('bluiCommon:MESSAGES.ERROR'), + body: t('bluiAuth:CHANGE_PASSWORD.PROBLEM_OCCURRED'), + dismissButtonText: t('bluiCommon:ACTIONS.OKAY'), + ...ErrorDialogProps, + onClose: (): void => setShowErrorDialog(false), + }; + + return ( + { + setCurrentInput(currentPwd); + props?.currentPasswordChange?.(currentPwd); + }} + enableButton={checkPasswords} + onPrevious={onPrevious} + PasswordProps={passwordProps} + ErrorDialogProps={errorDialogProps} + currentPasswordTextFieldProps={currentPasswordTextFieldProps} + onSubmit={async (): Promise => { + await changePasswordSubmit(); + }} + slots={slots} + slotProps={{ + SuccessScreen: { + icon: , + messageTitle: t('bluiAuth:PASSWORD_RESET.SUCCESS_MESSAGE'), + message: t('bluiAuth:CHANGE_PASSWORD.SUCCESS_MESSAGE'), + onDismiss: (): void => { + onFinish?.(); + }, + WorkflowCardActionsProps: { + showPrevious: false, + fullWidthButton: true, + showNext: true, + nextLabel: t('bluiCommon:ACTIONS.DONE'), + onNext: (): void => { + onFinish?.(); + }, + }, + ...slotProps.SuccessScreen, + }, + }} + showSuccessScreen={showSuccessScreen} + /> + ); +}; diff --git a/login-workflow/src/components/ChangePasswordDialog/ChangePasswordDialogBase.test.tsx b/login-workflow/src/components/ChangePasswordDialog/ChangePasswordDialogBase.test.tsx new file mode 100644 index 00000000..e367ba5c --- /dev/null +++ b/login-workflow/src/components/ChangePasswordDialog/ChangePasswordDialogBase.test.tsx @@ -0,0 +1,60 @@ +import React from 'react'; +import '@testing-library/jest-dom'; +import { cleanup, fireEvent, render } from '@testing-library/react'; +import { ChangePasswordDialogBase } from './ChangePasswordDialogBase'; + +afterEach(cleanup); + +describe('ChangePasswordDialogBase tests', () => { + it('renders without crashing', () => { + render( + {}} + PasswordProps={{ + onPasswordChange: (): void => {}, + newPasswordLabel: '', + initialNewPasswordValue: '', + confirmPasswordLabel: '', + initialConfirmPasswordValue: '', + passwordRequirements: [], + passwordRef: undefined, + confirmRef: undefined, + onSubmit: function (): void { + throw new Error('Function not implemented.'); + }, + }} + currentPasswordChange={(): void => {}} + enableButton={false} + /> + ); + }); + + it('input onChange callBack', () => { + const { getByLabelText } = render( + {}} + currentPasswordChange={(): void => {}} + enableButton={false} + PasswordProps={{ + onPasswordChange: (): void => {}, + newPasswordLabel: '', + initialNewPasswordValue: '', + confirmPasswordLabel: '', + initialConfirmPasswordValue: '', + passwordRequirements: [], + passwordRef: undefined, + confirmRef: undefined, + onSubmit: (): void => {}, + }} + currentPasswordLabel="Current Password" + /> + ); + + const currentPasswordInput = getByLabelText('Current Password'); + expect(currentPasswordInput).toHaveValue(''); + fireEvent.change(currentPasswordInput, { target: { value: 'Password@123' } }); + expect(currentPasswordInput).toHaveValue('Password@123'); + }); +}); diff --git a/login-workflow/src/components/ChangePasswordDialog/ChangePasswordDialogBase.tsx b/login-workflow/src/components/ChangePasswordDialog/ChangePasswordDialogBase.tsx new file mode 100644 index 00000000..708a7664 --- /dev/null +++ b/login-workflow/src/components/ChangePasswordDialog/ChangePasswordDialogBase.tsx @@ -0,0 +1,187 @@ +import React, { useEffect, useState } from 'react'; +import { + Button, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + Divider, + Grid, + Typography, + useMediaQuery, + useTheme, +} from '@mui/material'; +import { ChangePasswordDialogProps } from './types'; +import { SetPassword } from '../SetPassword'; +import { PasswordTextField } from '../PasswordTextField'; +import { BasicDialog } from '../Dialog'; +import { Spinner } from '../../components'; +import { SuccessScreenBase, SuccessScreenProps } from '../../screens'; + +/** + * Component that renders a dialog with textField to enter current password and a change password form with a new password and confirm password inputs. + * It includes callbacks so you can respond to changes in the inputs. + * + * @param dialogTitle title to display in the dialog + * @param dialogDescription description to display in the dialog + * @param currentPasswordLabel label to display for the current password field + * @param previousLabel label to display for the previous button + * @param nextLabel label to display for the next button + * @param currentPasswordChange called when the current password field changes + * @param enableButton boolean to enable and disable the button + * @param onFinish function called when the button is clicked on success screen + * @param onSubmit callback function to call when the form is submitted + * @param onPrevious called when the previous button is clicked + * @param sx styles passed to the underlying root component + * @param loading boolean that indicates whether the loading spinner should be displayed + * @param currentPasswordTextFieldProps props to pass to the current password field. + * @param showSuccessScreen boolean that determines whether to show the success screen or not + * @param slots used for ChangePasswordDialog SuccessScreen props + * @param slotProps props that will be passed to the SuccessScreen component + * + * @category Component + */ + +export const ChangePasswordDialogBase: React.FC = (props) => { + const { + open, + dialogTitle, + dialogDescription, + currentPasswordLabel, + previousLabel, + nextLabel, + sx, + enableButton, + currentPasswordChange, + onSubmit, + onPrevious, + ErrorDialogProps, + PasswordProps, + loading, + currentPasswordTextFieldProps, + showSuccessScreen, + slots, + slotProps, + } = props; + const theme = useTheme(); + const matchesMD = useMediaQuery(theme.breakpoints.down('md')); + const matchesSM = useMediaQuery(theme.breakpoints.down('sm')); + const [currentPassword, setCurrentPassword] = useState(''); + const [buttonState, setButtonState] = useState(true); + + const handleChange = (event: any): void => { + const { value } = event.target; + setCurrentPassword(value); + currentPasswordChange?.(value); + }; + + useEffect(() => { + setButtonState(!enableButton); + }, [enableButton]); + + const getSuccessScreen = ( + _props: SuccessScreenProps, + SuccessScreen?: (props: SuccessScreenProps) => JSX.Element + ): JSX.Element => + SuccessScreen ? ( + SuccessScreen(_props) + ) : ( + + ); + + return ( + + + {showSuccessScreen ? ( + getSuccessScreen(slotProps?.SuccessScreen || {}, slots?.SuccessScreen) + ) : ( + <> + + + {dialogTitle} + + + {dialogDescription} + + + { + // eslint-disable-next-line no-unused-expressions + currentPasswordTextFieldProps?.onChange && + currentPasswordTextFieldProps.onChange(e); + handleChange(e); + }} + onKeyUp={(e): void => { + if (e.key === 'Enter' && PasswordProps?.passwordRef?.current) { + PasswordProps?.passwordRef.current.focus(); + } + }} + /> + + + + + + + + + + + )} + + ); +}; diff --git a/login-workflow/src/components/ChangePasswordDialog/index.ts b/login-workflow/src/components/ChangePasswordDialog/index.ts new file mode 100644 index 00000000..1aad257b --- /dev/null +++ b/login-workflow/src/components/ChangePasswordDialog/index.ts @@ -0,0 +1,3 @@ +export * from './ChangePasswordDialogBase'; +export * from './types'; +export * from './ChangePasswordDialog'; diff --git a/login-workflow/src/components/ChangePasswordDialog/types.ts b/login-workflow/src/components/ChangePasswordDialog/types.ts new file mode 100644 index 00000000..fb74d8a3 --- /dev/null +++ b/login-workflow/src/components/ChangePasswordDialog/types.ts @@ -0,0 +1,97 @@ +import { DialogProps, TextFieldProps } from '@mui/material'; +import { SuccessScreenProps } from '../../screens'; +import { BasicDialogProps } from '../Dialog'; +import { SetPasswordProps } from '../SetPassword'; + +export type ChangePasswordDialogSlots = { + SuccessScreen?: (props?: SuccessScreenProps) => JSX.Element; +}; + +export type ChangePasswordDialogSlotsProps = { + SuccessScreen?: SuccessScreenProps; +}; + +export type ChangePasswordDialogProps = DialogProps & { PasswordProps?: SetPasswordProps } & { + ErrorDialogProps?: BasicDialogProps; +} & { + /** + * The title to display in the dialog + */ + dialogTitle?: string; + + /** + * The description to display in the dialog + */ + dialogDescription?: string; + + /** + * The label to display for the current password field + */ + currentPasswordLabel?: string; + + /** + * The label to display for the previous button + */ + previousLabel?: string; + + /** + * The label to display for the next button + */ + nextLabel?: string; + + /** + * Function called when the current password field changes + * @param {string} currentPassword - the updated value from the currentPassword field + * @returns void + */ + currentPasswordChange?: (currentPassword: string) => void; + + /** + * Configure whether the next button is enabled or disabled. + */ + enableButton?: boolean | (() => boolean); + + /** + * Function called when the button is clicked on success screen + * @returns void + */ + onFinish?: () => void; + + /** + * Callback function to call when the form is submitted + * @returns void | Promise + */ + onSubmit?: () => void | Promise; + + /** + * Function called when the previous button is clicked + * @returns void + */ + onPrevious?: () => void; + + /** + * Boolean that indicates whether the loading spinner should be displayed + */ + loading?: boolean; + + /** + * The props to pass to the current password field. + * See [MUI's TextFieldProps API](https://mui.com/material-ui/api/text-field/) for more details. + */ + currentPasswordTextFieldProps?: TextFieldProps; + + /** + * Used to determine whether to show a success screen after the form is submitted + */ + showSuccessScreen?: boolean; + + /** + * Used for ChangePasswordDialog SuccessScreen + */ + slots?: ChangePasswordDialogSlots; + + /** + * Applied to slot from SuccessScreen + */ + slotProps?: ChangePasswordDialogSlotsProps; +}; diff --git a/login-workflow/src/components/Components.test.tsx b/login-workflow/src/components/Components.test.tsx deleted file mode 100644 index 20262cfc..00000000 --- a/login-workflow/src/components/Components.test.tsx +++ /dev/null @@ -1,272 +0,0 @@ -import React from 'react'; -import 'regenerator-runtime/runtime'; -import { render, cleanup } from '@testing-library/react'; -import '@testing-library/jest-dom'; -import { BrandedCardContainer } from './BrandedCardContainer'; -import { FinishState } from './FinishState'; -import CheckCircle from '@mui/icons-material/CheckCircle'; -import { AuthGuard } from './AuthGuard'; -import { SecureTextField } from './SecureTextField'; -import { SimpleDialog } from './SimpleDialog'; -import { Spinner } from './Spinner'; -import { ChangePasswordForm, PasswordRequirements, PasswordRequirementsCheck, ChangePasswordModal } from './password'; -import { - AuthUIContextProvider, - SecurityContextProvider, - AccountUIActionContext, - translations, -} from '@brightlayer-ui/react-auth-shared'; -import { createTheme, ThemeProvider } from '@mui/material/styles'; -import * as BLUIThemes from '@brightlayer-ui/react-themes'; - -const theme = createTheme(BLUIThemes.blue); -afterEach(cleanup); - -import i18n from 'i18next'; -import { initReactI18next } from 'react-i18next'; -import LanguageDetector from 'i18next-browser-languagedetector'; -import { RouteConfig } from '../routing/AuthNavigationContainer'; - -void i18n - .use(initReactI18next) - .use(LanguageDetector) - .init({ - load: 'languageOnly', - detection: { - order: ['querystring', 'localStorage', 'navigator'], - caches: ['localStorage'], - lookupLocalStorage: 'blui-auth-i18nextLng', - }, - whitelist: ['en'], - ns: ['app', 'blui'], - defaultNS: 'app', - fallbackNS: 'blui', - resources: { - en: { - blui: translations.english.translation, - app: {}, - }, - }, - }); - -describe('BrandedCardContainer tests', () => { - it('renders without crashing', () => { - const authUIActions = jest.fn(); - const registrationUIActions = jest.fn(); - - render( - - - - - - ); - }); -}); - -describe('FinishState tests', () => { - it('renders without crashing', () => { - render( - - } title={`Test Title`} /> - - ); - }); -}); - -jest.mock('@brightlayer-ui/react-auth-shared', () => ({ - // @ts-ignore - ...jest.requireActual('@brightlayer-ui/react-auth-shared'), - useRoutes: jest.fn().mockReturnValue({ LOGIN: 'login' }), - useSecurityState: jest.fn().mockReturnValue({ isAuthenticatedUser: false }), -})); - -jest.mock('react-router-dom', () => ({ - // @ts-ignore - ...jest.requireActual('react-router-dom'), - useNavigate: jest.fn().mockReturnValue(jest.fn()), - useLocation: jest.fn().mockReturnValue('test-location'), -})); -jest.mock('../contexts/RoutingContext', () => ({ - useRoutes: (): { routes: RouteConfig } => ({ routes: { LOGIN: 'login' } }), -})); - -describe('AuthGuard unauthenticated tests', () => { - it('renders without crashing', () => { - render( - - - - ); - }); -}); - -jest.mock('@brightlayer-ui/react-auth-shared', () => ({ - // @ts-ignore - ...jest.requireActual('@brightlayer-ui/react-auth-shared'), - useSecurityState: jest.fn().mockReturnValue({ isAuthenticatedUser: true }), -})); - -describe('AuthGuard authenticated tests', () => { - it('renders without crashing', () => { - render( - - - - ); - }); -}); - -// TODO: Removed this test from running and will be covered by UI tests. -xdescribe('SecureTextField tests', () => { - it('renders without crashing', () => { - // const div = document.createElement('div'); - // const root = createRoot(div); - - render( - - - - ); - }); - - // it('hides input text by default', () => { - // const secureTextFieldWrapper = shallow(); - // expect(secureTextFieldWrapper.props().type).toBe('password'); - // }); -}); - -describe('SimpleDialog tests', () => { - it('renders without crashing', () => { - render( - - {}} /> - - ); - }); -}); - -describe('Spinner tests', () => { - it('renders without crashing', () => { - render( - - - - ); - }); -}); - -describe('ChangePasswordForm tests', () => { - it('renders without crashing', () => { - const authUIActions = jest.fn(); - const registrationUIActions = jest.fn(); - - render( - - - {}} /> - - - ); - }); -}); - -jest.mock('@brightlayer-ui/react-auth-shared', () => ({ - // @ts-ignore - ...jest.requireActual('@brightlayer-ui/react-auth-shared'), - useSecurityState: jest.fn().mockReturnValue({ isShowingChangePassword: true }), - initialTransitState: jest.fn().mockReturnValue({ transitSuccess: true }), -})); - -describe('ChangePasswordModal transitSuccess=true tests', () => { - it('renders without crashing', () => { - const authUIActions = jest.fn(); - const registrationUIActions = jest.fn(); - const authActions = { - initiateSecurity: jest.fn(), - logIn: jest.fn(), - forgotPassword: jest.fn(), - verifyResetCode: jest.fn(), - setPassword: jest.fn(), - changePassword: jest.fn(), - }; - const authDispatch = jest.fn(); - - render( - - - - - - - - - - ); - }); -}); - -jest.mock('@brightlayer-ui/react-auth-shared', () => ({ - // @ts-ignore - ...jest.requireActual('@brightlayer-ui/react-auth-shared'), - useSecurityState: jest.fn().mockReturnValue({ isShowingChangePassword: true }), - initialTransitState: jest.fn().mockReturnValue({ transitSuccess: false }), -})); - -describe('ChangePasswordModal transitSuccess=false tests', () => { - it('renders without crashing', () => { - const authUIActions = jest.fn(); - const registrationUIActions = jest.fn(); - const authActions = { - initiateSecurity: jest.fn(), - logIn: jest.fn(), - forgotPassword: jest.fn(), - verifyResetCode: jest.fn(), - setPassword: jest.fn(), - changePassword: jest.fn(), - }; - const authDispatch = jest.fn(); - - render( - - - - - - - - - - ); - }); -}); - -describe('PasswordRequirements tests', () => { - it('renders without crashing', () => { - const authUIActions = jest.fn(); - const registrationUIActions = jest.fn(); - - render( - - - - - - ); - }); -}); - -describe('PasswordRequirementsCheck tests', () => { - it('renders without crashing', () => { - const authUIActions = jest.fn(); - const registrationUIActions = jest.fn(); - - render( - - - - - - ); - }); -}); diff --git a/login-workflow/src/components/Dialog/BasicDialog.tsx b/login-workflow/src/components/Dialog/BasicDialog.tsx new file mode 100644 index 00000000..482a90eb --- /dev/null +++ b/login-workflow/src/components/Dialog/BasicDialog.tsx @@ -0,0 +1,89 @@ +import React from 'react'; +import Button from '@mui/material/Button'; +import Dialog, { DialogProps } from '@mui/material/Dialog'; +import Typography from '@mui/material/Typography'; +import DialogTitle from '@mui/material/DialogTitle'; +import DialogContent from '@mui/material/DialogContent'; +import DialogActions from '@mui/material/DialogActions'; + +/** + * Component that renders a basic dialog with a title, body description, and a close button. + * + * @param title to show text in the title + * @param body text to show in the body + * @param onClose function to call when the close button is clicked + * @param props all other props will be spread to the underlying Dialog component + * @param dismissButtonText text to show in the close button + * + * @category Component + */ + +export type BasicDialogProps = Omit & { + /** + * The title for the screen + */ + title?: string; + + /** + * The text to show in the main dialog body + */ + body?: string; + + /** + * The function to call when the close button is clicked + * @returns void + */ + onClose?: () => void; + + /** + * The text to show in the close button + */ + dismissButtonText?: string; + + /** + * Set the open / closed state of the dialog + * @default false + */ + open?: boolean; +}; + +export const BasicDialog: React.FC>> = (props) => { + const { title, body, dismissButtonText, open = false, sx, ...dialogProps } = props; + + return ( + + + {title} + + + {body} + + + + + + ); +}; diff --git a/login-workflow/src/components/Dialog/index.ts b/login-workflow/src/components/Dialog/index.ts new file mode 100644 index 00000000..a04b1607 --- /dev/null +++ b/login-workflow/src/components/Dialog/index.ts @@ -0,0 +1 @@ +export * from './BasicDialog'; diff --git a/login-workflow/src/components/Error/ErrorManager.test.tsx b/login-workflow/src/components/Error/ErrorManager.test.tsx new file mode 100644 index 00000000..dd26a1c7 --- /dev/null +++ b/login-workflow/src/components/Error/ErrorManager.test.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import '@testing-library/jest-dom'; +import { render, cleanup, screen, RenderResult } from '@testing-library/react'; +import ErrorManager, { ErrorManagerProps } from './ErrorManager'; +import { RegistrationContextProvider } from '../../contexts'; +import { RegistrationWorkflow } from '../../components'; +import { registrationContextProviderProps } from '../../testUtils'; + +afterEach(cleanup); + +const renderer = (props?: ErrorManagerProps): RenderResult => + render( + + + + + + ); + +describe('ErrorManager', () => { + renderer(); + it('renders without crashing', () => { + render(); + const errorManager = screen.getByText('Error Message'); + expect(errorManager).toBeInTheDocument(); + }); +}); diff --git a/login-workflow/src/components/Error/ErrorManager.tsx b/login-workflow/src/components/Error/ErrorManager.tsx new file mode 100644 index 00000000..1f4f6648 --- /dev/null +++ b/login-workflow/src/components/Error/ErrorManager.tsx @@ -0,0 +1,120 @@ +import React, { useCallback } from 'react'; +import { BasicDialog } from '../Dialog/BasicDialog'; +import ErrorMessageBox from './ErrorMessageBox'; +import { SxProps } from '@mui/material/styles'; +import { useTranslation } from 'react-i18next'; + +export type AuthError = { cause: { title: string; errorMessage: string } }; + +export type ErrorManagerProps = { + /** + * Determines whether to display a dialog, a message box, or neither + */ + mode?: 'dialog' | 'message-box' | 'none'; + + /** + * The function to call when the close/dismiss button is clicked + * @returns void + */ + onClose?: () => void; + + /** + * The error text to display + */ + error?: string; + + /** + * Configuration options when using mode='dialog' + * @param {string} dialogConfig.title - The title used in the dialog header + * @param {string} dialogConfig.dismissLabel - The label on the dismiss button. + */ + dialogConfig?: { + title?: string; + dismissLabel?: string; + }; + messageBoxConfig?: { + dismissible?: boolean; + position?: 'top' | 'bottom'; + fontColor?: string; + backgroundColor?: string; + sx?: SxProps; + }; + children?: React.ReactNode; +}; + +/** + * Component that manages the display of error messages. Can be configured to display a dialog, a message box, or neither. + * + * @param mode determines whether to display a dialog, a message box, or neither + * @param onClose function to call when the close/dismiss button is clicked + * @param error error text to display + * @param dialogConfig configuration for the error dialog + * @param dialogConfig.title text to show in the title of the dialog + * @param dialogConfig.dismissLabel text to show in the close button + * @param messageBoxConfig configuration for the error message box + * @param messageBoxConfig.dismissible whether the message box can be dismissed + * @param messageBoxConfig.position determines whether the message box should be displayed at the top or bottom of the screen + * @param messageBoxConfig.fontColor the font color of the text inside the message box + * @param messageBoxConfig.backgroundColor the background color of the message box + * @param messageBoxConfig.sx sx styles passed to the underlying root(Box) component + * + * @category Component + */ + +const ErrorManager: React.FC = (props): JSX.Element => { + const { t } = useTranslation(); + const { + children, + mode = 'dialog', + error = '', + onClose = (): void => {}, + dialogConfig, + messageBoxConfig = { + position: 'top', + }, + } = props; + + const ErrorDialogWithProps = useCallback( + (): JSX.Element => ( + 0} + title={dialogConfig?.title ?? t('bluiCommon:MESSAGES.ERROR')} + body={error} + onClose={onClose} + dismissButtonText={dialogConfig?.dismissLabel} + /> + ), + [dialogConfig, error, onClose, t] + ); + + const ErrorMessageBoxWithProps = useCallback((): JSX.Element => { + const { dismissible = true, fontColor, backgroundColor, sx } = messageBoxConfig; + + return ( + + ); + }, [error, messageBoxConfig, onClose]); + + return mode === 'dialog' && error.length > 0 ? ( + <> + {children} + + + ) : mode === 'message-box' && error.length > 0 ? ( + <> + {messageBoxConfig.position !== 'bottom' && } + {children} + {messageBoxConfig.position === 'bottom' && } + + ) : ( + <>{children} + ); +}; +export default ErrorManager; diff --git a/login-workflow/src/components/Error/ErrorMessageBox.test.tsx b/login-workflow/src/components/Error/ErrorMessageBox.test.tsx new file mode 100644 index 00000000..d7b812f4 --- /dev/null +++ b/login-workflow/src/components/Error/ErrorMessageBox.test.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import '@testing-library/jest-dom'; +import { render, cleanup, screen, fireEvent } from '@testing-library/react'; +import ErrorMessageBox from './ErrorMessageBox'; + +afterEach(cleanup); + +describe('ErrorMessageBox', () => { + it('renders without crashing', () => { + render(); + const messageBox = screen.getByText('Error Message'); + expect(messageBox).toBeInTheDocument(); + }); + + it('dismisses when the Close icon is clicked', () => { + const mockOnClose = jest.fn(); + render(); + const closeButton = screen.queryByTestId('error-message-box-close'); + expect(closeButton).toBeInTheDocument(); + fireEvent.click(closeButton); + expect(mockOnClose).toHaveBeenCalledTimes(1); + }); + + it('does not render the Close icon when dismissible is false', () => { + render(); + const closeButton = screen.queryByTestId('error-message-box-close'); + expect(closeButton).not.toBeInTheDocument(); + }); +}); diff --git a/login-workflow/src/components/Error/ErrorMessageBox.tsx b/login-workflow/src/components/Error/ErrorMessageBox.tsx new file mode 100644 index 00000000..e168271b --- /dev/null +++ b/login-workflow/src/components/Error/ErrorMessageBox.tsx @@ -0,0 +1,88 @@ +import React from 'react'; +import Box from '@mui/material/Box'; +import Close from '@mui/icons-material/Close'; +import { SxProps, Theme } from '@mui/material/styles'; +import Typography from '@mui/material/Typography'; + +export type ErrorMessageBoxProps = { + /** + * The text to show in the title + */ + errorMessage: string; + + /** + * The background color of the message box + */ + backgroundColor?: string; + + /** + * Boolean whether the message box can be dismissed + * @default true + */ + dismissible?: boolean; + + /** + * The font color of the text inside the message box + */ + fontColor?: string; + + /** + * The function to call when the close button is clicked + * @returns void + */ + onClose?: () => void; + + /** + * Styles passed to the underlying root component + */ + sx?: SxProps; +}; + +/** + * Component that renders a basic message box with an error message and a configurable dismiss button. + * + * @param errorMessage text to show in the title + * @param backgroundColor the background color of the message box + * @param dismissible whether the message box can be dismissed + * @param fontColor the font color of the text inside the message box + * @param onClose function to call when the close button is clicked + * @param sx styles passed to the underlying root component + * + * @category Component + */ +const ErrorMessageBox = (props: ErrorMessageBoxProps): JSX.Element => { + const { errorMessage, backgroundColor, dismissible = true, fontColor, onClose = (): void => {}, sx } = props; + + return ( + fontColor || t.palette.error.contrastText, + my: 2, + }, + ...(Array.isArray(sx) ? sx : [sx]), + ]} + > + {dismissible !== false && ( + { + onClose(); + }} + /> + )} + {errorMessage} + + ); +}; +export default ErrorMessageBox; diff --git a/login-workflow/src/components/Error/index.ts b/login-workflow/src/components/Error/index.ts new file mode 100644 index 00000000..7025ef84 --- /dev/null +++ b/login-workflow/src/components/Error/index.ts @@ -0,0 +1,2 @@ +export * from './ErrorManager'; +export * from './ErrorMessageBox'; diff --git a/login-workflow/src/components/Guards/ReactRouterAuthGuard.tsx b/login-workflow/src/components/Guards/ReactRouterAuthGuard.tsx new file mode 100644 index 00000000..b96e17cd --- /dev/null +++ b/login-workflow/src/components/Guards/ReactRouterAuthGuard.tsx @@ -0,0 +1,30 @@ +import React from 'react'; +import { Navigate, useLocation } from 'react-router-dom'; + +type ReactRouterAuthGuardProps = { + children?: JSX.Element; + isAuthenticated: boolean; + fallBackUrl: string; +}; + +/** + * Component that renders a conditional Route. If the user is not authenticated, this route + * will redirect to the route specified by user using fallBackUrl prop. If the user is authenticated, it will render the provided + * content. + * @param children The element/route to render if the user is authenticated + * @param isAuthenticated Indicates whether the user is authenticated or not + * @param fallBackUrl URL where to redirect if user is not authenticated + * + * @category Component + */ + +export const ReactRouterAuthGuard = (props: ReactRouterAuthGuardProps): JSX.Element | null => { + const { children = null, fallBackUrl, isAuthenticated } = props; + const location = useLocation(); + + if (!isAuthenticated) { + return ; + } + + return children; +}; diff --git a/login-workflow/src/components/Guards/ReactRouterGuestGuard.tsx b/login-workflow/src/components/Guards/ReactRouterGuestGuard.tsx new file mode 100644 index 00000000..c3c63977 --- /dev/null +++ b/login-workflow/src/components/Guards/ReactRouterGuestGuard.tsx @@ -0,0 +1,31 @@ +import React from 'react'; +import { Navigate, useLocation } from 'react-router-dom'; + +type ReactRouterGuestProps = { + children?: JSX.Element; + isAuthenticated: boolean; + fallBackUrl: string; +}; + +/** + * Component that renders a conditional Route. If the user is already authenticated, this route + * will redirect back to the prior route. If the user is not authenticated, it will render the provided + * content. + * + * @param children The element/route to render if the user is not authenticated + * @param isAuthenticated Indicates whether the user is authenticated or not + * @param fallBackUrl URL where to redirect if user is authenticated + * + * @category Component + */ + +export const ReactRouterGuestGuard = (props: ReactRouterGuestProps): JSX.Element | null => { + const { children = null, isAuthenticated, fallBackUrl } = props; + const location = useLocation(); + if (isAuthenticated) { + const redirectedURL = location.state?.from ?? fallBackUrl; + return ; + } + + return children; +}; diff --git a/login-workflow/src/components/Guards/index.ts b/login-workflow/src/components/Guards/index.ts new file mode 100644 index 00000000..0ab421b7 --- /dev/null +++ b/login-workflow/src/components/Guards/index.ts @@ -0,0 +1,2 @@ +export * from './ReactRouterAuthGuard'; +export * from './ReactRouterGuestGuard'; diff --git a/login-workflow/src/components/GuestGuard.tsx b/login-workflow/src/components/GuestGuard.tsx deleted file mode 100644 index 74d3564f..00000000 --- a/login-workflow/src/components/GuestGuard.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { ReactElement, useEffect } from 'react'; -import { useSecurityState } from '@brightlayer-ui/react-auth-shared'; -import { useLocation, useNavigate } from 'react-router-dom'; - -type GuestGuardProps = { - children?: ReactElement | null; -}; -/** - * Component that renders a conditional Route. If the user is already authenticated, this route - * will redirect back to the prior route. If the user is not authenticated, it will render the provided - * content. - * - * @param children The element/route to render if the user is not authenticated - * - * @category Component - */ -export const GuestGuard = ({ children }: GuestGuardProps): JSX.Element | null => { - const securityState = useSecurityState(); - const location = useLocation(); - const navigate = useNavigate(); - - useEffect(() => { - if (securityState.isAuthenticatedUser) { - navigate((location.state as { from: any })?.from ? (location.state as { from: any }).from : '/', { - replace: true, - }); - } - }, [securityState, navigate, location]); - - return children; -}; diff --git a/login-workflow/src/components/PasswordRequirements/PasswordRequirements.tsx b/login-workflow/src/components/PasswordRequirements/PasswordRequirements.tsx new file mode 100644 index 00000000..a64f1eb6 --- /dev/null +++ b/login-workflow/src/components/PasswordRequirements/PasswordRequirements.tsx @@ -0,0 +1,43 @@ +import React from 'react'; +import { PasswordRequirementsCheck } from './PasswordRequirementsCheck'; +import Box, { BoxProps } from '@mui/material/Box'; +import { PasswordRequirement } from '../SetPassword'; +import { defaultPasswordRequirements } from '../../constants'; +import { useTranslation } from 'react-i18next'; + +export type PasswordRequirementsProps = BoxProps & { + /** + * The string to conduct the complexity checks against + */ + passwordText: string; + + /** + * Optional requirements to set password + */ + passwordRequirements?: PasswordRequirement[]; +}; + +/** + * Component that renders all of the password requirement line items with check indicators. + * + * @param passwordText The string to conduct the complexity checks against + * @param passwordRequirements Optional requirements to set password + * + * @category Component + */ +export const PasswordRequirements: React.FC> = (props) => { + const { t } = useTranslation(); + const { passwordText, passwordRequirements = defaultPasswordRequirements(t), sx, ...otherProps } = props; + + return ( + + {passwordRequirements.map((req, ind) => ( + + ))} + + ); +}; diff --git a/login-workflow/src/components/password/PasswordRequirementsCheck.tsx b/login-workflow/src/components/PasswordRequirements/PasswordRequirementsCheck.tsx similarity index 88% rename from login-workflow/src/components/password/PasswordRequirementsCheck.tsx rename to login-workflow/src/components/PasswordRequirements/PasswordRequirementsCheck.tsx index 010dd29a..da969c75 100644 --- a/login-workflow/src/components/password/PasswordRequirementsCheck.tsx +++ b/login-workflow/src/components/PasswordRequirements/PasswordRequirementsCheck.tsx @@ -4,7 +4,14 @@ import Check from '@mui/icons-material/Check'; import Box from '@mui/material/Box'; export type PasswordRequirementsCheckProps = { + /** + * True if the line item should have a blue check (false for gray) + */ isChecked: boolean; + + /** + * The text to display beside the check icon + */ label: string; }; diff --git a/login-workflow/src/components/PasswordRequirements/index.tsx b/login-workflow/src/components/PasswordRequirements/index.tsx new file mode 100644 index 00000000..ee276710 --- /dev/null +++ b/login-workflow/src/components/PasswordRequirements/index.tsx @@ -0,0 +1,2 @@ +export * from './PasswordRequirements'; +export * from './PasswordRequirementsCheck'; diff --git a/login-workflow/src/components/SecureTextField.tsx b/login-workflow/src/components/PasswordTextField/PasswordTextField.tsx similarity index 72% rename from login-workflow/src/components/SecureTextField.tsx rename to login-workflow/src/components/PasswordTextField/PasswordTextField.tsx index 4d3adb6c..c7cb77f5 100644 --- a/login-workflow/src/components/SecureTextField.tsx +++ b/login-workflow/src/components/PasswordTextField/PasswordTextField.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { ReactNode, useState } from 'react'; import TextField, { TextFieldProps } from '@mui/material/TextField'; import InputAdornment from '@mui/material/InputAdornment'; import IconButton from '@mui/material/IconButton'; @@ -13,7 +13,8 @@ import VisibilityOff from '@mui/icons-material/VisibilityOff'; * * @category Component */ -export const SecureTextField: React.FC>> = (props) => { +export const PasswordTextField: React.FC & { icon?: ReactNode }> = (props) => { + const { icon, sx, ...otherProps } = props; const [showPassword, setShowPassword] = useState(false); return ( @@ -24,6 +25,11 @@ export const SecureTextField: React.FC + {icon && ( + + {icon} + + )} setShowPassword(!showPassword)} @@ -35,7 +41,8 @@ export const SecureTextField: React.FC ), }} - {...props} + sx={sx} + {...otherProps} /> ); }; diff --git a/login-workflow/src/components/PasswordTextField/index.ts b/login-workflow/src/components/PasswordTextField/index.ts new file mode 100644 index 00000000..d604ad9b --- /dev/null +++ b/login-workflow/src/components/PasswordTextField/index.ts @@ -0,0 +1 @@ +export * from './PasswordTextField'; diff --git a/login-workflow/src/components/RegistrationWorkflow/RegistrationWorkflow.test.tsx b/login-workflow/src/components/RegistrationWorkflow/RegistrationWorkflow.test.tsx new file mode 100644 index 00000000..ca444832 --- /dev/null +++ b/login-workflow/src/components/RegistrationWorkflow/RegistrationWorkflow.test.tsx @@ -0,0 +1,146 @@ +import React from 'react'; +import '@testing-library/jest-dom'; +import { cleanup, fireEvent, render, screen, renderHook, act, RenderResult } from '@testing-library/react'; +import { RegistrationWorkflow, RegistrationWorkflowProps } from './RegistrationWorkflow'; +import Typography from '@mui/material/Typography'; +import Button from '@mui/material/Button'; +import { RegistrationContextProvider, useRegistrationWorkflowContext } from '../../contexts'; +import Box from '@mui/material/Box'; +import { CreateAccountScreen } from '../../screens'; +import { registrationContextProviderProps } from '../../testUtils'; + +afterEach(cleanup); + +const defaultProps: RegistrationWorkflowProps = { + initialScreenIndex: 0, +}; + +const renderer = (props = defaultProps): RenderResult => + render( + + + Screen 1 + Screen 2 + + + ); + +describe('RegistrationWorkflow', () => { + it('renders without crashing', () => { + renderer(); + expect(screen.getByText('Screen 1')).toBeInTheDocument(); + }); + + it('should render the multiple screens', () => { + renderer(); + expect(screen.getByText('Screen 1')).toBeInTheDocument(); + }); + + it('should render the correct screen, when initialScreenIndex prop is passed', () => { + renderer({ initialScreenIndex: 1 }); + expect(screen.queryByText('Screen 1')).toBeNull(); + expect(screen.getByText('Screen 2')).toBeInTheDocument(); + }); + + it('should call nextScreen function', () => { + const nextScreen = jest.fn(); + const { getByText } = render( + + + <> + Indexed Screen 1 + + + Indexed Screen 2 + + + ); + fireEvent.click(getByText('Next')); + expect(nextScreen).toHaveBeenCalledWith({ screenId: 'Eula', values: { accepted: true } }); + }); + + it('should set screen data for default registration workflow in the context', () => { + const wrapper = ({ children }: any): JSX.Element => ( + + {children} + + ); + const { result } = renderHook(() => useRegistrationWorkflowContext(), { wrapper }); + + expect(result.current.screenData['Eula'].accepted).toBeFalsy(); + expect(result.current.screenData['CreateAccount'].emailAddress).toBe(''); + + act(() => { + void result.current.nextScreen({ screenId: 'Eula', values: { accepted: true } }); + }); + act(() => { + result.current.previousScreen({ + screenId: 'CreateAccount', + values: { emailAddress: 'emailAddress@emailAddress.com' }, + }); + }); + + expect(result.current.screenData['Eula'].accepted).toBeTruthy(); + + void ((): void => + expect(result.current.screenData['CreateAccount'].emailAddress).toBe('emailAddress@emailAddress.com')); + }); + + it('should set screen data for custom registration workflow in the context', () => { + const wrapper = ({ children }: any): JSX.Element => ( + + {children} + + ); + const { result } = renderHook(() => useRegistrationWorkflowContext(), { wrapper }); + + act(() => { + void result.current.nextScreen({ screenId: 'Screen1', values: { test: 'test' } }); + }); + act(() => { + result.current.previousScreen({ + screenId: 'Screen2', + values: { test2: 'test2' }, + }); + }); + expect(result.current.screenData['Other']['Screen1'].test).toBe('test'); + + void ((): void => expect(result.current.screenData['Other']['Screen2'].test2).toBe('test2')); + }); + + it('should check for lower bound of initialScreenIndex props', () => { + renderer({ initialScreenIndex: -1 }); + expect(screen.getByText('Screen 1')).toBeInTheDocument(); + }); + + it('should check for upper bound of initialScreenIndex props', () => { + renderer({ initialScreenIndex: 2 }); + expect(screen.getByText('Screen 2')).toBeInTheDocument(); + }); + + it('should render custom success screen', () => { + const props = defaultProps; + defaultProps.successScreen = Success; + const { getByLabelText, getByText } = render( + + + + + + ); + const verifyEmailInput = getByLabelText('Email Address'); + fireEvent.change(verifyEmailInput, { target: { value: 'test@test.net' } }); + fireEvent.blur(verifyEmailInput); + const nextButton = getByText('Next'); + expect(screen.getByText(/Next/i)).toBeEnabled(); + fireEvent.click(nextButton); + + void ((): void => expect(screen.getByText('Success')).toBeInTheDocument()); + }); +}); diff --git a/login-workflow/src/components/RegistrationWorkflow/RegistrationWorkflow.tsx b/login-workflow/src/components/RegistrationWorkflow/RegistrationWorkflow.tsx new file mode 100644 index 00000000..35a28821 --- /dev/null +++ b/login-workflow/src/components/RegistrationWorkflow/RegistrationWorkflow.tsx @@ -0,0 +1,223 @@ +import React, { useEffect, useState } from 'react'; +import { IndividualScreenData, RegistrationWorkflowContextProvider, useRegistrationContext } from '../../contexts'; +import { + AccountDetailsScreen, + CreateAccountScreen, + CreatePasswordScreen, + EulaScreen, + ExistingAccountSuccessScreen, + RegistrationSuccessScreen, + VerifyCodeScreen, +} from '../../screens'; +import { parseQueryString } from '../../utils'; +import { useErrorManager } from '../../contexts/ErrorContext/useErrorManager'; +import ErrorManager, { ErrorManagerProps } from '../Error/ErrorManager'; + +/** + * Component that contain the registration workflow and index of screens. + * + * @param initialScreenIndex initial screen index to start the registration workflow from + * @param successScreen success screen to display upon successful registration + * @param isInviteRegistration boolean when true verifies validateUserRegistrationRequest for verifyCode + * @param existingAccountSuccessScreen component that displays the success screen + * + * @category Component + */ + +export type RegistrationWorkflowProps = { + /** + * The initial screen index to start the registration workflow from + */ + initialScreenIndex?: number; + + /** + * The success screen to display upon successful registration + */ + successScreen?: JSX.Element; + + /** + * When true verifies validateUserRegistrationRequest for verifyCode and several of the default screens will be skipped + * not requiring user input for email and the validation code will be pulled from the url + * @default false + */ + isInviteRegistration?: boolean; + + /** + * Component to display for the success screen if the account already exists. + */ + existingAccountSuccessScreen?: JSX.Element; + + /** + * The configuration for customizing how errors are displayed + */ + errorDisplayConfig?: ErrorManagerProps; +}; + +export const RegistrationWorkflow: React.FC> = (props) => { + const [isAccountExist, setIsAccountExist] = useState(false); + const { triggerError, errorManagerConfig } = useErrorManager(); + const { actions, navigate } = useRegistrationContext(); + + const errorDisplayConfig = { + ...errorManagerConfig, + ...props.errorDisplayConfig, + onClose: (): void => { + if (props.errorDisplayConfig && props.errorDisplayConfig.onClose) props.errorDisplayConfig.onClose(); + if (errorManagerConfig.onClose) errorManagerConfig?.onClose(); + }, + }; + const { + initialScreenIndex = 0, + successScreen = , + existingAccountSuccessScreen = , + isInviteRegistration = false, + children = isInviteRegistration + ? [ + , + , + , + ] + : [ + , + , + , + , + , + ], + } = props; + + const screens = [...(Array.isArray(children) ? children : [children])]; + const totalScreens = screens.length; + const [currentScreen, setCurrentScreen] = useState( + initialScreenIndex < 0 ? 0 : initialScreenIndex > totalScreens - 1 ? totalScreens - 1 : initialScreenIndex + ); + const [showSuccessScreen, setShowSuccessScreen] = useState(false); + + const [screenData, setScreenData] = useState({ + Eula: { + accepted: false, + }, + CreateAccount: { + emailAddress: '', + }, + VerifyCode: { + code: '', + isAccountExist: false, + }, + CreatePassword: { + password: '', + confirmPassword: '', + }, + AccountDetails: { + firstName: '', + lastName: '', + }, + Other: {}, + }); + + const updateScreenData = (data: IndividualScreenData): void => { + const { Other }: { [key: string]: any } = screenData; + const { screenId, values, isAccountExist: accountExists } = data; + + if (accountExists) { + setIsAccountExist(accountExists); + setShowSuccessScreen(accountExists); + } + + if (!Object.keys(screenData).includes(screenId)) { + setScreenData((oldData) => ({ + ...oldData, + Other: { ...oldData.Other, [screenId]: values }, + })); + } else if (Object.keys(Other).includes(screenId)) { + setScreenData((oldData) => ({ + ...oldData, + Other: { ...Other, [screenId]: { ...Other[screenId], ...values } }, + })); + } else { + setScreenData((oldData) => ({ + ...oldData, + [screenId]: values, + })); + } + }; + + const finishRegistration = async (data: IndividualScreenData): Promise => { + try { + if (actions && actions.completeRegistration) { + const { Eula, CreateAccount, VerifyCode, CreatePassword, AccountDetails, Other } = screenData; + const userInfo = { + ...Eula, + ...CreateAccount, + ...VerifyCode, + ...CreatePassword, + ...AccountDetails, + ...Other, + ...data.values, + }; + return await actions + .completeRegistration(userInfo) + .then(({ email, organizationName }) => { + updateScreenData({ + screenId: 'RegistrationSuccessScreen', + values: { email, organizationName }, + }); + setShowSuccessScreen(true); + }) + .catch((_error) => { + triggerError(_error); + }); + } + } catch (err) { + console.error(err); + } + }; + + useEffect(() => { + if (isInviteRegistration) { + const params = parseQueryString(window.location.search); + + updateScreenData({ screenId: 'CreateAccount', values: { emailAddress: params.email } }); + updateScreenData({ screenId: 'VerifyCode', values: { code: params.code } }); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + | undefined => { + try { + updateScreenData(data); + if (data.isAccountExist) { + setIsAccountExist(true); + setShowSuccessScreen(true); + } + if (currentScreen === totalScreens - 1) return finishRegistration(data); + setCurrentScreen((i) => i + 1); + } catch (_error) { + triggerError(_error as Error); + } + }} + previousScreen={(data): void => { + updateScreenData(data); + if (currentScreen === 0) { + navigate(-1); + } + setCurrentScreen((i) => i - 1); + }} + screenData={screenData} + updateScreenData={updateScreenData} + isInviteRegistration={isInviteRegistration} + > + + {showSuccessScreen + ? isAccountExist + ? existingAccountSuccessScreen + : successScreen + : screens[currentScreen]} + + + ); +}; diff --git a/login-workflow/src/components/RegistrationWorkflow/index.ts b/login-workflow/src/components/RegistrationWorkflow/index.ts new file mode 100644 index 00000000..2bf87ae3 --- /dev/null +++ b/login-workflow/src/components/RegistrationWorkflow/index.ts @@ -0,0 +1 @@ +export * from './RegistrationWorkflow'; diff --git a/login-workflow/src/components/SetPassword/SetPassword.test.tsx b/login-workflow/src/components/SetPassword/SetPassword.test.tsx new file mode 100644 index 00000000..20d76a43 --- /dev/null +++ b/login-workflow/src/components/SetPassword/SetPassword.test.tsx @@ -0,0 +1,142 @@ +import React from 'react'; +import '@testing-library/jest-dom'; +import { cleanup, fireEvent, render, RenderResult, screen } from '@testing-library/react'; +import { SetPassword } from './SetPassword'; +import { AuthContextProvider } from '../../contexts'; +import { PasswordRequirement, SetPasswordProps } from './types'; +import { authContextProviderProps } from '../../testUtils'; + +afterEach(cleanup); + +const passwordRequirements: PasswordRequirement[] = [ + { + description: 'Check 1', + regex: /^.{3,5}$/, + }, + { + description: 'Check 2', + regex: /[a-z]+/, + }, +]; + +const setPasswordProps: SetPasswordProps = { + newPasswordLabel: 'Password', + confirmPasswordLabel: 'Confirm Password', + initialNewPasswordValue: '', + initialConfirmPasswordValue: '', + passwordNotMatchError: 'Passwords do not match', + onPasswordChange: jest.fn(), + passwordRequirements: passwordRequirements, +}; + +const isValidPassword = (passwordInput: string): boolean => { + for (let i = 0; i < passwordRequirements.length; i++) { + if (!new RegExp(passwordRequirements[i].regex).test(passwordInput)) return false; + } + return true; +}; + +describe('SetPassword', () => { + const renderer = (props = setPasswordProps): RenderResult => + render( + + + + ); + + it('renders without crashing', () => { + renderer(); + + expect(screen.getByTestId('password')).toBeInTheDocument(); + expect(screen.getByTestId('confirm')).toBeInTheDocument(); + }); + + it('should display default props', () => { + renderer(); + + expect(screen.getByLabelText('Password')).toBeInTheDocument(); + expect(screen.getByLabelText('Confirm Password')).toBeInTheDocument(); + expect(screen.queryByLabelText('Password')).toBeEmptyDOMElement(); + expect(screen.queryByLabelText('Confirm Password')).toBeEmptyDOMElement(); + }); + + it('should display the passed props', () => { + const props = { + ...setPasswordProps, + newPasswordLabel: 'New Password', + confirmPasswordLabel: 'New Confirm Password', + }; + renderer(props); + + expect(screen.getByLabelText('New Password')).toBeInTheDocument(); + expect(screen.getByLabelText('New Confirm Password')).toBeInTheDocument(); + }); + + it('should display the updated password requirements, when passed through passwordRequirements', () => { + const props = { ...setPasswordProps, passwordRequirements }; + renderer(props); + + expect(screen.queryByText('8-16 Characters')).toBeNull(); + expect(screen.getByText('Check 1')).toBeInTheDocument(); + expect(screen.getByText('Check 2')).toBeInTheDocument(); + }); + + it('should check the password requirements', () => { + const props = { ...setPasswordProps, passwordRequirements }; + renderer(props); + + expect(isValidPassword('123')).toBeFalsy(); + expect(isValidPassword('A123')).toBeFalsy(); + expect(isValidPassword('a123')).toBeTruthy(); + }); + + it('should display the field error, when passwords do not match', () => { + const { getByLabelText, rerender } = renderer(); + + const passwordField = getByLabelText('Password'); + const confirmPasswordField = getByLabelText('Confirm Password'); + + fireEvent.focus(passwordField); + fireEvent.change(passwordField, { target: { value: '1' } }); + fireEvent.blur(passwordField); + + fireEvent.focus(confirmPasswordField); + fireEvent.change(confirmPasswordField, { target: { value: '2' } }); + fireEvent.blur(confirmPasswordField); + + rerender( + + + + ); + + expect(screen.getByText('Passwords do not match')).toBeInTheDocument(); + }); + + it('should display the green check icon, when passwords match', () => { + const props = { ...setPasswordProps }; + props.passwordRequirements = []; + const { getByLabelText, getByTestId, queryByTestId, rerender } = renderer(); + + const passwordField = getByLabelText('Password'); + const confirmPasswordField = getByLabelText('Confirm Password'); + + expect(queryByTestId('check')).toBeNull(); + + fireEvent.focus(passwordField); + fireEvent.change(passwordField, { target: { value: '2' } }); + fireEvent.blur(passwordField); + + fireEvent.focus(confirmPasswordField); + fireEvent.change(confirmPasswordField, { target: { value: '2' } }); + fireEvent.blur(confirmPasswordField); + + rerender( + + + + ); + + expect(getByTestId('check')).toBeInTheDocument(); + }); +}); diff --git a/login-workflow/src/components/SetPassword/SetPassword.tsx b/login-workflow/src/components/SetPassword/SetPassword.tsx new file mode 100644 index 00000000..e0d08b7d --- /dev/null +++ b/login-workflow/src/components/SetPassword/SetPassword.tsx @@ -0,0 +1,150 @@ +import React, { ChangeEvent, useState, useCallback } from 'react'; +import CheckCircleOutlinedIcon from '@mui/icons-material/CheckCircleOutlined'; +import { SetPasswordProps } from './types'; +import { PasswordTextField } from '../PasswordTextField'; +import { PasswordRequirements } from '../PasswordRequirements'; + +/** + * Component that renders a change password form with a new password and confirm password inputs. + * It includes callbacks so you can respond to changes in the inputs. + * + * @param onPasswordChange called when the new password or confirm new password fields value changes + * @param initialNewPasswordValue initial value for the new password field + * @param initialConfirmPasswordValue initial value for the confirm password field + * @param passwordRequirements requirements to set password + * @param newPasswordLabel label for the new password field (default = 'Password') + * @param confirmPasswordLabel label for the confirm password field (default = 'Confirm') + * @param passwordRef ref to forward to the password input. + * @param confirmRef ref to forward to the confirm password input. + * @param passwordNotMatchError text for showing message when passwords do not match. + * @param onSubmit function to call when the form is submitted + * @param passwordTextFieldProps props to pass to the password field. + * @param confirmPasswordTextFieldProps props to pass to the confirm password field. + * + * @category Component + */ + +export const SetPassword: React.FC> = (props) => { + const { + newPasswordLabel, + initialNewPasswordValue = '', + confirmPasswordLabel, + initialConfirmPasswordValue = '', + passwordRequirements, + onPasswordChange, + children, + passwordRef, + confirmRef, + passwordNotMatchError, + onSubmit, + passwordTextFieldProps, + confirmPasswordTextFieldProps, + } = props; + + // Local State + const [passwordInput, setPasswordInput] = useState(initialNewPasswordValue); + const [confirmInput, setConfirmInput] = useState(initialConfirmPasswordValue); + const [shouldValidateConfirmPassword, setShouldValidateConfirmPassword] = useState( + initialConfirmPasswordValue ? true : false + ); + const [shouldValidatePassword, setShouldValidatePassword] = useState(initialNewPasswordValue ? true : false); + + const onPassChange = useCallback( + (newPassword: any) => { + setPasswordInput(newPassword); + onPasswordChange?.({ password: newPassword, confirm: confirmInput }); + }, + [setPasswordInput, onPasswordChange, confirmInput] + ); + + const onConfirmChange = useCallback( + (newConfirm: any) => { + setConfirmInput(newConfirm); + onPasswordChange?.({ password: passwordInput, confirm: newConfirm }); + }, + [setConfirmInput, onPasswordChange, passwordInput] + ); + + const hasConfirmPasswordError = useCallback( + (): boolean => shouldValidateConfirmPassword && confirmInput.length !== 0 && confirmInput !== passwordInput, + [shouldValidateConfirmPassword, confirmInput, passwordInput] + ); + + const isValidPassword = useCallback((): boolean => { + if (passwordRequirements?.length) + for (let i = 0; i < passwordRequirements.length; i++) { + if (!new RegExp(passwordRequirements[i].regex).test(passwordInput)) return false; + } + return true; + }, [passwordRequirements, passwordInput]); + + return ( + <> + {children} + ): void => { + // eslint-disable-next-line no-unused-expressions + passwordTextFieldProps?.onChange && passwordTextFieldProps.onChange(evt); + onPassChange(evt.target.value); + }} + onKeyUp={(e): void => { + if (e.key === 'Enter' && confirmRef?.current) { + confirmRef.current.focus(); + } + }} + onBlur={(e): void => { + // eslint-disable-next-line no-unused-expressions + passwordTextFieldProps?.onBlur && passwordTextFieldProps.onBlur(e); + setShouldValidatePassword(true); + }} + /> + {passwordRequirements && passwordRequirements.length > 0 && ( + + )} + + ) : undefined + } + {...confirmPasswordTextFieldProps} + onChange={(evt: ChangeEvent): void => { + // eslint-disable-next-line no-unused-expressions + confirmPasswordTextFieldProps?.onChange && confirmPasswordTextFieldProps.onChange(evt); + onConfirmChange(evt.target.value); + }} + onKeyUp={(e): void => { + if (e.key === 'Enter' && onSubmit) onSubmit(); + }} + onBlur={(e): void => { + // eslint-disable-next-line no-unused-expressions + confirmPasswordTextFieldProps?.onBlur && confirmPasswordTextFieldProps.onBlur(e); + setShouldValidateConfirmPassword(true); + }} + /> + + ); +}; diff --git a/login-workflow/src/components/SetPassword/index.ts b/login-workflow/src/components/SetPassword/index.ts new file mode 100644 index 00000000..ac4e4c8f --- /dev/null +++ b/login-workflow/src/components/SetPassword/index.ts @@ -0,0 +1,2 @@ +export * from './SetPassword'; +export * from './types'; diff --git a/login-workflow/src/components/SetPassword/types.ts b/login-workflow/src/components/SetPassword/types.ts new file mode 100644 index 00000000..fa0f77fd --- /dev/null +++ b/login-workflow/src/components/SetPassword/types.ts @@ -0,0 +1,87 @@ +import { MutableRefObject } from 'react'; +import { TextFieldProps } from '@mui/material'; + +/** + * Parameters for dynamic password strength requirements. + */ +export type PasswordRequirement = { + /** + * The description of the password requirement + */ + description: string; + + /** + * The regex to validate the password + */ + regex: RegExp; +}; + +export type SetPasswordProps = { + /** + * Function called when the new password or confirm new password fields value changes + * @param {string} password - new password value + * @param {string} confirm - confirm password value + * @returns void + */ + onPasswordChange?: (passwords: { password: string; confirm: string }) => void; + + /** + * The label for the new password field + * @default Password + */ + newPasswordLabel?: string; + + /** + * The initial value for the new password field + */ + initialNewPasswordValue?: string; + + /** + * The label for the confirm password field + * @default Confirm + */ + confirmPasswordLabel?: string; + + /** + * The initial value for the confirm password + */ + initialConfirmPasswordValue?: string; + + /** + * A list of password complexity requirements + */ + passwordRequirements?: PasswordRequirement[]; + + /** + * The ref to forward to the password input + */ + passwordRef?: MutableRefObject; + + /** + * The ref to forward to the confirm password input + */ + confirmRef?: MutableRefObject; + + /** + * The text for showing message when passwords do not match + */ + passwordNotMatchError?: string; + + /** + * The function to call when the form is submitted + * @returns void + */ + onSubmit?: () => void; + + /** + * The props to pass to the password field. + * See [MUI's TextFieldProps API](https://mui.com/material-ui/api/text-field/) for more details. + */ + passwordTextFieldProps?: TextFieldProps; + + /** + * The props to pass to the confirm password field. + * See [MUI's TextFieldProps API](https://mui.com/material-ui/api/text-field/) for more details. + */ + confirmPasswordTextFieldProps?: TextFieldProps; +}; diff --git a/login-workflow/src/components/SimpleDialog.tsx b/login-workflow/src/components/SimpleDialog.tsx deleted file mode 100644 index d50edfc4..00000000 --- a/login-workflow/src/components/SimpleDialog.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import React from 'react'; -import Button from '@mui/material/Button'; -import Dialog, { DialogProps } from '@mui/material/Dialog'; -import Typography from '@mui/material/Typography'; -import DialogTitle from '@mui/material/DialogTitle'; -import DialogContent from '@mui/material/DialogContent'; -import DialogActions from '@mui/material/DialogActions'; -import { useLanguageLocale } from '@brightlayer-ui/react-auth-shared'; -import { useTheme } from '@mui/material/styles'; -import { DialogButtonStyles, DialogActionsStyles, DialogContentStyles, DialogTitleStyles } from '../styles'; - -export type SimpleDialogProps = DialogProps & { - title: string; - body: string; - onClose: () => void; -}; - -/** - * Component that renders a simple dialog with a title, body description, and a close button. - * - * @param title text to show in the title - * @param body text to show in the body - * @param onClose function to call when the close button is clicked - * @param props all other props will be spread to the underlying Dialog component - * - * @category Component - */ -export const SimpleDialog: React.FC>> = (props) => { - const { title, body, ...dialogProps } = props; - const { t } = useLanguageLocale(); - const theme = useTheme(); - - return ( - - {title} - - {body} - - - - - - ); -}; diff --git a/login-workflow/src/components/Spinner.tsx b/login-workflow/src/components/Spinner.tsx deleted file mode 100644 index c3ccaf98..00000000 --- a/login-workflow/src/components/Spinner.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import React from 'react'; -import CircularProgress from '@mui/material/CircularProgress'; -import { useTheme } from '@mui/material/styles'; -import Box from '@mui/material/Box'; - -type SpinnerProps = { - visible?: boolean; -}; -/** - * Component that renders a indeterminate circular progress spinner atop a semi-transparent white background. - * - * @param visible True if the spinner should be displayed, false to render nothing - * - * @category Component - */ -export const Spinner: React.FC>> = (props) => { - const { visible } = props; - const theme = useTheme(); - - return visible ? ( - - - - ) : ( - <> - ); -}; diff --git a/login-workflow/src/components/Spinner/Spinner.tsx b/login-workflow/src/components/Spinner/Spinner.tsx new file mode 100644 index 00000000..7bd82f69 --- /dev/null +++ b/login-workflow/src/components/Spinner/Spinner.tsx @@ -0,0 +1,47 @@ +import React from 'react'; +import CircularProgress from '@mui/material/CircularProgress'; +import Box, { BoxProps } from '@mui/material/Box'; + +export type SpinnerProps = BoxProps & { + /** + * True if the spinner should be displayed, false to render nothing + */ + visible?: boolean; +}; +/** + * Component that renders a indeterminate circular progress spinner atop a semi-transparent white background. + * + * @param visible True if the spinner should be displayed, false to render nothing + * + * @category Component + */ +export const Spinner: React.FC = (props) => { + const { visible, sx, ...otherProps } = props; + + return visible ? ( + + theme.palette.mode === 'light' ? 'rgba(255,255,255,0.6)' : 'rgba(0,0,0,0.7)', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + flexDirection: 'column', + }, + ...(Array.isArray(sx) ? sx : [sx]), + ]} + {...otherProps} + > + + + ) : ( + <> + ); +}; diff --git a/login-workflow/src/components/Spinner/index.tsx b/login-workflow/src/components/Spinner/index.tsx new file mode 100644 index 00000000..b259397b --- /dev/null +++ b/login-workflow/src/components/Spinner/index.tsx @@ -0,0 +1 @@ +export * from './Spinner'; diff --git a/login-workflow/src/components/WorkflowCard/ErrorState.tsx b/login-workflow/src/components/WorkflowCard/ErrorState.tsx new file mode 100644 index 00000000..ce2fee38 --- /dev/null +++ b/login-workflow/src/components/WorkflowCard/ErrorState.tsx @@ -0,0 +1,13 @@ +import React from 'react'; +import { Typography } from '@mui/material'; +import { ErrorStateProps } from './WorkflowCard.types'; + +export const ErrorState: React.FC = (props) => { + const { message, sx, ...otherTypographyProps } = props; + + return ( + + {message} + + ); +}; diff --git a/login-workflow/src/components/WorkflowCard/Utility.ts b/login-workflow/src/components/WorkflowCard/Utility.ts new file mode 100644 index 00000000..d8953da3 --- /dev/null +++ b/login-workflow/src/components/WorkflowCard/Utility.ts @@ -0,0 +1,26 @@ +import generateUtilityClass from '@mui/material/generateUtilityClass'; + +export type WorkflowCardClasses = { + root?: string; + card?: string; +}; + +export type WorkflowCardClassKey = keyof WorkflowCardClasses; + +export function getWorkflowCardUtilityClass(slot: string): string { + return generateUtilityClass('BluiWorkflowCard', slot); +} + +// For WorkflowCardActions component +export type workflowCardActionsClasses = { + root?: string; + nextButton?: string; + previousButton?: string; + stepper?: string; +}; + +export type WorkflowCardActionsClassKey = keyof workflowCardActionsClasses; + +export function getWorkflowCardActionsUtilityClass(slot: string): string { + return generateUtilityClass('BluiWorkflowCardActions', slot); +} diff --git a/login-workflow/src/components/WorkflowCard/Workflow.test.tsx b/login-workflow/src/components/WorkflowCard/Workflow.test.tsx new file mode 100644 index 00000000..446d3009 --- /dev/null +++ b/login-workflow/src/components/WorkflowCard/Workflow.test.tsx @@ -0,0 +1,154 @@ +import React from 'react'; +import '@testing-library/jest-dom'; +import { createTheme, ThemeProvider } from '@mui/material/styles'; +import { cleanup, render, screen } from '@testing-library/react'; +import { WorkflowCard } from './WorkflowCard'; +import { WorkflowCardActions } from './WorkflowCardActions'; +import { WorkflowCardBody } from './WorkflowCardBody'; +import { WorkflowCardHeader } from './WorkflowCardHeader'; +import { WorkflowCardInstructions } from './WorkflowCardInstructions'; +import { ErrorState } from './ErrorState'; + +afterEach(cleanup); + +describe('WorkflowCard tests', () => { + it('renders without crashing', () => { + render( + + Test + + ); + expect(screen.getByText('Test')).toBeInTheDocument(); + }); + + it('renders without crashing', () => { + const darkTheme = createTheme({ palette: { mode: 'dark' } }); + render( + + Test + + ); + expect(screen.getByText('Test')).toBeInTheDocument(); + }); +}); + +describe('WorkflowCardActions tests', () => { + it('renders without crashing', () => { + render( + {}} + showPrevious={true} + previousLabel={'Back'} + onPrevious={(): void => {}} + canGoNext={(): any => {}} + showNext={true} + nextLabel={'Next'} + onNext={(): void => {}} + currentStep={2} + totalSteps={5} + fullWidthButton={false} + > + ); + expect(screen.getByTestId('BluiWorkflowCardActions-previousButton')).toHaveTextContent('Back'); + }); + + it('renders without crashing', () => { + render( + {}} + canGoNext={true} + showNext={true} + nextLabel={'Next'} + onNext={(): void => {}} + currentStep={0} + totalSteps={0} + fullWidthButton={true} + > + ); + }); + + it('renders without crashing', () => { + render( + {}} + canGoNext={false} + showNext={false} + nextLabel={'Next'} + onNext={(): void => {}} + currentStep={0} + totalSteps={0} + fullWidthButton={true} + > + ); + }); + + it('renders without crashing', () => { + render( + {}} + canGoNext={false} + showNext={false} + nextLabel={'Next'} + onNext={(): void => {}} + fullWidthButton={false} + > + ); + }); +}); + +describe('WorkflowCardBody tests', () => { + it('renders without crashing', () => { + render(Body); + expect(screen.getByText('Body')).toBeInTheDocument(); + }); +}); +describe('WorkflowCardHeader tests', () => { + it('renders without crashing', () => { + render(); + expect(screen.getByText('Test')).toBeInTheDocument(); + }); + + it('renders without crashing', () => { + render(); + }); +}); + +describe('WorkflowCardInstructions tests', () => { + it('renders without crashing', () => { + render(); + expect(screen.getByText('Test')).toBeInTheDocument(); + }); + + it('renders without crashing', () => { + render(); + expect(screen.getByText('Test')).toBeInTheDocument(); + }); + + it('renders with divider', () => { + const { container } = render(); + expect(screen.getByText('Test')).toBeInTheDocument(); + expect(container.getElementsByClassName('MuiDivider-root').length).toBe(1); + }); + + it('renders without divider', () => { + const { container } = render(); + expect(screen.getByText('Test')).toBeInTheDocument(); + expect(container.getElementsByClassName('MuiDivider-root').length).toBe(0); + }); +}); + +describe('ErrorState tests', () => { + it('renders without crashing', () => { + render(); + expect(screen.getByText('Test')).toBeInTheDocument(); + }); +}); diff --git a/login-workflow/src/components/WorkflowCard/WorkflowCard.tsx b/login-workflow/src/components/WorkflowCard/WorkflowCard.tsx new file mode 100644 index 00000000..69cbab3e --- /dev/null +++ b/login-workflow/src/components/WorkflowCard/WorkflowCard.tsx @@ -0,0 +1,73 @@ +import React from 'react'; +import Box from '@mui/material/Box'; +import defaultBackgroundImage from '../../assets/images/background.svg'; +import Card from '@mui/material/Card'; +import { Spinner } from '../Spinner/Spinner'; +import { WorkflowCardBaseProps } from './WorkflowCard.types'; +import { getWorkflowCardUtilityClass, WorkflowCardClassKey } from './Utility'; +import { unstable_composeClasses as composeClasses } from '@mui/base'; + +/** + * Component that renders the workflow card that is used for all screen components. + * + * @param loading boolean value for isLoading + * @param backgroundImage to display card background + * + * @category Component + */ + +const useUtilityClasses = (ownerState: WorkflowCardBaseProps): Record => { + const { classes } = ownerState; + + const slots = { + root: ['root'], + card: ['card'], + }; + + return composeClasses(slots, getWorkflowCardUtilityClass, classes); +}; + +export const WorkflowCard: React.FC = (props) => { + const { loading, backgroundImage, sx, children, ...otherBoxProps } = props; + const defaultClasses = useUtilityClasses(props); + + return ( + (theme.palette.mode === 'light' ? 'primary.main' : 'primary.dark'), + backgroundImage: backgroundImage ? `url(${backgroundImage})` : `url(${defaultBackgroundImage})`, + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + }, + ...(Array.isArray(sx) ? sx : [sx]), + ]} + className={defaultClasses.root} + data-testid={defaultClasses.root} + {...otherBoxProps} + > + + <> + + {children} + + + + ); +}; diff --git a/login-workflow/src/components/WorkflowCard/WorkflowCard.types.ts b/login-workflow/src/components/WorkflowCard/WorkflowCard.types.ts new file mode 100644 index 00000000..51d5dc6d --- /dev/null +++ b/login-workflow/src/components/WorkflowCard/WorkflowCard.types.ts @@ -0,0 +1,111 @@ +import { CardActionsProps, CardHeaderProps, TypographyProps } from '@mui/material'; +import { BoxProps } from '@mui/material/Box'; + +export type ErrorStateProps = TypographyProps & { + /** + * The text to display for error + */ + message?: string; +}; + +export type WorkflowCardBaseProps = BoxProps & { + /** + * If true, a blocking progress spinner will be displayed over the card + */ + loading?: boolean; + + /** + * A custom background to render behind the card + */ + backgroundImage?: string; +}; + +export type WorkflowCardHeaderProps = CardHeaderProps; + +export type WorkflowCardInstructionProps = TypographyProps & { + /** + * The text to display as instructions + */ + instructions?: string | JSX.Element; + + /** + * Whether or not to show a divider below the instructions + * @default true + */ + divider?: boolean; +}; + +// type DataObject = { [key: string]: any }; + +export type WorkflowCardActionsProps = CardActionsProps & { + /** + * True to display a divider above workflow card action buttons + */ + divider?: boolean; + + /** + * Boolean or function that indicates whether the next button should be enabled + */ + canGoNext?: boolean | (() => boolean); + + /** + * Boolean or function that indicates whether the previous button should be enabled + */ + canGoPrevious?: boolean | (() => boolean); + + /** + * Boolean that indicates whether the previous button should be displayed + */ + showPrevious?: boolean; + + /** + * Boolean that indicates whether the next button should be displayed + */ + showNext?: boolean; + + /** + * The label to display for the previous button + */ + previousLabel?: string; + + /** + * The label to display for the next button + */ + nextLabel?: string; + + /** + * Function called when the previous button is clicked + * @param {Object} data - data collected from the card / screen + * @returns void + */ + onPrevious?: (data?: { [key: string]: any }) => void; + + /** + * Function that is called when the next button is clicked + * @param {Object} data - data collected from the card / screen + * @returns void + */ + onNext?: (data?: { [key: string]: any }) => void; + + /** + * The current step in the registration workflow + */ + currentStep?: number; + + /** + * The total number of steps in the registration workflow + */ + totalSteps?: number; + + /** + * Boolean that indicates whether a button should be full width + */ + fullWidthButton?: boolean; +}; + +export type WorkflowCardProps = { + WorkflowCardBaseProps?: WorkflowCardBaseProps; + WorkflowCardHeaderProps?: WorkflowCardHeaderProps; + WorkflowCardInstructionProps?: WorkflowCardInstructionProps; + WorkflowCardActionsProps?: WorkflowCardActionsProps; +}; diff --git a/login-workflow/src/components/WorkflowCard/WorkflowCardActions.tsx b/login-workflow/src/components/WorkflowCard/WorkflowCardActions.tsx new file mode 100644 index 00000000..059d4bc1 --- /dev/null +++ b/login-workflow/src/components/WorkflowCard/WorkflowCardActions.tsx @@ -0,0 +1,138 @@ +import React from 'react'; +import CardActions from '@mui/material/CardActions'; +import MobileStepper from '@mui/material/MobileStepper'; +import Button from '@mui/material/Button'; +import { WorkflowCardActionsProps } from './WorkflowCard.types'; +import { getWorkflowCardActionsUtilityClass, WorkflowCardActionsClassKey } from './Utility'; +import { unstable_composeClasses as composeClasses } from '@mui/base'; +import Divider from '@mui/material/Divider'; +import Box from '@mui/material/Box'; + +/** + * Component that renders the workflow card action elements used for all screen components. + * + * @param divider boolean value to display a divider above workflow card action buttons + * @param canGoNext boolean or function that indicates whether the next button should be enabled + * @param canGoPrevious boolean or function that indicates whether the previous button should be enabled + * @param showPrevious boolean that indicates whether the previous button should be displayed + * @param showNext boolean that indicates whether the next button should be displayed + * @param previousLabel label to display for the previous button + * @param nextLabel label to display for the next button + * @param onPrevious function called when the previous button is clicked + * @param onNext function that is called when the next button is clicked + * @param currentStep current step in the registration workflow + * @param totalSteps total number of steps in the registration workflow + * @param fullWidthButton boolean that indicates whether a button should be full width + * + * @category Component + */ + +const useUtilityClasses = (ownerState: WorkflowCardActionsProps): Record => { + const { classes } = ownerState; + + const slots = { + root: ['root'], + nextButton: ['nextButton'], + previousButton: ['previousButton'], + stepper: ['stepper'], + }; + + return composeClasses(slots, getWorkflowCardActionsUtilityClass, classes); +}; + +export const WorkflowCardActions: React.FC = (props) => { + const { + divider = true, + canGoPrevious, + showPrevious, + previousLabel, + onPrevious, + canGoNext, + showNext, + nextLabel, + onNext, + currentStep, + totalSteps = 5, + fullWidthButton, + sx, + ...otherCardActionsProps + } = props; + const defaultClasses = useUtilityClasses(props); + + const showStepperDots = currentStep !== undefined && totalSteps !== undefined && !fullWidthButton; + + return ( + <> + {divider ? ( + + ) : null} + + + + {previousLabel} + + ) : ( + + ) + } + nextButton={ + showNext ? ( + + ) : ( + + ) + } + sx={{ + background: 'transparent', + width: '100%', + p: 0, + '& .MuiMobileStepper-dot': showStepperDots ? { my: 0, mx: 0.5 } : { display: 'none' }, + }} + className={defaultClasses.stepper} + data-testid={defaultClasses.stepper} + /> + + + ); +}; diff --git a/login-workflow/src/components/WorkflowCard/WorkflowCardBody.tsx b/login-workflow/src/components/WorkflowCard/WorkflowCardBody.tsx new file mode 100644 index 00000000..56c71901 --- /dev/null +++ b/login-workflow/src/components/WorkflowCard/WorkflowCardBody.tsx @@ -0,0 +1,35 @@ +import React from 'react'; +import CardContent, { CardContentProps } from '@mui/material/CardContent'; + +/** + * Component that renders the body content for the workflow card. + * + * @param children content to render in the WorkflowCardBody + * + * @category Component + */ + +export const WorkflowCardBody: React.FC = (props) => { + const { children, sx, ...otherCardContentProps } = props; + + return ( + + {children} + + ); +}; diff --git a/login-workflow/src/components/WorkflowCard/WorkflowCardHeader.tsx b/login-workflow/src/components/WorkflowCard/WorkflowCardHeader.tsx new file mode 100644 index 00000000..440ebac4 --- /dev/null +++ b/login-workflow/src/components/WorkflowCard/WorkflowCardHeader.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import CardHeader from '@mui/material/CardHeader'; +import Typography from '@mui/material/Typography'; +import { WorkflowCardHeaderProps } from './WorkflowCard.types'; + +/** + * Component that renders the header content for the workflow card. + * + * @category Component + */ + +export const WorkflowCardHeader: React.FC = (props) => { + const { title, sx, ...otherCardHeaderProps } = props; + + return ( + {title} : title} + sx={[ + { + pt: { md: 4, sm: 2 }, + px: { md: 3, sm: 2 }, + pb: 0, + }, + ...(Array.isArray(sx) ? sx : [sx]), + ]} + {...otherCardHeaderProps} + /> + ); +}; diff --git a/login-workflow/src/components/WorkflowCard/WorkflowCardInstructions.tsx b/login-workflow/src/components/WorkflowCard/WorkflowCardInstructions.tsx new file mode 100644 index 00000000..195d1966 --- /dev/null +++ b/login-workflow/src/components/WorkflowCard/WorkflowCardInstructions.tsx @@ -0,0 +1,30 @@ +import React from 'react'; +import Divider from '@mui/material/Divider'; +import Typography from '@mui/material/Typography'; +import { WorkflowCardInstructionProps } from './WorkflowCard.types'; + +/** + * Component that renders the instructions content for the workflow card. + * + * @param instructions text to display as instructions + * @param divider whether or not to show a divider below the instructions + * + * @category Component + */ + +export const WorkflowCardInstructions: React.FC = (props) => { + const { instructions, divider = true, sx, ...otherProps } = props; + + return ( + <> + {typeof instructions === 'string' ? ( + + {instructions} + + ) : ( + instructions + )} + {divider ? : null} + + ); +}; diff --git a/login-workflow/src/components/WorkflowCard/index.ts b/login-workflow/src/components/WorkflowCard/index.ts new file mode 100644 index 00000000..08f26489 --- /dev/null +++ b/login-workflow/src/components/WorkflowCard/index.ts @@ -0,0 +1,6 @@ +export * from './WorkflowCard'; +export * from './WorkflowCardActions'; +export * from './WorkflowCardBody'; +export * from './WorkflowCardHeader'; +export * from './WorkflowCardInstructions'; +export * from './ErrorState'; diff --git a/login-workflow/src/components/FinishState.tsx b/login-workflow/src/components/WorkflowFinishState.tsx similarity index 57% rename from login-workflow/src/components/FinishState.tsx rename to login-workflow/src/components/WorkflowFinishState.tsx index 75df9d17..3c6b4242 100644 --- a/login-workflow/src/components/FinishState.tsx +++ b/login-workflow/src/components/WorkflowFinishState.tsx @@ -1,7 +1,6 @@ import React from 'react'; import { EmptyStateProps, EmptyState } from '@brightlayer-ui/react-components'; import Box from '@mui/material/Box'; -import { useTheme } from '@mui/material/styles'; /** * Component that renders a EmptyState component indicating completion of a user flow. @@ -11,23 +10,25 @@ import { useTheme } from '@mui/material/styles'; * * @category Component */ -export const FinishState: React.FC>> = (props) => { - const { classes: emptyStateClasses = {}, style, ...emptyStateProps } = props; - const theme = useTheme(); + +export const WorkflowFinishState: React.FC>> = ( + props +) => { + const { classes: emptyStateClasses = {}, style, sx, ...emptyStateProps } = props; return ( diff --git a/login-workflow/src/components/index.ts b/login-workflow/src/components/index.ts index 947df921..17e17799 100644 --- a/login-workflow/src/components/index.ts +++ b/login-workflow/src/components/index.ts @@ -1,7 +1,10 @@ -export { BrandedCardContainer } from './BrandedCardContainer'; -export { AuthGuard } from './AuthGuard'; -export { SecureTextField } from './SecureTextField'; -export { SimpleDialog } from './SimpleDialog'; -export { Spinner } from './Spinner'; -export * from './FinishState'; -export * from './password'; +export * from './Dialog'; +export * from './PasswordTextField'; +export * from './WorkflowCard'; +export * from './WorkflowFinishState'; +export * from './RegistrationWorkflow'; +export * from './SetPassword'; +export * from './ChangePasswordDialog'; +export * from './Guards'; +export * from './PasswordRequirements'; +export * from './Spinner'; diff --git a/login-workflow/src/components/jest.config.js b/login-workflow/src/components/jest.config.js deleted file mode 100644 index 8835a9ef..00000000 --- a/login-workflow/src/components/jest.config.js +++ /dev/null @@ -1,14 +0,0 @@ -const { defaults: tsjPreset } = require('ts-jest/presets'); - -module.exports = { - transform: { - ...tsjPreset.transform, - '^.+\\.svg$': './svgTransform.js', - }, - globals: { - 'ts-jest': { - tsconfig: 'tsconfig.test.json', - }, - }, - testEnvironment: 'jsdom', -}; diff --git a/login-workflow/src/components/password/ChangePasswordForm.tsx b/login-workflow/src/components/password/ChangePasswordForm.tsx deleted file mode 100644 index df1a30a4..00000000 --- a/login-workflow/src/components/password/ChangePasswordForm.tsx +++ /dev/null @@ -1,112 +0,0 @@ -import React, { ChangeEvent, useState, useCallback, MutableRefObject } from 'react'; -import { useLanguageLocale } from '@brightlayer-ui/react-auth-shared'; -import Typography from '@mui/material/Typography'; -import Divider from '@mui/material/Divider'; -import { useTheme } from '@mui/material/styles'; -import { SecureTextField } from '../SecureTextField'; -import { PasswordRequirements } from './PasswordRequirements'; -import { FullDividerStyles, TextFieldStyles } from '../../styles'; - -export type ChangePasswordFormProps = { - onPasswordChange: (passwords: { password: string; confirm: string }) => void; - initialPassword?: string; - initialConfirm?: string; - passwordLabel?: string; - confirmLabel?: string; - description?: string; - passwordRef?: MutableRefObject; - confirmRef?: MutableRefObject; - onSubmit?: () => void; -}; - -/** - * Component that renders a change password form with a new password and confirm password inputs. - * It includes callbacks so you can respond to changes in the inputs. - * - * @param onPasswordChange Fired when the new password or confirm new password fields value changes - * @param initialPassword Value to initialize the password field - * @param initialConfirm Value to initialize the confirm field - * @param passwordLabel Optional label for the new password field (default = 'Password') - * @param confirmLabel Optional label for the confirm password field (default = 'Confirm') - * @param description Optional text to replace the instructional text above the password fields. - * @param passwordRef Optional ref to forward to the password input. - * @param confirmRef Optional ref to forward to the confirm password input. - * @param onSubmit Optional callback function to call when the mini form is submitted. - * - * @category Component - */ -export const ChangePasswordForm: React.FC>> = ( - props -) => { - const { - onPasswordChange, - initialPassword = '', - initialConfirm = '', - passwordLabel, - confirmLabel, - description, - children, - passwordRef, - confirmRef, - onSubmit, - } = props; - const { t } = useLanguageLocale(); - const theme = useTheme(); - - // Local State - const [passwordInput, setPasswordInput] = useState(initialPassword); - const [confirmInput, setConfirmInput] = useState(initialConfirm); - - const onPassChange = useCallback( - (newPassword: any) => { - setPasswordInput(newPassword); - onPasswordChange({ password: newPassword, confirm: confirmInput }); - }, - [setPasswordInput, onPasswordChange, confirmInput] - ); - - const onConfirmChange = useCallback( - (newConfirm: any) => { - setConfirmInput(newConfirm); - onPasswordChange({ password: passwordInput, confirm: newConfirm }); - }, - [setConfirmInput, onPasswordChange, passwordInput] - ); - - return ( - <> - {description || t('blui:CHANGE_PASSWORD.PASSWORD_INFO')} - - - - {children} - ): void => onPassChange(evt.target.value)} - sx={TextFieldStyles(theme)} - onKeyPress={(e): void => { - if (e.key === 'Enter' && confirmRef.current) { - confirmRef.current.focus(); - } - }} - /> - - ): void => onConfirmChange(evt.target.value)} - onKeyPress={(e): void => { - if (e.key === 'Enter' && onSubmit) onSubmit(); - }} - /> - - ); -}; diff --git a/login-workflow/src/components/password/ChangePasswordModal.tsx b/login-workflow/src/components/password/ChangePasswordModal.tsx deleted file mode 100644 index ac3450fc..00000000 --- a/login-workflow/src/components/password/ChangePasswordModal.tsx +++ /dev/null @@ -1,203 +0,0 @@ -import React, { useState, useCallback, ChangeEvent, useRef } from 'react'; -import { - useSecurityState, - useSecurityActions, - useLanguageLocale, - useAccountUIActions, - initialTransitState, - transitSuccess, - transitStart, - transitFailed, - useInjectedUIContext, - AccountActions, -} from '@brightlayer-ui/react-auth-shared'; -import Dialog from '@mui/material/Dialog'; -import DialogTitle from '@mui/material/DialogTitle'; -import DialogContent from '@mui/material/DialogContent'; -import DialogActions from '@mui/material/DialogActions'; -import Button from '@mui/material/Button'; -import Grid from '@mui/material/Grid'; -import { useTheme } from '@mui/material/styles'; -import Divider from '@mui/material/Divider'; -import useMediaQuery from '@mui/material/useMediaQuery'; -import { ChangePasswordForm } from './ChangePasswordForm'; -import { SecureTextField } from '../SecureTextField'; -import { SimpleDialog } from '../SimpleDialog'; -import { FinishState } from '../FinishState'; -import CheckCircle from '@mui/icons-material/CheckCircle'; -import { defaultPasswordRequirements } from '../../constants'; -import { DialogButtonStyles, DialogActionsStyles, DialogContentStyles, DialogTitleStyles } from '../../styles'; - -/** - * Component that renders a change password form in a modal dialog. This dialog is automatically - * shown and hidden based on the securityState context. It can be opened by calling - * useSecurityActions().showChangePassword(). - * - * @category Component - */ -export const ChangePasswordModal: React.FC> = () => { - const { t } = useLanguageLocale(); - const securityState = useSecurityState(); - const accountUIActions = useAccountUIActions(); - const securityHelper = useSecurityActions(); - const theme = useTheme(); - const matchesSM = useMediaQuery(theme.breakpoints.down('sm')); - - const passwordRef = useRef(null); - const confirmRef = useRef(null); - - const [transitState, setTransitState] = useState(initialTransitState); - const [hasAcknowledgedError, setHasAcknowledgedError] = useState(false); - - const [currentPassword, setCurrentPassword] = useState(''); - const [password, setPassword] = useState(''); - const [confirm, setConfirm] = useState(''); - - const success = transitState.transitSuccess; - - const updateFields = useCallback( - (fields: { password: string; confirm: string }) => { - setPassword(fields.password); - setConfirm(fields.confirm); - }, - [setPassword, setConfirm] - ); - - const { passwordRequirements = defaultPasswordRequirements(t) } = useInjectedUIContext(); - - const areValidMatchingPasswords = useCallback((): boolean => { - for (let i = 0; i < passwordRequirements.length; i++) { - if (!new RegExp(passwordRequirements[i].regex).test(password)) return false; - } - return confirm === password; - }, [passwordRequirements, password, confirm]); - - const changePassword = useCallback(async (): Promise => { - try { - setHasAcknowledgedError(false); - setTransitState(transitStart()); - await accountUIActions.actions.changePassword(currentPassword, password); - setTransitState(transitSuccess()); - } catch (error) { - if (error instanceof Error) { - setTransitState(transitFailed(error.message)); - throw error; - } else throw error; - } - }, [accountUIActions, currentPassword, password]); - - // Dynamically change the body content based on successful change - let body: JSX.Element; - if (success) { - body = ( - } - title={t('blui:CHANGE_PASSWORD.PASSWORD_CHANGED')} - description={t('blui:CHANGE_PASSWORD.SUCCESS_MESSAGE')} - /> - ); - } else { - body = ( - { - if ( - transitState.transitInProgress || - (!transitState.transitSuccess && (currentPassword === '' || !areValidMatchingPasswords())) - ) - return; - void changePassword(); - }} - > - ): void => setCurrentPassword(evt.target.value)} - onKeyPress={(e): void => { - if (e.key === 'Enter' && passwordRef.current) { - passwordRef.current.focus(); - } - }} - /> - - ); - } - - const errorDialog = ( - { - setHasAcknowledgedError(true); - }} - /> - ); - - const resetForm = useCallback(() => { - setTransitState(initialTransitState); - setCurrentPassword(''); - setPassword(''); - setConfirm(''); - }, [setTransitState, setCurrentPassword, setPassword, setConfirm]); - - return ( - - {errorDialog} - {t('blui:CHANGE_PASSWORD.PASSWORD')} - {body} - - - - {!success && ( - - )} - - - - - ); -}; diff --git a/login-workflow/src/components/password/PasswordRequirements.tsx b/login-workflow/src/components/password/PasswordRequirements.tsx deleted file mode 100644 index 098cc06d..00000000 --- a/login-workflow/src/components/password/PasswordRequirements.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import React, { HTMLAttributes } from 'react'; -import { useInjectedUIContext, useLanguageLocale } from '@brightlayer-ui/react-auth-shared'; -import { PasswordRequirementsCheck } from './PasswordRequirementsCheck'; -import { defaultPasswordRequirements } from '../../constants'; -import Box from '@mui/material/Box'; -import { SxProps, Theme } from '@mui/material/styles'; - -export type PasswordRequirementsProps = HTMLAttributes & { - passwordText: string; - sx?: SxProps; -}; - -/** - * Component that renders all of the password requirement line items with check indicators. - * - * @param passwordText The string to conduct the complexity checks against - * - * @category Component - */ -export const PasswordRequirements: React.FC< - React.PropsWithChildren> -> = (props) => { - const { passwordText, ...otherProps } = props; - const { t } = useLanguageLocale(); - const { passwordRequirements = defaultPasswordRequirements(t) } = useInjectedUIContext(); - - return ( - - {passwordRequirements.map((req, ind) => ( - - ))} - - ); -}; diff --git a/login-workflow/src/components/password/index.ts b/login-workflow/src/components/password/index.ts deleted file mode 100644 index baaf049b..00000000 --- a/login-workflow/src/components/password/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { ChangePasswordForm } from './ChangePasswordForm'; -export { ChangePasswordModal } from './ChangePasswordModal'; -export { PasswordRequirements } from './PasswordRequirements'; -export { PasswordRequirementsCheck } from './PasswordRequirementsCheck'; diff --git a/login-workflow/src/components/svgTransform.js b/login-workflow/src/components/svgTransform.js deleted file mode 100644 index 829b334f..00000000 --- a/login-workflow/src/components/svgTransform.js +++ /dev/null @@ -1,12 +0,0 @@ -const path = require('path'); - -module.exports = { - process(sourceText, sourcePath, options) { - return { - code: `module.exports = ${JSON.stringify(path.basename(sourcePath))};`, - }; - }, - getCacheKey() { - return 'svgTransform'; - }, -}; diff --git a/login-workflow/src/constants/index.ts b/login-workflow/src/constants/index.ts index 18fcf7a1..5bdde6dd 100644 --- a/login-workflow/src/constants/index.ts +++ b/login-workflow/src/constants/index.ts @@ -1,31 +1,42 @@ -import { - PasswordRequirement, - LENGTH_REGEX, - NUMBERS_REGEX, - UPPER_CASE_REGEX, - LOWER_CASE_REGEX, - SPECIAL_CHAR_REGEX, -} from '@brightlayer-ui/react-auth-shared'; +import { PasswordRequirement } from '../components'; + +export const EMAIL_REGEX = /^[A-Z0-9._%+'-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i; +export const USERNAME_REGEX = /^[^\r\n\t\f\v ]+$/; + +///////////////////////////////////////////////////////////////////////////////////// +// NOTE: The following Regular expressions are used for the +// password validation logic. It is critical that they not +// be "global" regexes (no 'g' after the last slash). Global +// regexes maintain state when their .test() function is called. +// We don't want that. +export const SPECIAL_CHAR_REGEX = /[!"#$%&'()*+,-./:;<=>?@[\]^`{|}~]+/; +export const LENGTH_REGEX = /^.{8,16}$/; +export const NUMBERS_REGEX = /[0-9]+/; +export const UPPER_CASE_REGEX = /[A-Z]+/; +export const LOWER_CASE_REGEX = /[a-z]+/; +///////////////////////////////////////////////////////////////////////////////////// export const defaultPasswordRequirements = (t: (input: string) => string): PasswordRequirement[] => [ { regex: LENGTH_REGEX, - description: t('blui:PASSWORD_REQUIREMENTS.LENGTH'), + description: t('bluiCommon:PASSWORD_REQUIREMENTS.LENGTH'), }, { regex: NUMBERS_REGEX, - description: t('blui:PASSWORD_REQUIREMENTS.NUMBERS'), + description: t('bluiCommon:PASSWORD_REQUIREMENTS.NUMBERS'), }, { regex: UPPER_CASE_REGEX, - description: t('blui:PASSWORD_REQUIREMENTS.UPPER'), + description: t('bluiCommon:PASSWORD_REQUIREMENTS.UPPER'), }, { regex: LOWER_CASE_REGEX, - description: t('blui:PASSWORD_REQUIREMENTS.LOWER'), + description: t('bluiCommon:PASSWORD_REQUIREMENTS.LOWER'), }, { regex: SPECIAL_CHAR_REGEX, - description: t('blui:PASSWORD_REQUIREMENTS.SPECIAL'), + description: t('bluiCommon:PASSWORD_REQUIREMENTS.SPECIAL'), }, ]; + +export const SAMPLE_EULA = `THIS EULA IS ONLY BETWEEN EATON CORPORATION (“EATON”) AND THE END USER TO WHICH THE EATON WEB APPLICATION (THE “APP”) IS PROVIDED (“YOU”). BY ACCESSING, OR USING THE APP, YOU AGREE TO BE BOUND BY THIS EULA. IF YOU DO NOT AGREE WITH THE EULA, THEN DO NOT USE THIS APP.\n\nSubject to your acceptance of this EULA, Eaton grants you, a limited, nonexclusive, nontransferable, revocable license to access and use the App via the Internet for your personal and noncommercial purposes and as permitted by the Terms of Use. Eaton is the licensor of the App. You may not modify, reverse engineer, decompile, or disassemble the App, in whole or in part, or create any derivative works from or sublicense any rights in the App, unless otherwise expressly authorized in writing by Eaton. You may not translate or otherwise attempt to create the source code from the App, or rent, lease, grant a security interest in, or otherwise transfer any rights to, copy, distribute, transmit, display, perform, reproduce, publish, license, or transfer the App, or remove or alter any trademark, logo, ©, patent or other proprietary notices in the App. The App is protected by © and other intellectual property laws and treaties. Unless expressly stated in this EULA, Eaton owns all title, © and other intellectual property and proprietary rights in and to the App, and the App is licensed and not sold. You acknowledge and agree that Eaton will have no liability to you for any intellectual property infringement or violation, or for violation of this EULA or any license, arising out of or resulting from the use of the App in combination with any other product or service not approved or supplied by Eaton, or modification of the App by you or for you. If you breach this EULA, Eaton may immediately terminate this EULA, whereupon you shall immediately cease using the App. By accepting this EULA, you will have the right pursuant to this EULA to access and use the App. By using this App you will be required to provide Eaton certain personal data in accordance with the Eaton Privacy Policy (“Privacy Policy”). This data includes, but is not limited to: (a) first and last name, (b) phone number, (c) email address, (d) shopping and/or product preferences and history, (e) purchase history, and (f) device data including, but not limited to, Internet Protocol address, location data, Operating System version, and language (“Personal Data”). If you register for the App through a social profile such as Facebook or Google+, tallyo may also process and store your social network profile, which may include, but is not limited to, additional Personal Data that you choose to make accessible to Eaton such as (x) friend or contact names, (y) date of birth, and (z) likes and dislikes. You hereby agree to allow Eaton and the App to access, store and use any information directly related to the App, including, without limitation, Personal Data. Eaton agrees to comply with all applicable privacy laws in connection with its collection, storage and use of Personal Data. The Privacy Policy is incorporated herein by reference All rights not expressly granted to you are retained by Eaton. You must comply with applicable third party terms of agreement when using the App. In the event of a breach of this EULA by Eaton, Eaton's entire liability and your exclusive remedy shall be repair or replacement of the App, except that such remedy will not be available if any problem with the App arises from your violation of this EULA, accident, abuse, misapplication, abnormal or unauthorized access or use, or introduction of a virus or malicious code by a person other than Eaton. Eaton or its suppliers are solely responsible for providing maintenance and support services with respect to the App (Support Services). Support Services are governed by the policies and programs described in the Eaton-provided materials or as required under applicable law. Any software code provided to you as part of the Support Services is part of the App and subject to this EULA. You agree that access to and use of the App will not be provided by you or any employee or agent of you to any citizen of a country to which access or use thereof is barred, or to which exports or shipments are barred, by the US government, and that you will not ship, transfer or export the App into any country or use it in any manner prohibited by the United States Export Administration Act or any other export laws, restrictions or regulations (Export Laws). You represent and warrant that you are not located in or a citizen of a country that is subject to a US government embargo, that you are not listed on any US government list of prohibited or restricted parties, and that you are not otherwise prohibited under the Export Laws from receiving access to or using the App. ACCESS TO AND USE OF THE APP IS PROVIDED “AS IS.” ALTHOUGH THE APP IS BELIEVED TO BE ACCURATE, IT IS FOR INFORMATIONAL PURPOSES ONLY. YOU ASSUME TOTAL RESPONSIBILITY AND RISK FOR USE OF THE APP. EATON DOES NOT GUARANTEE CONTINUOUS, UNINTERRUPTED OR SECURE ACCESS TO OR USE OF THE APP. NO WARRANTY OR CONDITION, EXPRESS OR IMPLIED, IS MADE WITH RESPECT TO THE APP, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE PARTIES AGREE THAT EATON IS NOT PROVIDING ANY WARRANTY OR OTHER ASSURANCE THAT THE APP IS FREE OF THE RIGHTFUL CLAIM OF ANY THIRD PARTY BY WAY OF INFRINGEMENT OR OTHERWISE. EATON SHALL NOT BE LIABLE TO YOU FOR SPECIAL, INCIDENTAL, CONSEQUENTIAL, EXEMPLARY OR OTHER DAMAGES RESULTING FROM ACCESS TO OR USE OF THE APP, HOWEVER CAUSED. IN NO EVENT SHALL EATON’S TOTAL LIABILITY ARISING IN CONNECTION WITH OR UNDER THIS EULA EXCEED THE TOTAL FEES ACTUALLY PAID TO EATON BY YOU UNDER THIS EULA. This EULA will be construed in accordance with the substantive laws of the State of Ohio, without regard to its principles of conflicts of law. This EULA contains the entire understanding between you and Eaton regarding its subject matter and supersedes all prior agreements between you and Eaton (oral or written) regarding such subject matter. This EULA may be modified from time to time by Eaton. Any waiver of any provision must be in writing. If any provision of this EULA is found illegal or unenforceable, the remaining provisions will remain in full force and effect. `; diff --git a/login-workflow/src/contexts/AuthContext/AuthContextProvider.test.tsx b/login-workflow/src/contexts/AuthContext/AuthContextProvider.test.tsx new file mode 100644 index 00000000..f180c4a6 --- /dev/null +++ b/login-workflow/src/contexts/AuthContext/AuthContextProvider.test.tsx @@ -0,0 +1,49 @@ +import React from 'react'; +import { render, cleanup, screen, renderHook } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { AuthContextProvider } from './provider'; +import { useAuthContext } from '.'; +import { authContextProviderProps } from '../../testUtils'; + +afterEach(cleanup); + +describe('AuthContextProvider', () => { + it('should render AuthContextProvider without crashing', () => { + render(Hello Auth); + + expect(screen.getByText('Hello Auth')).toBeInTheDocument(); + }); + + it('should read values from the context', () => { + const wrapper = ({ children }: any): JSX.Element => ( + {children} + ); + const { result } = renderHook(() => useAuthContext(), { wrapper }); + + expect(result.current.language).toBe('en'); + }); + + it('should set values in the context', () => { + const wrapper = ({ children }: any): JSX.Element => ( + + {children} + + ); + const { result } = renderHook(() => useAuthContext(), { wrapper }); + + expect(result.current.language).not.toBe('en'); + expect(result.current.language).toBe('es'); + }); + + it('should render multiple children', () => { + render( + +
Child 1
+
Child 2
+
+ ); + + expect(screen.getByText('Child 1')).toBeInTheDocument(); + expect(screen.getByText('Child 2')).toBeInTheDocument(); + }); +}); diff --git a/login-workflow/src/contexts/AuthContext/AuthDictionaries/chinese.ts b/login-workflow/src/contexts/AuthContext/AuthDictionaries/chinese.ts new file mode 100644 index 00000000..f710fcad --- /dev/null +++ b/login-workflow/src/contexts/AuthContext/AuthDictionaries/chinese.ts @@ -0,0 +1,86 @@ +import { AuthLanguageFile } from './types'; + +const resources: AuthLanguageFile = { + translation: { + FORGOT_PASSWORD: { + ERROR: '目前无法重置您的密码。', + INSTRUCTIONS: + '请输入账户邮箱地址。\n\n' + + '如果伊顿系统中存在此邮箱地址注册的账号的话,您会在{{time}}内收到我们的回复。\n\n' + + '如遇紧急账户问题,请拨打联系电话{{phone}}。', + INSTRUCTIONS_ALT: + '请输入账户邮箱地址。

' + + '如果伊顿系统中存在此邮箱地址注册的账号的话,您会在<1>{{time}}内收到我们的回复。

' + + '如遇紧急账户问题,请拨打联系电话<4>{{phone}}。', + RESET_CODE_ERROR: '您的密码重置链接无效。', + LINK_SENT: '已向{{email}}发送了密码重置链接。', + LINK_SENT_ALT: '已向<1>{{email}}发送了密码重置链接。', + RESPONSE_TIME: '一个工作日', + }, + LOGIN: { + INCORRECT_CREDENTIALS: '邮箱地址或密码错误', + INVALID_CREDENTIALS: '您的用户名或密码错误。', + GENERIC_ERROR: '当前无法处理您的请求。', + }, + PASSWORD_RESET: { + SUCCESS_MESSAGE: '已成功重置您的密码。', + FAILURE_MESSAGE: '无法重置您的密码。请稍后重试。', + }, + USER_SETTINGS: { + NAME: '姓名', + EMAIL: '邮箱地址', + PHONE_NUMBER: '手机号码', + PASSWORD: '密码', + EMAIL_NOTIFICATION: '邮件通知', + ENABLED: '启用', + ORGANIZATION: '组织', + ORGANIZATION_NAME: '组织名称', + ADDRESS: '地址', + CHANGE_PASSWORD: '修改密码', + ACCOUNT: '账号', + }, + COUNTER: '值为:{{count}}', + HEADER: { + FORGOT_PASSWORD: '忘记密码', + }, + ERROR_MESSAGES: { + '2002': '此邀请注册链接已被使用。', + '9003': '无法完成请求。请联系您的系统管理员。', + }, + CHANGE_PASSWORD: { + PASSWORD_CHANGED: '密码已修改', + PASSWORD: '修改密码', + SUCCESS_MESSAGE: '已更新您的密码。安全起见,您需要用新密码重新登录。', + EMAIL_CONFIRM_MESSAGE: '我们已向{{email}}发送确认信息。', + PASSWORD_INFO: '请输入您的新密码。请确保您的新密码符合以下列出的密码复杂度要求。', + OLD_PASSWORD: '旧密码', + ERROR_MESSAGE: '您的信息与我们系统中存储的信息不符。请尝试重新输入您的信息。', + PROBLEM_OCCURRED: '出现了一处问题:', + CONFIRM_NEW_PASSWORD: '确认新密码', + NEW_PASSWORD: '新密码', + CANCEL: '取消', + UPDATE: '更新', + }, + SETTINGS: { + TITLE: '设置', + }, + LEGAL: { + TITLE: '法律', + TERMSANDCONDITIONS: '条款及细则', + EULA: '最终用户许可协议', + OPENSOURCELICENSES: '开源协议', + }, + USER_MENU: { + LOG_OUT: '登出', + CONTACT_US: '联系我们', + ACCOUNT_SETTING: '账号设置', + }, + CONTACT_SUPPORT: { + GENERAL_QUESTIONS: '一般问题', + SUPPORT_MESSAGE: '如果您有疑问、建议或需要协助,欢迎用邮件联系我们:', + EMERGENCY_SUPPORT: '紧急协助', + TECHNICAL_ASSISTANCE: '如需技术协助,请拨打', + }, + }, +}; +export default resources; diff --git a/login-workflow/src/contexts/AuthContext/AuthDictionaries/english.ts b/login-workflow/src/contexts/AuthContext/AuthDictionaries/english.ts new file mode 100644 index 00000000..ab951221 --- /dev/null +++ b/login-workflow/src/contexts/AuthContext/AuthDictionaries/english.ts @@ -0,0 +1,89 @@ +import { AuthLanguageFile } from './types'; + +const resources: AuthLanguageFile = { + translation: { + FORGOT_PASSWORD: { + ERROR: 'Could not reset your password at this time.', + INSTRUCTIONS: + 'Please enter the account email associated with the account.\n\n' + + 'If this email has an account with Eaton, you will receive a response within {{time}}.\n\n' + + 'For urgent account issues, please call {{phone}}.', + INSTRUCTIONS_ALT: + 'Please enter the account email associated with the account.

' + + 'If this email has an account with Eaton, you will receive a response within <1>{{time}}.

' + + 'For urgent account issues, please call <4>{{phone}}.', + RESET_CODE_ERROR: 'There was an error with your reset code. ', + LINK_SENT: 'A link to reset your password has been sent to {{email}}.', + LINK_SENT_ALT: 'A link to reset your password has been sent to <1>{{email}}.', + RESPONSE_TIME: 'one business day', + }, + LOGIN: { + INCORRECT_CREDENTIALS: 'Incorrect Email or Password', + INVALID_CREDENTIALS: 'Your username/password combination is not recognized.', + GENERIC_ERROR: 'Your request could not be processed at this time.', + }, + PASSWORD_RESET: { + SUCCESS_MESSAGE: 'Your password was successfully reset.', + FAILURE_MESSAGE: 'Your password was unable to be reset. Please try again later.', + }, + USER_SETTINGS: { + NAME: 'Name', + EMAIL: 'Email', + PHONE_NUMBER: 'Phone Number', + PASSWORD: 'Password', + EMAIL_NOTIFICATION: 'Email Notification', + ENABLED: 'Enabled', + ORGANIZATION: 'Organization', + ORGANIZATION_NAME: 'Organization Name', + ADDRESS: 'Address', + CHANGE_PASSWORD: 'Change Password', + ACCOUNT: 'Account', + }, + COUNTER: 'The value is: {{count}}', + HEADER: { + FORGOT_PASSWORD: 'Forgot Password', + }, + ERROR_MESSAGES: { + '2002': 'User registration link is already redeemed.', + '9003': 'Requested operation cannot be performed, please contact your administrator', + }, + CHANGE_PASSWORD: { + PASSWORD_CHANGED: 'Password Changed', + PASSWORD: 'Change Password', + SUCCESS_MESSAGE: + "Your password was successfully updated! To ensure your account's security, you will need to log in to the application with your updated credentials.", + EMAIL_CONFIRM_MESSAGE: 'We have sent a confirmation email to {{email}}', + PASSWORD_INFO: + 'Please select a password. Make sure that your password meets the necessary complexity requirements outlined below.', + OLD_PASSWORD: 'Old Password', + ERROR_MESSAGE: + 'Your information did not match our records. Please re- enter your information to try again.', + PROBLEM_OCCURRED: 'A problem occurred:', + CONFIRM_NEW_PASSWORD: 'Confirm New Password', + NEW_PASSWORD: 'New Password', + CANCEL: 'Cancel', + UPDATE: 'Update', + }, + SETTINGS: { + TITLE: 'Settings', + }, + LEGAL: { + TITLE: 'Legal', + TERMSANDCONDITIONS: 'Terms and Conditions', + EULA: 'End User License Agreement', + OPENSOURCELICENSES: 'Open Source Licenses', + }, + USER_MENU: { + LOG_OUT: 'Log Out', + CONTACT_US: 'Contact Us', + ACCOUNT_SETTING: 'Account Settings', + }, + CONTACT_SUPPORT: { + GENERAL_QUESTIONS: 'General Questions', + SUPPORT_MESSAGE: 'For questions, feedback, or support please email us at ', + EMERGENCY_SUPPORT: 'Emergency Support', + TECHNICAL_ASSISTANCE: 'For technical support, please call ', + }, + }, +}; +export default resources; diff --git a/login-workflow/src/contexts/AuthContext/AuthDictionaries/french.ts b/login-workflow/src/contexts/AuthContext/AuthDictionaries/french.ts new file mode 100644 index 00000000..1c0e6f7b --- /dev/null +++ b/login-workflow/src/contexts/AuthContext/AuthDictionaries/french.ts @@ -0,0 +1,89 @@ +import { AuthLanguageFile } from './types'; + +const resources: AuthLanguageFile = { + translation: { + FORGOT_PASSWORD: { + ERROR: "Impossible de réinitialiser votre mot de passe pour l'instant", + INSTRUCTIONS: + "Entrez l'adresse e-mail du compte associée au compte.\n\n" + + 'Si ce courrier électronique a un compte chez Eaton, vous recevrez une réponse sous {{time}}.\n\n' + + 'Pour les problèmes de compte urgents, veuillez appeler le {{phone}}.', + INSTRUCTIONS_ALT: + `Entrez l'adresse e-mail du compte associée au compte.

` + + `Si ce courrier électronique a un compte chez Eaton, vous recevrez une réponse sous <1>{{time}}.

` + + `Pour les problèmes de compte urgents, veuillez appeler le <4>{{phone}}.`, + RESET_CODE_ERROR: `Une erreur s'est produite avec votre code de réinitialisation. `, + LINK_SENT: 'Un lien pour réinitialiser votre mot de passe a été envoyé à {{email}}.', + LINK_SENT_ALT: 'Un lien pour réinitialiser votre mot de passe a été envoyé à <1>{{email}}.', + RESPONSE_TIME: 'un jour ouvrable', + }, + LOGIN: { + INCORRECT_CREDENTIALS: 'Email ou mot de passe incorrect', + INVALID_CREDENTIALS: "Votre combinaison nom d'utilisateur / mot de passe n'est pas reconnue.", + GENERIC_ERROR: "Votre demande n'a pas pu être traitée pour le moment.\n", + }, + PASSWORD_RESET: { + SUCCESS_MESSAGE: 'Votre mot de passe a été réinitialisé avec succès', + FAILURE_MESSAGE: `Votre mot de passe n'a pas pu être réinitialisé. Veuillez réessayer plus tard.`, + }, + USER_SETTINGS: { + NAME: 'Nom', + EMAIL: 'Email', + PHONE_NUMBER: 'Numéro de téléphone', + PASSWORD: 'Mot de passe', + EMAIL_NOTIFICATION: 'Notification par e-mail', + ENABLED: 'Activée', + ORGANIZATION: 'Organisation', + ORGANIZATION_NAME: "nom de l'organisation", + ADDRESS: 'Adresse', + CHANGE_PASSWORD: 'changer le mot de passe', + ACCOUNT: 'Compte', + }, + COUNTER: 'La valeur est: {{count}}', + HEADER: { + FORGOT_PASSWORD: 'Mot de passe oublié?', + }, + ERROR_MESSAGES: { + '2002': "Le lien d'enregistrement de l'utilisateur est déjà utilisé.", + '9003': "L'opération demandée ne peut pas être effectuée, veuillez contacter votre administrateur", + }, + CHANGE_PASSWORD: { + PASSWORD_CHANGED: 'Mot de passe changé', + PASSWORD: 'Changer le mot de passe', + SUCCESS_MESSAGE: + "Votre mot de passe a été mis à jour avec succès! Pour garantir la sécurité de votre compte, vous devrez vous connecter à l'application avec vos informations d'identification mises à jour.", + EMAIL_CONFIRM_MESSAGE: 'Nous avons envoyé un e-mail de confirmation à {{email}}', + PASSWORD_INFO: `Veuillez sélectionner un mot de passe. Assurez-vous que votre mot de passe répond aux exigences de complexité nécessaires décrites ci-dessous.`, + OLD_PASSWORD: 'ancien mot de passe', + ERROR_MESSAGE: + 'Vos informations ne correspondent pas à nos enregistrements. Veuillez saisir à nouveau vos informations pour réessayer.', + PROBLEM_OCCURRED: 'Un problème est survenu:', + CONFIRM_NEW_PASSWORD: 'Confirmer le nouveau mot de passe', + NEW_PASSWORD: 'Nouveau mot de passe', + CANCEL: 'Annuler', + UPDATE: 'Mise à jour', + }, + SETTINGS: { + TITLE: 'Réglages', + }, + LEGAL: { + TITLE: 'Légale', + TERMSANDCONDITIONS: 'Termes et conditions', + EULA: "Contrat de licence de l'utilisateur final", + OPENSOURCELICENSES: 'Licences Open Source', + }, + USER_MENU: { + LOG_OUT: 'Se déconnecter', + CONTACT_US: 'Nous contacter', + ACCOUNT_SETTING: 'Paramètres du compte', + }, + CONTACT_SUPPORT: { + GENERAL_QUESTIONS: 'Questions générales', + SUPPORT_MESSAGE: + 'Pour les questions, commentaires ou assistance par e-mail, veuillez nous envoyer un e-mail à ', + EMERGENCY_SUPPORT: `Assistance d'urgence`, + TECHNICAL_ASSISTANCE: 'Pour une assistance technique, veuillez appeler ', + }, + }, +}; +export default resources; diff --git a/login-workflow/src/contexts/AuthContext/AuthDictionaries/index.ts b/login-workflow/src/contexts/AuthContext/AuthDictionaries/index.ts new file mode 100644 index 00000000..dfd43500 --- /dev/null +++ b/login-workflow/src/contexts/AuthContext/AuthDictionaries/index.ts @@ -0,0 +1,19 @@ +import english from './english'; +import french from './french'; +import spanish from './spanish'; +import chinese from './chinese'; +import portuguese from './portuguese'; + +export { default as english } from './english'; +export { default as french } from './french'; +export { default as spanish } from './spanish'; +export { default as chinese } from './chinese'; +export { default as portuguese } from './portuguese'; + +export const AuthDictionaries = { + english: english, + french: french, + spanish: spanish, + chinese: chinese, + portuguese: portuguese, +}; diff --git a/login-workflow/src/contexts/AuthContext/AuthDictionaries/portuguese.ts b/login-workflow/src/contexts/AuthContext/AuthDictionaries/portuguese.ts new file mode 100644 index 00000000..666a9c1b --- /dev/null +++ b/login-workflow/src/contexts/AuthContext/AuthDictionaries/portuguese.ts @@ -0,0 +1,89 @@ +import { AuthLanguageFile } from './types'; + +const resources: AuthLanguageFile = { + translation: { + FORGOT_PASSWORD: { + ERROR: 'De momento, não foi possível redefinir a sua palavra-passe.', + INSTRUCTIONS: + 'Por favor, insira o e-mail associado com a conta.\n\n' + + 'Se este e-mail tem uma conta com a Eaton, irá receber uma resposta dentro de <1>{{time}}.\n\n' + + 'Para assuntos urgentes relacionados com a sua conta, por favor contacte <4>{{phone}}.', + INSTRUCTIONS_ALT: + 'Por favor, insira o e-mail associado com a conta.

' + + 'Se este e-mail tem uma conta com a Eaton, irá receber uma resposta dentro de <1>{{time}}.\n\n' + + 'Para assuntos urgentes relacionados com a sua conta, por favor contacte <4>{{phone}}.', + RESET_CODE_ERROR: 'Houve um problema com o código de redefinição.', + LINK_SENT: 'Um link para redefinir a palavra-passe foi enviado para {{email}}.', + LINK_SENT_ALT: 'Um link para redefinir a palavra-passe foi enviado para <1>{{email}}.', + RESPONSE_TIME: 'um dia útil', + }, + LOGIN: { + INCORRECT_CREDENTIALS: 'E-mail ou palavra-passe incorretos.', + INVALID_CREDENTIALS: 'A combinação nome de utilizador/palavra-passe não é reconhecível', + GENERIC_ERROR: 'De momento, o seu pedido não pôde ser processado.', + }, + PASSWORD_RESET: { + SUCCESS_MESSAGE: 'A sua palavra-passe foi corretamente redefinida.', + FAILURE_MESSAGE: 'A redefinição da sua palavra-passe falhou. Por favor, tente novamente mais tarde.', + }, + USER_SETTINGS: { + NAME: 'Nome', + EMAIL: 'E-mail', + PHONE_NUMBER: 'Número de Telefone', + PASSWORD: 'Palavra-passe', + EMAIL_NOTIFICATION: 'Notificação de E-mail', + ENABLED: 'Permitido', + ORGANIZATION: 'Organização', + ORGANIZATION_NAME: 'Nome da Organização', + ADDRESS: 'Morada', + CHANGE_PASSWORD: 'Alterar palavra-passe', + ACCOUNT: 'Conta', + }, + COUNTER: 'O valor é: {{count}}', + HEADER: { + FORGOT_PASSWORD: 'Esquecer palavra-passe', + }, + ERROR_MESSAGES: { + '2002': 'Link para registo de novo utilizador recuperado.', + '9003': 'Não é possível concluir a operação requisitada, por favor contacte o administrador.', + }, + CHANGE_PASSWORD: { + PASSWORD_CHANGED: 'Palavra-passe alterada', + PASSWORD: 'Alterar Palavra-passe', + SUCCESS_MESSAGE: + 'A sua palavra-passe foi atualizada! Para assegurar a segurança da sua conta, terá de iniciar sessão na aplicação com as suas credenciais atualizadas.', + EMAIL_CONFIRM_MESSAGE: 'Enviámos um e-mail de confirmação para {{email}}', + PASSWORD_INFO: + 'Por favor selecione uma palavra-passe. Certifique-se de que sua senha atenda aos requisitos de complexidade necessários descritos abaixo.', + OLD_PASSWORD: 'Palavra-passe anterior', + ERROR_MESSAGE: + 'A sua informação não corresponde aos nossos registos. Por favor, confirme as informações e tente de novo.', + PROBLEM_OCCURRED: 'Ocorreu um problema:', + CONFIRM_NEW_PASSWORD: 'Confirmar nova palavra-passe', + NEW_PASSWORD: 'Nova Palavra-passe', + CANCEL: 'Cancelar', + UPDATE: 'Atualizar', + }, + SETTINGS: { + TITLE: 'Definições', + }, + LEGAL: { + TITLE: 'Legal', + TERMSANDCONDITIONS: 'Termos e Condições', + EULA: 'Contrato de Licença de Utilizador Final', + OPENSOURCELICENSES: 'Licenças Código Aberto', + }, + USER_MENU: { + LOG_OUT: 'Terminar Sessão', + CONTACT_US: 'Contacte-nos', + ACCOUNT_SETTING: 'Definições de Conta', + }, + CONTACT_SUPPORT: { + GENERAL_QUESTIONS: 'Questões Gerais', + SUPPORT_MESSAGE: 'Para questões, comentários, ou apoio técnico, por favor envie um e-mail para ', + EMERGENCY_SUPPORT: 'Apoio de Emergência', + TECHNICAL_ASSISTANCE: 'Para apoio técnico, por favor contacte ', + }, + }, +}; +export default resources; diff --git a/login-workflow/src/contexts/AuthContext/AuthDictionaries/spanish.ts b/login-workflow/src/contexts/AuthContext/AuthDictionaries/spanish.ts new file mode 100644 index 00000000..b24bd838 --- /dev/null +++ b/login-workflow/src/contexts/AuthContext/AuthDictionaries/spanish.ts @@ -0,0 +1,88 @@ +import { AuthLanguageFile } from './types'; + +const resources: AuthLanguageFile = { + translation: { + FORGOT_PASSWORD: { + ERROR: 'No se pudo restablecer su contraseña en este momento.', + INSTRUCTIONS: + 'Por favor ingrese el correo electrónico de la cuenta asociado con la cuenta.\n\n' + + 'Si este correo electrónico tiene una cuenta con Eaton, recibirá una respuesta dentro de {{time}} .\n\n' + + 'Para problemas urgentes con la cuenta, llame al {{phone}}.', + INSTRUCTIONS_ALT: + 'Por favor ingrese el correo electrónico de la cuenta asociado con la cuenta.

' + + 'Si este correo electrónico tiene una cuenta con Eaton, recibirá una respuesta dentro de <1> {{time}} .

' + + 'Para problemas urgentes con la cuenta, llame al <4> {{phone}} .', + RESET_CODE_ERROR: 'Hubo un error con su código de reinicio. ', + LINK_SENT: 'Se envió un vínculo para restablecer su contraseña a {{email}} .', + LINK_SENT_ALT: 'Se envió un vínculo para restablecer su contraseña a <1> {{email}} .', + RESPONSE_TIME: 'un día hábil', + }, + LOGIN: { + INCORRECT_CREDENTIALS: 'Correo electrónico o contraseña incorrectos', + INVALID_CREDENTIALS: 'No se reconoce su combinación de nombre de usuario / contraseña.', + GENERIC_ERROR: 'Su solicitud no se pudo procesar en este momento.', + }, + PASSWORD_RESET: { + SUCCESS_MESSAGE: 'Tu contraseña se restableció correctamente.', + FAILURE_MESSAGE: 'No se pudo restablecer su contraseña. Por favor, inténtelo de nuevo más tarde.', + }, + USER_SETTINGS: { + NAME: 'Nombre', + EMAIL: 'Correo electrónico', + PHONE_NUMBER: 'Número de teléfono', + PASSWORD: 'Contraseña', + EMAIL_NOTIFICATION: 'Notificación por correo electrónico', + ENABLED: 'Habilitado', + ORGANIZATION: 'Organización', + ORGANIZATION_NAME: 'Nombre de la organización', + ADDRESS: 'Dirección', + CHANGE_PASSWORD: 'Cambiar contraseña', + ACCOUNT: 'Cuenta', + }, + COUNTER: 'El valor es: {{count}}', + HEADER: { + FORGOT_PASSWORD: 'Olvidé mi contraseña', + }, + ERROR_MESSAGES: { + '2002': 'El enlace de registro de usuario ya está canjeado.', + '9003': 'No se puede realizar la operación solicitada, por favor contacte su administrador', + }, + CHANGE_PASSWORD: { + PASSWORD_CHANGED: 'Contraseña cambiada', + PASSWORD: 'Cambiar contraseña', + SUCCESS_MESSAGE: + '¡Su contraseña se actualizó correctamente! Para garantizar la seguridad de su cuenta, deberá iniciar sesión en la aplicación con sus credenciales actualizadas.', + EMAIL_CONFIRM_MESSAGE: 'Hemos enviado un correo electrónico de confirmación a {{email}} ', + PASSWORD_INFO: + 'Por favor, seleccione una contraseña. Asegúrese de que su contraseña cumple con los requisitos de complejidad necesarios que se describen a continuación. ', + OLD_PASSWORD: 'Contraseña anterior', + ERROR_MESSAGE: `Su información no coincide con nuestros registros. Vuelva a ingresar su información para volver a intentarlo.`, + PROBLEM_OCCURRED: 'Ocurrió un problema:', + CONFIRM_NEW_PASSWORD: 'Confirmar nueva contraseña', + NEW_PASSWORD: 'Nueva contraseña', + CANCEL: 'Cancelar', + UPDATE: 'Actualizar', + }, + SETTINGS: { + TITLE: 'Configuración', + }, + LEGAL: { + TITLE: 'Legal', + TERMSANDCONDITIONS: 'Términos y condiciones', + EULA: 'Acuerdo de licencia de usuario final', + OPENSOURCELICENSES: 'Licencias de código abierto', + }, + USER_MENU: { + LOG_OUT: 'Cerrar sesión', + CONTACT_US: 'Contáctenos', + ACCOUNT_SETTING: 'Configuración de la cuenta', + }, + CONTACT_SUPPORT: { + GENERAL_QUESTIONS: 'Preguntas generales', + SUPPORT_MESSAGE: 'Si tiene preguntas, comentarios o necesita asistencia, envíenos un correo electrónico a ', + EMERGENCY_SUPPORT: 'Soporte de emergencia', + TECHNICAL_ASSISTANCE: 'Para obtener asistencia técnica, llame a ', + }, + }, +}; +export default resources; diff --git a/login-workflow/src/contexts/AuthContext/AuthDictionaries/types.ts b/login-workflow/src/contexts/AuthContext/AuthDictionaries/types.ts new file mode 100644 index 00000000..d3412a87 --- /dev/null +++ b/login-workflow/src/contexts/AuthContext/AuthDictionaries/types.ts @@ -0,0 +1,78 @@ +export type AuthTranslations = { + FORGOT_PASSWORD: { + ERROR: string; + INSTRUCTIONS: string; + INSTRUCTIONS_ALT: string; + RESET_CODE_ERROR: string; + LINK_SENT: string; + LINK_SENT_ALT: string; + RESPONSE_TIME: string; + }; + LOGIN: { + INCORRECT_CREDENTIALS: string; + INVALID_CREDENTIALS: string; + GENERIC_ERROR: string; + }; + PASSWORD_RESET: { + SUCCESS_MESSAGE: string; + FAILURE_MESSAGE: string; + }; + USER_SETTINGS: { + NAME: string; + EMAIL: string; + PHONE_NUMBER: string; + PASSWORD: string; + EMAIL_NOTIFICATION: string; + ENABLED: string; + ORGANIZATION: string; + ORGANIZATION_NAME: string; + ADDRESS: string; + CHANGE_PASSWORD: string; + ACCOUNT: string; + }; + COUNTER: string; + HEADER: { + FORGOT_PASSWORD: string; + }; + ERROR_MESSAGES: { + '2002': string; + '9003': string; + }; + CHANGE_PASSWORD: { + PASSWORD_CHANGED: string; + PASSWORD: string; + SUCCESS_MESSAGE: string; + EMAIL_CONFIRM_MESSAGE: string; + PASSWORD_INFO: string; + OLD_PASSWORD: string; + ERROR_MESSAGE: string; + PROBLEM_OCCURRED: string; + NEW_PASSWORD: string; + CONFIRM_NEW_PASSWORD: string; + CANCEL: string; + UPDATE: string; + }; + SETTINGS: { + TITLE: string; + }; + LEGAL: { + TITLE: string; + TERMSANDCONDITIONS: string; + EULA: string; + OPENSOURCELICENSES: string; + }; + USER_MENU: { + LOG_OUT: string; + CONTACT_US: string; + ACCOUNT_SETTING: string; + }; + CONTACT_SUPPORT: { + GENERAL_QUESTIONS: string; + SUPPORT_MESSAGE: string; + EMERGENCY_SUPPORT: string; + TECHNICAL_ASSISTANCE: string; + }; +}; +export type AuthLanguageFile = { + translation: AuthTranslations; +}; diff --git a/login-workflow/src/contexts/AuthContext/context.ts b/login-workflow/src/contexts/AuthContext/context.ts new file mode 100644 index 00000000..3e15e1cd --- /dev/null +++ b/login-workflow/src/contexts/AuthContext/context.ts @@ -0,0 +1,8 @@ +/** + * @packageDocumentation + * @module AuthContext + */ +import { createContext } from 'react'; +import { AuthContextProviderProps } from './types'; + +export const AuthContext = createContext(null); diff --git a/login-workflow/src/contexts/AuthContext/i18nAuthInstance.ts b/login-workflow/src/contexts/AuthContext/i18nAuthInstance.ts new file mode 100644 index 00000000..b663b0d5 --- /dev/null +++ b/login-workflow/src/contexts/AuthContext/i18nAuthInstance.ts @@ -0,0 +1,68 @@ +import i18next from 'i18next'; +import { AuthDictionaries } from './AuthDictionaries'; +import { SharedDictionaries } from '../SharedDictionaries'; + +export const i18nAuthInstance = i18next.createInstance( + { + fallbackLng: 'en', + ns: ['bluiAuth', 'bluiCommon'], + defaultNS: 'bluiAuth', + load: 'languageOnly', + detection: { + order: ['querystring', 'localStorage', 'navigator'], + caches: ['localStorage'], + }, + react: { useSuspense: false }, + interpolation: { escapeValue: false }, + resources: { + en: { + bluiAuth: { + ...AuthDictionaries.english.translation, + }, + bluiCommon: { + ...SharedDictionaries.english.translation, + }, + }, + fr: { + bluiAuth: { + ...AuthDictionaries.french.translation, + }, + bluiCommon: { + ...SharedDictionaries.french.translation, + }, + }, + es: { + bluiAuth: { + ...AuthDictionaries.spanish.translation, + }, + bluiCommon: { + ...SharedDictionaries.spanish.translation, + }, + }, + zh: { + bluiAuth: { + ...AuthDictionaries.chinese.translation, + }, + bluiCommon: { + ...SharedDictionaries.chinese.translation, + }, + }, + pt: { + bluiAuth: { + ...AuthDictionaries.portuguese.translation, + }, + bluiCommon: { + ...SharedDictionaries.portuguese.translation, + }, + }, + }, + }, + // We must provide a function as second parameter, otherwise i18next errors + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (err, _t) => { + // eslint-disable-next-line no-console + if (err) return console.log(err); + } +); + +export default { i18nAuthInstance }; diff --git a/login-workflow/src/contexts/AuthContext/index.ts b/login-workflow/src/contexts/AuthContext/index.ts new file mode 100644 index 00000000..d9217170 --- /dev/null +++ b/login-workflow/src/contexts/AuthContext/index.ts @@ -0,0 +1,25 @@ +import { useContext } from 'react'; +import { AuthContext } from './context'; +import i18nAuthInstance from './i18nAuthInstance'; +import { AuthContextProvider } from './provider'; +import { AuthContextProviderProps, AuthUIActions } from './types'; +import { AuthDictionaries } from './AuthDictionaries'; + +/** + * Hook to get top level data in authentication workflow + * + * @category Hooks + * @private + * @internal + */ +export const useAuthContext = (): AuthContextProviderProps => { + const context = useContext(AuthContext); + if (context === null) { + throw new Error('useAuthContext must be used within AuthContextProvider'); + } + return context; +}; + +export type { AuthContextProviderProps, AuthUIActions }; + +export { AuthContext, AuthContextProvider, i18nAuthInstance, AuthDictionaries }; diff --git a/login-workflow/src/contexts/AuthContext/provider.tsx b/login-workflow/src/contexts/AuthContext/provider.tsx new file mode 100644 index 00000000..296a5383 --- /dev/null +++ b/login-workflow/src/contexts/AuthContext/provider.tsx @@ -0,0 +1,48 @@ +/** + * @packageDocumentation + * @module AuthContextProvider + */ + +import React, { useEffect } from 'react'; +import { AuthContextProviderProps } from './types'; +import { AuthContext } from './context'; +import { I18nextProvider } from 'react-i18next'; +import { i18nAuthInstance } from './i18nAuthInstance'; +import { ErrorContext } from '../ErrorContext'; +import { AuthDictionaries } from './AuthDictionaries'; +import { SharedDictionaries } from '../SharedDictionaries'; + +export const AuthContextProvider: React.FC< + React.PropsWithChildren +> = (props) => { + const i18nInstance = props.i18n ?? i18nAuthInstance; + + const { children, ...authContextProps } = props; + + const { language, i18n = i18nInstance, errorConfig } = props; + + if (props.i18n) { + i18n.addResourceBundle('zh', 'bluiAuth', AuthDictionaries.chinese.translation, true, false); + i18n.addResourceBundle('zh', 'bluiCommon', SharedDictionaries.chinese.translation, true, false); + i18n.addResourceBundle('en', 'bluiAuth', AuthDictionaries.english.translation, true, false); + i18n.addResourceBundle('en', 'bluiCommon', SharedDictionaries.english.translation, true, false); + i18n.addResourceBundle('fr', 'bluiAuth', AuthDictionaries.french.translation, true, false); + i18n.addResourceBundle('fr', 'bluiCommon', SharedDictionaries.french.translation, true, false); + i18n.addResourceBundle('pt', 'bluiAuth', AuthDictionaries.portuguese.translation, true, false); + i18n.addResourceBundle('pt', 'bluiCommon', SharedDictionaries.portuguese.translation, true, false); + i18n.addResourceBundle('es', 'bluiAuth', AuthDictionaries.spanish.translation, true, false); + i18n.addResourceBundle('es', 'bluiCommon', SharedDictionaries.spanish.translation, true, false); + } + + useEffect(() => { + void i18n.changeLanguage(language); + }, [i18n, language]); + + return ( + + + {children} + + + ); +}; diff --git a/login-workflow/src/contexts/AuthContext/types.ts b/login-workflow/src/contexts/AuthContext/types.ts new file mode 100644 index 00000000..d387896a --- /dev/null +++ b/login-workflow/src/contexts/AuthContext/types.ts @@ -0,0 +1,57 @@ +/** + * @packageDocumentation + * @module AuthContext + */ + +import { i18n } from 'i18next'; +import { NavigateFunction } from 'react-router-dom'; +import { RouteConfig } from '../../types'; +import { ErrorContextProviderProps } from '../ErrorContext/types'; + +export type AuthContextProviderProps = { + /** + * Defines the API calls / functions to execute when certain actions are performed in the UI (such as pressing the Login button) + */ + actions: AuthUIActions; + + /** + * Configures the language displayed on the screens + */ + language: string; + + /** + * Function that can be called to navigate to a new route + */ + navigate: NavigateFunction; + + /** + * Object describing the URLs you are using for the relevant routes so the workflow can correctly navigate between screens + */ + routeConfig: RouteConfig; + + /** + * An optional i18n object that is used to translate the UI. This is only needed if you want to use custom translation keys / languages inside any of the workflow screens + */ + i18n?: i18n; + + rememberMeDetails?: { + /** + * Email address to show in the email field of Login after logout. + */ + email?: string; + /** + * When true, the user's email will be in the email field of Login. + */ + rememberMe?: boolean; + }; + errorConfig?: ErrorContextProviderProps; +}; + +export type AuthUIActions = { + initiateSecurity: () => Promise; + logIn: (email: string, password: string, rememberMe: boolean) => Promise; + forgotPassword: (email: string) => Promise; + verifyResetCode: (code: string, email?: string) => Promise; + setPassword: (code: string, password: string, email?: string) => Promise; + changePassword: (oldPassword: string, newPassword: string) => Promise; +}; diff --git a/login-workflow/src/contexts/ErrorContext/ErrorContextProvider.test.tsx b/login-workflow/src/contexts/ErrorContext/ErrorContextProvider.test.tsx new file mode 100644 index 00000000..64406d30 --- /dev/null +++ b/login-workflow/src/contexts/ErrorContext/ErrorContextProvider.test.tsx @@ -0,0 +1,41 @@ +import React from 'react'; +import { render, cleanup, screen, renderHook } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { ErrorContextProvider } from './provider'; +import { ErrorContextProviderProps } from './types'; +import { useErrorContext } from '.'; + +afterEach(cleanup); + +export const errorContextProviderProps: ErrorContextProviderProps = { + mode: 'dialog', +}; + +describe('ErrorContextProvider', () => { + it('should render ErrorContextProvider without crashing', () => { + render(Error); + + expect(screen.getByText('Error')).toBeInTheDocument(); + }); + + it('should read values from the context', () => { + const wrapper = ({ children }: any): JSX.Element => ( + {children} + ); + const { result } = renderHook(() => useErrorContext(), { wrapper }); + + expect(result.current.mode).toBe('dialog'); + }); + + it('should set values in the context', () => { + const wrapper = ({ children }: any): JSX.Element => ( + + {children} + + ); + const { result } = renderHook(() => useErrorContext(), { wrapper }); + + expect(result.current.mode).not.toBe('dialog'); + expect(result.current.mode).toBe('message-box'); + }); +}); diff --git a/login-workflow/src/contexts/ErrorContext/context.ts b/login-workflow/src/contexts/ErrorContext/context.ts new file mode 100644 index 00000000..c94e2cf3 --- /dev/null +++ b/login-workflow/src/contexts/ErrorContext/context.ts @@ -0,0 +1,8 @@ +/** + * @packageDocumentation + * @module ErrorContext + */ +import { createContext } from 'react'; +import { ErrorContextProviderProps } from './types'; + +export const ErrorContext = createContext(null); diff --git a/login-workflow/src/contexts/ErrorContext/index.ts b/login-workflow/src/contexts/ErrorContext/index.ts new file mode 100644 index 00000000..9b6ecc1e --- /dev/null +++ b/login-workflow/src/contexts/ErrorContext/index.ts @@ -0,0 +1,23 @@ +import { useContext } from 'react'; +import { ErrorContext } from './context'; +import { ErrorContextProvider } from './provider'; +import { ErrorContextProviderProps } from './types'; + +/** + * Hook to get top level error data + * + * @category Hooks + * @private + * @internal + */ +export const useErrorContext = (): ErrorContextProviderProps => { + const context = useContext(ErrorContext); + if (context === null) { + throw new Error('useErrorContext must be used within ErrorContextProvider'); + } + return context; +}; + +export type { ErrorContextProviderProps }; + +export { ErrorContext, ErrorContextProvider }; diff --git a/login-workflow/src/contexts/ErrorContext/provider.tsx b/login-workflow/src/contexts/ErrorContext/provider.tsx new file mode 100644 index 00000000..1bc56b92 --- /dev/null +++ b/login-workflow/src/contexts/ErrorContext/provider.tsx @@ -0,0 +1,14 @@ +/** + * @packageDocumentation + * @module ErrorContextProvider + */ + +import React from 'react'; +import { ErrorContextProviderProps } from './types'; +import { ErrorContext } from './context'; + +export const ErrorContextProvider: React.FC> = (props) => { + const { children, ...ErrorContextProps } = props; + + return {children}; +}; diff --git a/login-workflow/src/contexts/ErrorContext/types.ts b/login-workflow/src/contexts/ErrorContext/types.ts new file mode 100644 index 00000000..4df673e9 --- /dev/null +++ b/login-workflow/src/contexts/ErrorContext/types.ts @@ -0,0 +1,8 @@ +/** + * @packageDocumentation + * @module ErrorContext + */ + +import { ErrorManagerProps } from '../../components/Error/ErrorManager'; + +export type ErrorContextProviderProps = Omit; diff --git a/login-workflow/src/contexts/ErrorContext/useErrorManager.tsx b/login-workflow/src/contexts/ErrorContext/useErrorManager.tsx new file mode 100644 index 00000000..517e285c --- /dev/null +++ b/login-workflow/src/contexts/ErrorContext/useErrorManager.tsx @@ -0,0 +1,49 @@ +import { useState } from 'react'; +import { AuthError, ErrorManagerProps } from '../../components/Error'; +import { useErrorContext } from '.'; + +export const useErrorManager = (): { + triggerError: (error: Error | AuthError) => void; + errorManagerConfig: ErrorManagerProps; +} => { + const errorConfig = useErrorContext(); + const [error, setError] = useState(new Error()); + + const isAuthError = (err: Error | AuthError): err is AuthError => (err as AuthError).cause !== undefined; + + const getErrorDisplayConfig = (err: Error | AuthError): ErrorManagerProps => { + if (isAuthError(err)) { + return { + ...errorConfig, + dialogConfig: { title: err.cause.title }, + error: err.cause.errorMessage, + onClose: (): void => { + setError(new Error()); + }, + }; + } + return { + ...errorConfig, + dialogConfig: { title: 'Error' }, + error: err.message, + onClose: (): void => { + setError(new Error()); + }, + }; + }; + + const triggerError = (err: Error | AuthError): void => { + if (isAuthError(err)) { + setError({ + cause: { + title: err.cause.title, + errorMessage: err.cause.errorMessage, + }, + }); + } else { + setError(err); + } + }; + + return { triggerError: triggerError, errorManagerConfig: getErrorDisplayConfig(error) }; +}; diff --git a/login-workflow/src/contexts/RegistrationContext/RegistrationContextProvider.test.tsx b/login-workflow/src/contexts/RegistrationContext/RegistrationContextProvider.test.tsx new file mode 100644 index 00000000..047dfb0f --- /dev/null +++ b/login-workflow/src/contexts/RegistrationContext/RegistrationContextProvider.test.tsx @@ -0,0 +1,53 @@ +import React from 'react'; +import { render, cleanup, screen, renderHook } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { RegistrationContextProvider } from './provider'; +import { useRegistrationContext } from './context'; +import { registrationContextProviderProps } from '../../testUtils'; + +afterEach(cleanup); + +describe('RegistrationContextProvider', () => { + it('should render RegistrationContextProvider without crashing', () => { + render( + + Hello Registration + + ); + + expect(screen.getByText('Hello Registration')).toBeInTheDocument(); + }); + + it('should read values from the context', () => { + const wrapper = ({ children }: any): JSX.Element => ( + {children} + ); + const { result } = renderHook(() => useRegistrationContext(), { wrapper }); + + expect(result.current.language).toBe('en'); + }); + + it('should set values in the context', () => { + const wrapper = ({ children }: any): JSX.Element => ( + + {children} + + ); + const { result } = renderHook(() => useRegistrationContext(), { wrapper }); + + expect(result.current.language).not.toBe('en'); + expect(result.current.language).toBe('es'); + }); + + it('should render multiple children', () => { + render( + +
Child 1
+
Child 2
+
+ ); + + expect(screen.getByText('Child 1')).toBeInTheDocument(); + expect(screen.getByText('Child 2')).toBeInTheDocument(); + }); +}); diff --git a/login-workflow/src/contexts/RegistrationContext/RegistrationDictionaries/chinese.ts b/login-workflow/src/contexts/RegistrationContext/RegistrationDictionaries/chinese.ts new file mode 100644 index 00000000..6b71a4b6 --- /dev/null +++ b/login-workflow/src/contexts/RegistrationContext/RegistrationDictionaries/chinese.ts @@ -0,0 +1,46 @@ +import { RegistrationLanguageFile } from './types'; + +const resources: RegistrationLanguageFile = { + translation: { + REGISTRATION: { + EULA: { + LOADING: '正在加载最终用户许可协议……', + AGREE_TERMS: '我已阅读并同意条款及细则', + }, + STEPS: { + CREATE_ACCOUNT: '创建账号', + VERIFY_EMAIL: '验证邮箱', + LICENSE: '许可协议', + PASSWORD: '创建密码', + ACCOUNT_DETAILS: '账号信息', + COMPLETE: '成功建立账号!', + }, + INSTRUCTIONS: { + ACCOUNT_DETAILS: '请输入下列个人信息来完成账号注册。', + PASSWORD_INFO: '请输入您的新密码。请确保您的新密码符合以下列出的密码复杂度要求。', + }, + SUCCESS_MESSAGE: + '您已成功使用{{email}}注册了一个新账号。\n\n您的账号已被加入“{{organization}}”。', + SUCCESS_MESSAGE_ALT: + '您已成功使用<1>{{email}}注册了一个新账号。\n\n您的账号已被加入“<3>{{organization}}”。', + SUCCESS_MESSAGE_ALT_WITHOUT_EMAIL_PROVIDED: + '您已成功注册了一个新账号。\n\n您的账号已被加入“<3>{{organization}}”。', + SUCCESS_EXISTING: '您已成功建立账号。请使用您的伊顿账号邮箱和密码登录。', + FAILURE_MESSAGE: '无法完成注册。', + UNKNOWN_EMAIL: '未知邮箱地址', + UNKNOWN_ORGANIZATION: '未知组织', + }, + SELF_REGISTRATION: { + INSTRUCTIONS: `请输入下列信息以注册伊顿账号。您需要先验证您的邮箱地址。`, + VERIFY_EMAIL: { + MESSAGE: + '已向您的邮箱中发送了一封验证邮件。请点击邮件中的链接,或者在此输入邮件中的验证码。验证邮件在30分钟内有效。', + RESEND: '重新发送验证邮件', + VERIFICATION_CODE_PROMPT: '没有收到电子邮件?', + VERIFICATION: '验证码', + CODE_VALIDATOR_ERROR: '请输入有效验证码', + }, + }, + }, +}; +export default resources; diff --git a/login-workflow/src/contexts/RegistrationContext/RegistrationDictionaries/english.ts b/login-workflow/src/contexts/RegistrationContext/RegistrationDictionaries/english.ts new file mode 100644 index 00000000..81db2dbc --- /dev/null +++ b/login-workflow/src/contexts/RegistrationContext/RegistrationDictionaries/english.ts @@ -0,0 +1,48 @@ +import { RegistrationLanguageFile } from './types'; + +const resources: RegistrationLanguageFile = { + translation: { + REGISTRATION: { + EULA: { + LOADING: 'Loading End User License Agreement...', + AGREE_TERMS: 'I have read and agree to the Terms & Conditions', + }, + STEPS: { + CREATE_ACCOUNT: 'Create an Account', + VERIFY_EMAIL: 'Verify Email', + LICENSE: 'License Agreement', + PASSWORD: 'Create Password', + ACCOUNT_DETAILS: 'Account Details', + COMPLETE: 'Account Created!', + }, + INSTRUCTIONS: { + ACCOUNT_DETAILS: 'Enter your details below to complete account creation.', + PASSWORD_INFO: + 'Please select a password. Make sure that your password meets the necessary complexity requirements outlined below.', + }, + SUCCESS_MESSAGE: + 'Your account has been successfully created with the email {{email}}.\n\nYour account has already been added to the {{organization}} organization.', + SUCCESS_MESSAGE_ALT: + 'Your account has been successfully created with the email <1>{{email}}.\n\nYour account has already been added to the <3>{{organization}} organization.', + SUCCESS_MESSAGE_ALT_WITHOUT_EMAIL_PROVIDED: + 'Your account has been successfully created.\n\nYour account has already been added to the <3>{{organization}} organization.', + SUCCESS_EXISTING: + 'Your account has been successfully created. Please log in with your Eaton account email and password.', + FAILURE_MESSAGE: 'We were unable to complete your registration.', + UNKNOWN_EMAIL: 'Unknown Email', + UNKNOWN_ORGANIZATION: 'Unknown Organization', + }, + SELF_REGISTRATION: { + INSTRUCTIONS: `To register for an Eaton account, enter the required information below. You will need to verify your email address to continue.`, + VERIFY_EMAIL: { + MESSAGE: + 'A verification code has been sent to the email address you provided. Click the link or enter the code below to continue. This code is valid for 30 minutes.', + RESEND: 'Resend Verification Email', + VERIFICATION_CODE_PROMPT: "Didn't receive an email?", + VERIFICATION: 'Verification Code', + CODE_VALIDATOR_ERROR: 'You must provide a valid code', + }, + }, + }, +}; +export default resources; diff --git a/login-workflow/src/contexts/RegistrationContext/RegistrationDictionaries/french.ts b/login-workflow/src/contexts/RegistrationContext/RegistrationDictionaries/french.ts new file mode 100644 index 00000000..d19c98f6 --- /dev/null +++ b/login-workflow/src/contexts/RegistrationContext/RegistrationDictionaries/french.ts @@ -0,0 +1,46 @@ +import { RegistrationLanguageFile } from './types'; + +const resources: RegistrationLanguageFile = { + translation: { + REGISTRATION: { + EULA: { + LOADING: "Chargement du contrat de licence d'utilisateur final ...", + AGREE_TERMS: "J'ai lu et j'accepte les conditions générales", + }, + STEPS: { + CREATE_ACCOUNT: 'Créer un compte', + VERIFY_EMAIL: 'Vérifier les courriels', + LICENSE: 'Accord de Licence', + PASSWORD: ' Créer un Mot de Passe', + ACCOUNT_DETAILS: 'Détails du Compte', + COMPLETE: 'Compte Créé!', + }, + INSTRUCTIONS: { + ACCOUNT_DETAILS: 'Entrez vos coordonnées ci-dessous pour terminer la création du compte.', + PASSWORD_INFO: `Veuillez sélectionner un mot de passe. Assurez-vous que votre mot de passe répond aux exigences de complexité nécessaires décrites ci-dessous.`, + }, + SUCCESS_MESSAGE: + "Votre compte a été créé avec le courrier électronique {{email}}.\n\nVotre compte a déjà été ajouté à l'organisation {{organization}}.", + SUCCESS_MESSAGE_ALT: + "Votre compte a été créé avec le courrier électronique <1>{{email}}.\n\nVotre compte a déjà été ajouté à l'organisation <3>{{organization}}.", + SUCCESS_MESSAGE_ALT_WITHOUT_EMAIL_PROVIDED: + "Votre compte à été créé avec succès.\n\nVotre compte a déjà été ajouté à l'organisation <3>{{organization}}.", + SUCCESS_EXISTING: `Votre compte à été créé avec succès. Veuillez vous connecter avec l'adresse e-mail et le mot de passe de votre compte Eaton.`, + FAILURE_MESSAGE: + "Nous n'avons pas pu terminer votre inscription. Appuyez sur Continuer ci-dessous pour finir.", + UNKNOWN_EMAIL: 'Email inconnu', + UNKNOWN_ORGANIZATION: 'Organisation inconnue', + }, + SELF_REGISTRATION: { + INSTRUCTIONS: `Pour vous inscrire à un compte Eaton, entrez les informations requises ci-dessous. Vous devrez vérifier votre adresse e-mail pour continuer.`, + VERIFY_EMAIL: { + MESSAGE: `Un code de vérification a été envoyé à l'adresse e-mail que vous avez fournie. Cliquez sur le lien ou entrez le code ci-dessous pour continuer. Ce code est valable 30 minutes.`, + RESEND: `Renvoyer l'e-mail de vérification`, + VERIFICATION_CODE_PROMPT: "Vous n'avez pas reçu d'e-mail ?", + VERIFICATION: 'Code de vérification', + CODE_VALIDATOR_ERROR: 'Vous devez fournir un code valide', + }, + }, + }, +}; +export default resources; diff --git a/login-workflow/src/contexts/RegistrationContext/RegistrationDictionaries/index.ts b/login-workflow/src/contexts/RegistrationContext/RegistrationDictionaries/index.ts new file mode 100644 index 00000000..99452cd3 --- /dev/null +++ b/login-workflow/src/contexts/RegistrationContext/RegistrationDictionaries/index.ts @@ -0,0 +1,19 @@ +import english from './english'; +import french from './french'; +import spanish from './spanish'; +import chinese from './chinese'; +import portuguese from './portuguese'; + +export { default as english } from './english'; +export { default as french } from './french'; +export { default as spanish } from './spanish'; +export { default as chinese } from './chinese'; +export { default as portuguese } from './portuguese'; + +export const RegistrationDictionaries = { + english: english, + french: french, + spanish: spanish, + chinese: chinese, + portuguese: portuguese, +}; diff --git a/login-workflow/src/contexts/RegistrationContext/RegistrationDictionaries/portuguese.ts b/login-workflow/src/contexts/RegistrationContext/RegistrationDictionaries/portuguese.ts new file mode 100644 index 00000000..29a2b825 --- /dev/null +++ b/login-workflow/src/contexts/RegistrationContext/RegistrationDictionaries/portuguese.ts @@ -0,0 +1,49 @@ +import { RegistrationLanguageFile } from './types'; + +const resources: RegistrationLanguageFile = { + translation: { + REGISTRATION: { + EULA: { + LOADING: 'A carregar Contrato de Licença de Utilizador Final...', + AGREE_TERMS: 'Li e concordo com os Termos e Condições', + }, + STEPS: { + CREATE_ACCOUNT: 'Criar conta', + VERIFY_EMAIL: 'Verificar E-mail', + LICENSE: 'Licença', + PASSWORD: 'Criar palavra-passe', + ACCOUNT_DETAILS: 'Detalhes de conta', + COMPLETE: 'Conta criada!', + }, + INSTRUCTIONS: { + ACCOUNT_DETAILS: 'Introduza detalhes para concluir a criação da sua conta.', + PASSWORD_INFO: + 'Por favor selecione uma palavra-passe. Certifique-se de que sua senha atenda aos requisitos de complexidade necessários descritos abaixo.', + }, + SUCCESS_MESSAGE: + 'A sua conta foi criada corretamente com o e-mail {{email}}.\n\nA sua conta já foi adicionada à organização {{organization}}.', + SUCCESS_MESSAGE_ALT: + 'A sua conta foi criada corretamente com o e-mail <1>{{email}}.\n\nA sua conta já foi adicionada à organização <3>{{organization}}.', + SUCCESS_MESSAGE_ALT_WITHOUT_EMAIL_PROVIDED: + 'A Sua conta foi criada com sucesso.\n\nA sua conta já foi adicionada à organização <3>{{organization}}.', + SUCCESS_EXISTING: + 'A sua conta foi criada corretamente. Por favor inicie sessão com o e-mail e palavra-passe da sua conta Eaton.', + FAILURE_MESSAGE: 'Foi impossível concluir o seu registo.', + UNKNOWN_EMAIL: 'E-mail desconhecido', + UNKNOWN_ORGANIZATION: 'Organização desconhecida', + }, + SELF_REGISTRATION: { + INSTRUCTIONS: + 'Para se registar para uma conta Eaton, insira a informação obrigatória nos campos abaixo. Será necessário verificar o e-mail para continuar.', + VERIFY_EMAIL: { + MESSAGE: + 'Foi enviado um código de verificação para o e-mail que indicou. Clique no link ou preencha o campo com o código para continuar. Este código é válido durante 30 minutos.', + RESEND: 'Reenviar e-mail de verificação', + VERIFICATION_CODE_PROMPT: 'Não recebeu um e-mail?', + VERIFICATION: 'Código de verificação', + CODE_VALIDATOR_ERROR: 'Você deve fornecer um código válido', + }, + }, + }, +}; +export default resources; diff --git a/login-workflow/src/contexts/RegistrationContext/RegistrationDictionaries/spanish.ts b/login-workflow/src/contexts/RegistrationContext/RegistrationDictionaries/spanish.ts new file mode 100644 index 00000000..f6e82a5b --- /dev/null +++ b/login-workflow/src/contexts/RegistrationContext/RegistrationDictionaries/spanish.ts @@ -0,0 +1,47 @@ +import { RegistrationLanguageFile } from './types'; + +const resources: RegistrationLanguageFile = { + translation: { + REGISTRATION: { + EULA: { + LOADING: 'Cargando Acuerdo de licencia de usuario final...', + AGREE_TERMS: 'He leído y acepto los Términos y condiciones', + }, + STEPS: { + CREATE_ACCOUNT: 'Crear una cuenta', + VERIFY_EMAIL: 'Verificar correo electrónico', + LICENSE: 'Acuerdo de licencia', + PASSWORD: 'Crear contraseña', + ACCOUNT_DETAILS: 'Detalles de la cuenta', + COMPLETE: '¡Cuenta creada!', + }, + INSTRUCTIONS: { + ACCOUNT_DETAILS: 'Ingrese sus datos en seguida para completar la creación de la cuenta', + PASSWORD_INFO: + 'Por favor, seleccione una contraseña. Asegúrese de que su contraseña cumple con los requisitos de complejidad necesarios que se describen a continuación. ', + }, + SUCCESS_MESSAGE: + 'Su cuenta se ha creado correctamente con el correo electrónico {{email}} .\n\nTu cuenta ya se ha agregado a la organización {{organization}} .', + SUCCESS_MESSAGE_ALT: + 'Su cuenta se ha creado correctamente con el correo electrónico <1> {{email}} .\n\nTu cuenta ya se ha agregado a la organización <3> {{organization}} .', + SUCCESS_MESSAGE_ALT_WITHOUT_EMAIL_PROVIDED: + 'Su cuenta ha sido creada satisfactoriamente.\n\nTu cuenta ya se ha agregado a la organización <3> {{organization}} .', + SUCCESS_EXISTING: + 'Tu cuenta ha sido creada con éxito. Inicie sesión con el correo electrónico y la contraseña de su cuenta Eaton. ', + FAILURE_MESSAGE: 'No pudimos completar su registro. ', + UNKNOWN_EMAIL: 'Correo electrónico desconocido', + UNKNOWN_ORGANIZATION: 'Organización desconocida', + }, + SELF_REGISTRATION: { + INSTRUCTIONS: `Para registrarse para una cuenta Eaton, introduzca la información requerida abajo. Deberá verificar su dirección de correo electrónico para continuar.`, + VERIFY_EMAIL: { + MESSAGE: `Se ha enviado un código de verificación a la dirección de correo electrónico que proporcionó. Haga clic en el enlace o ingrese el código abajo para continuar. Este código es válido por 30 minutos.`, + RESEND: 'Reenviar correo electrónico de verificación', + VERIFICATION_CODE_PROMPT: '¿No recibiste un correo electrónico?', + VERIFICATION: 'Código de verificación', + CODE_VALIDATOR_ERROR: 'Debe proporcionar un código válido', + }, + }, + }, +}; +export default resources; diff --git a/login-workflow/src/contexts/RegistrationContext/RegistrationDictionaries/types.ts b/login-workflow/src/contexts/RegistrationContext/RegistrationDictionaries/types.ts new file mode 100644 index 00000000..dfc6d3b1 --- /dev/null +++ b/login-workflow/src/contexts/RegistrationContext/RegistrationDictionaries/types.ts @@ -0,0 +1,41 @@ +export type RegistrationTranslations = { + REGISTRATION: { + EULA: { + LOADING: string; + AGREE_TERMS: string; + }; + STEPS: { + CREATE_ACCOUNT: string; + VERIFY_EMAIL: string; + LICENSE: string; + PASSWORD: string; + ACCOUNT_DETAILS: string; + COMPLETE: string; + }; + INSTRUCTIONS: { + ACCOUNT_DETAILS: string; + PASSWORD_INFO: string; + }; + SUCCESS_MESSAGE: string; + SUCCESS_MESSAGE_ALT: string; + SUCCESS_MESSAGE_ALT_WITHOUT_EMAIL_PROVIDED: string; + SUCCESS_EXISTING: string; + FAILURE_MESSAGE: string; + UNKNOWN_EMAIL: string; + UNKNOWN_ORGANIZATION: string; + }; + SELF_REGISTRATION: { + INSTRUCTIONS: string; + VERIFY_EMAIL: { + MESSAGE: string; + RESEND: string; + VERIFICATION_CODE_PROMPT: string; + VERIFICATION: string; + CODE_VALIDATOR_ERROR: string; + }; + }; +}; + +export type RegistrationLanguageFile = { + translation: RegistrationTranslations; +}; diff --git a/login-workflow/src/contexts/RegistrationContext/context.ts b/login-workflow/src/contexts/RegistrationContext/context.ts new file mode 100644 index 00000000..8a9ff869 --- /dev/null +++ b/login-workflow/src/contexts/RegistrationContext/context.ts @@ -0,0 +1,24 @@ +/** + * @packageDocumentation + * @module RegistrationContext + */ + +import { createContext, useContext } from 'react'; +import { RegistrationContextProviderProps } from './types'; + +export const RegistrationContext = createContext(null); + +/** + * Hook to get the data of each registration workflow screen + * + * @category Hooks + * @private + * @internal + */ +export const useRegistrationContext = (): RegistrationContextProviderProps => { + const context = useContext(RegistrationContext); + if (context === null) { + throw new Error('useRegistrationContext must be used within an RegistrationContextProvider'); + } + return context; +}; diff --git a/login-workflow/src/contexts/RegistrationContext/i18nRegistrationInstance.ts b/login-workflow/src/contexts/RegistrationContext/i18nRegistrationInstance.ts new file mode 100644 index 00000000..4526a54a --- /dev/null +++ b/login-workflow/src/contexts/RegistrationContext/i18nRegistrationInstance.ts @@ -0,0 +1,68 @@ +import i18next from 'i18next'; +import { RegistrationDictionaries } from './RegistrationDictionaries'; +import { SharedDictionaries } from '../SharedDictionaries'; + +export const i18nRegistrationInstance = i18next.createInstance( + { + fallbackLng: 'en', + ns: ['bluiRegistration', 'bluiCommon'], + defaultNS: 'bluiRegistration', + load: 'languageOnly', + detection: { + order: ['querystring', 'localStorage', 'navigator'], + caches: ['localStorage'], + }, + react: { useSuspense: false }, + interpolation: { escapeValue: false }, + resources: { + en: { + bluiRegistration: { + ...RegistrationDictionaries.english.translation, + }, + bluiCommon: { + ...SharedDictionaries.english.translation, + }, + }, + fr: { + bluiRegistration: { + ...RegistrationDictionaries.french.translation, + }, + bluiCommon: { + ...SharedDictionaries.french.translation, + }, + }, + es: { + bluiRegistration: { + ...RegistrationDictionaries.spanish.translation, + }, + bluiCommon: { + ...SharedDictionaries.spanish.translation, + }, + }, + zh: { + bluiRegistration: { + ...RegistrationDictionaries.chinese.translation, + }, + bluiCommon: { + ...SharedDictionaries.chinese.translation, + }, + }, + pt: { + bluiRegistration: { + ...RegistrationDictionaries.portuguese.translation, + }, + bluiCommon: { + ...SharedDictionaries.portuguese.translation, + }, + }, + }, + }, + // We must provide a function as second parameter, otherwise i18next errors + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (err, _t) => { + // eslint-disable-next-line no-console + if (err) return console.log(err); + } +); + +export default { i18nRegistrationInstance }; diff --git a/login-workflow/src/contexts/RegistrationContext/index.ts b/login-workflow/src/contexts/RegistrationContext/index.ts new file mode 100644 index 00000000..4c68d0f6 --- /dev/null +++ b/login-workflow/src/contexts/RegistrationContext/index.ts @@ -0,0 +1,13 @@ +import { RegistrationContext, useRegistrationContext } from './context'; +import i18nRegistrationInstance from './i18nRegistrationInstance'; +import { RegistrationContextProviderProps, RegistrationUIActions, AccountDetails } from './types'; +import { RegistrationContextProvider } from './provider'; +import { RegistrationDictionaries } from './RegistrationDictionaries'; +export type { RegistrationContextProviderProps, RegistrationUIActions, AccountDetails }; +export { + RegistrationContext, + RegistrationContextProvider, + i18nRegistrationInstance, + useRegistrationContext, + RegistrationDictionaries, +}; diff --git a/login-workflow/src/contexts/RegistrationContext/provider.tsx b/login-workflow/src/contexts/RegistrationContext/provider.tsx new file mode 100644 index 00000000..d8be7ed9 --- /dev/null +++ b/login-workflow/src/contexts/RegistrationContext/provider.tsx @@ -0,0 +1,46 @@ +/** + * @packageDocumentation + * @module RegistrationWorkflowContextProvider + */ + +import React, { useEffect } from 'react'; +import { RegistrationContextProviderProps } from './types'; +import { RegistrationContext } from './context'; +import { I18nextProvider } from 'react-i18next'; +import { i18nRegistrationInstance } from './i18nRegistrationInstance'; +import { ErrorContext } from '../ErrorContext'; +import { SharedDictionaries } from '../SharedDictionaries'; +import { RegistrationDictionaries } from './RegistrationDictionaries'; + +export const RegistrationContextProvider: React.FC> = ( + props +) => { + const i18nInstance = props.i18n ?? i18nRegistrationInstance; + const { children, ...registrationContextProps } = props; + const { language, i18n = i18nInstance, errorConfig } = props; + + if (props.i18n) { + i18n.addResourceBundle('zh', 'bluiRegistration', RegistrationDictionaries.chinese.translation, true, false); + i18n.addResourceBundle('zh', 'bluiCommon', SharedDictionaries.chinese.translation, true, false); + i18n.addResourceBundle('en', 'bluiRegistration', RegistrationDictionaries.english.translation, true, false); + i18n.addResourceBundle('en', 'bluiCommon', SharedDictionaries.english.translation, true, false); + i18n.addResourceBundle('fr', 'bluiRegistration', RegistrationDictionaries.french.translation, true, false); + i18n.addResourceBundle('fr', 'bluiCommon', SharedDictionaries.french.translation, true, false); + i18n.addResourceBundle('pt', 'bluiRegistration', RegistrationDictionaries.portuguese.translation, true, false); + i18n.addResourceBundle('pt', 'bluiCommon', SharedDictionaries.portuguese.translation, true, false); + i18n.addResourceBundle('es', 'bluiRegistration', RegistrationDictionaries.spanish.translation, true, false); + i18n.addResourceBundle('es', 'bluiCommon', SharedDictionaries.spanish.translation, true, false); + } + + useEffect(() => { + void i18n.changeLanguage(language); + }, [i18n, language]); + + return ( + + + {children} + + + ); +}; diff --git a/login-workflow/src/contexts/RegistrationContext/types.ts b/login-workflow/src/contexts/RegistrationContext/types.ts new file mode 100644 index 00000000..102f7f1b --- /dev/null +++ b/login-workflow/src/contexts/RegistrationContext/types.ts @@ -0,0 +1,99 @@ +import { i18n } from 'i18next'; +import { NavigateFunction } from 'react-router-dom'; +import { ErrorContextProviderProps } from '../ErrorContext'; +import { RouteConfig } from '../../types'; + +export type AccountDetails = { + firstName: string; + lastName: string; + extra?: { [key: string]: boolean | string | number }; +}; + +// this should be updated to add new actions for greater control +export type RegistrationUIActions = { + /** + * A function that is used to load the EULA. + * @param {string} language - This function will be called when the user lands on the EULA screen + * @returns Promise + */ + loadEula?: (language: string) => Promise; + + /** + * A function that is used to accept the EULA. This function will be called when the user clicks the Next button on the EULA screen + * @returns Promise + */ + acceptEula?: () => Promise; + + /** + * A function that is used to request a registration code. + * @param {string} email - This function will be called when the user lands on the Verify Code screen as well as when a user clicks the Resend Verification Code button + * @returns Promise + */ + requestRegistrationCode?: (email: string) => Promise; + + /** + * A function that is used to validate a registration code. This function will be called when the user clicks the Next button on the Verify Code screen screen + * @param {string} validationCode - the provided verification code + * @param {string} validationEmail - the provided email address + * @returns Promise + */ + validateUserRegistrationRequest?: ( + validationCode: string, + validationEmail?: string + ) => Promise<{ codeValid: boolean | string; accountExists?: boolean }>; + + /** + * A function that is used to create a password. This function will be called when the user clicks the Next button on the Create Password screen + * @param {string} password - the provided password + * @returns Promise + */ + createPassword?: (password: string) => Promise; + + /** + * A function that is used to set the account details. This function will be called when the user clicks the Next button on the Account Details screen + * @param {AccountDetails} details - information collected from the screen, including firstName and lastName + * @returns Promise + */ + setAccountDetails?: (details: AccountDetails) => Promise; + + /** + * A function that is used to complete the registration. This function will be called when the user clicks the Next button on the final registration workflow screen + * @param {string} email - Used to display on final screen + * @param {string} organizationName - Used to display on final screen + * @returns Promise<{ email: string; organizationName: string }> + */ + completeRegistration?: (userData: object) => Promise<{ email: string; organizationName: string }>; +}; + +export type RegistrationContextProviderProps = { + /** + * An object of functions that are used to manage the authentication workflow + * @returns RegistrationUIActions + */ + actions?: RegistrationUIActions; + + /** + * The language code specifying which language to use for the UI + */ + language: string; + + /** + * A function that is used to navigate to a new URL. This is used to navigate to the various screens of the workflow + */ + navigate: NavigateFunction; + + /** + * An object that defines the various routes for the workflow + */ + routeConfig: RouteConfig; + + /** + * An optional i18n object that is used to translate the UI. This is only needed if you want to use custom translation keys / languages inside any of the workflow screens + */ + i18n?: i18n; // add languages / override strings in bulk + + /** + * An object that is used to configure error handling within the workflow. + */ + errorConfig?: ErrorContextProviderProps; +}; diff --git a/login-workflow/src/contexts/RegistrationWorkflowContext/RegistrationWorkflowContext.test.tsx b/login-workflow/src/contexts/RegistrationWorkflowContext/RegistrationWorkflowContext.test.tsx new file mode 100644 index 00000000..36cb211f --- /dev/null +++ b/login-workflow/src/contexts/RegistrationWorkflowContext/RegistrationWorkflowContext.test.tsx @@ -0,0 +1,61 @@ +import React from 'react'; +import { render, screen, cleanup, renderHook } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { RegistrationWorkflowContextProps, useRegistrationWorkflowContext } from '.'; +import { RegistrationWorkflowContextProvider } from './provider'; +import Typography from '@mui/material/Typography'; +import { registrationWorkflowContextProps } from '../../testUtils'; + +afterEach(cleanup); + +describe('RegistrationWorkflowContext', () => { + it('should render RegistrationWorkflowContextProvider without crashing', () => { + render( + + Test + + ); + expect(screen.getByText('Test')).toBeInTheDocument(); + }); + + it('should set values in the context', async () => { + let values: { + result: { current: RegistrationWorkflowContextProps }; + }; + + const RegisterComponent: React.FC> = () => ( + + ); + + const CustomFlow: React.FC = () => { + const Screen1: React.FC = () => { + // eslint-disable-next-line + values = renderHook((): RegistrationWorkflowContextProps => useRegistrationWorkflowContext()); + return Screen 1; + }; + + return ( + + + + ); + }; + + render(); + + // eslint-disable-next-line + await ((): void => expect(values.result.current.currentScreen).toBe(0)); + // eslint-disable-next-line + await ((): void => expect(values.result.current.totalScreens).toBe(2)); + // eslint-disable-next-line + await ((): void => expect(values.result.current.screenData['Eula'].accepted).toBeTruthy()); + }); + + // TODO: Rewrite this test case to test error throw by hook + // it('should throw error, when context value is null', () => { + // const { result } = renderHook(() => useRegistrationWorkflowContext()); + // expect(result.error.message).toBe( + // 'useRegistrationWorkflowContext must be used within an RegistrationContextProvider' + // ); + // }); +}); diff --git a/login-workflow/src/contexts/RegistrationWorkflowContext/context.ts b/login-workflow/src/contexts/RegistrationWorkflowContext/context.ts new file mode 100644 index 00000000..5ec2f5a4 --- /dev/null +++ b/login-workflow/src/contexts/RegistrationWorkflowContext/context.ts @@ -0,0 +1,9 @@ +/** + * @packageDocumentation + * @module RegistrationWorkflowContext + */ + +import { createContext } from 'react'; +import { RegistrationWorkflowContextProps } from './types'; + +export const RegistrationWorkflowContext = createContext(null); diff --git a/login-workflow/src/contexts/RegistrationWorkflowContext/index.ts b/login-workflow/src/contexts/RegistrationWorkflowContext/index.ts new file mode 100644 index 00000000..fd0dd4b4 --- /dev/null +++ b/login-workflow/src/contexts/RegistrationWorkflowContext/index.ts @@ -0,0 +1,25 @@ +import { useContext } from 'react'; +import { RegistrationWorkflowContext } from './context'; +import { RegistrationWorkflowContextProps } from './types'; +import { RegistrationWorkflowContextProvider } from './provider'; + +/** + * Hook to get the data of each registration workflow screen + * + * @category Hooks + * @private + * @internal + */ +export const useRegistrationWorkflowContext = (): RegistrationWorkflowContextProps => { + const context = useContext(RegistrationWorkflowContext); + if (context === null) { + throw new Error('useRegistrationWorkflowContext must be used within an RegistrationWorkflowContextProvider'); + } + return context; +}; + +export type { RegistrationWorkflowContextProps }; + +export { RegistrationWorkflowContextProvider }; + +export * from './types'; diff --git a/login-workflow/src/contexts/RegistrationWorkflowContext/provider.tsx b/login-workflow/src/contexts/RegistrationWorkflowContext/provider.tsx new file mode 100644 index 00000000..f5356684 --- /dev/null +++ b/login-workflow/src/contexts/RegistrationWorkflowContext/provider.tsx @@ -0,0 +1,46 @@ +/** + * @packageDocumentation + * @module RegistrationWorkflowContextProvider + */ + +import React, { useMemo } from 'react'; +import { RegistrationWorkflowContextProps } from './types'; +import { RegistrationWorkflowContext } from './context'; + +export const RegistrationWorkflowContextProvider: React.FC< + React.PropsWithChildren +> = (props) => { + // Extract the needed properties out + // Context value will not change unless a sub function is changed + // NOTE: When adding new props to RegistrationWorkflowContextProps be sure + // to also add them here so the parameters are copied. + const { + currentScreen, + totalScreens, + nextScreen, + previousScreen, + screenData, + updateScreenData, + isInviteRegistration, + } = props; + + const memoizedProps = useMemo(() => { + const propsForContext: RegistrationWorkflowContextProps = { + currentScreen, + totalScreens, + nextScreen, + previousScreen, + screenData, + updateScreenData, + isInviteRegistration, + }; + + return propsForContext; + }, [currentScreen, totalScreens, nextScreen, previousScreen, screenData, updateScreenData, isInviteRegistration]); + + return ( + + {props.children} + + ); +}; diff --git a/login-workflow/src/contexts/RegistrationWorkflowContext/types.ts b/login-workflow/src/contexts/RegistrationWorkflowContext/types.ts new file mode 100644 index 00000000..09852da2 --- /dev/null +++ b/login-workflow/src/contexts/RegistrationWorkflowContext/types.ts @@ -0,0 +1,31 @@ +/** + * @packageDocumentation + * @module RegistrationWorkflowContext + */ + +export type ScreenData = { + Eula: { accepted: boolean }; + CreateAccount: { emailAddress: string }; + VerifyCode: { code: string }; + CreatePassword: { password: string; confirmPassword: string }; + AccountDetails: { firstName: string; lastName: string; extra?: { [key: string]: boolean | string | number } }; + Other?: { [key: string]: { [key: string]: boolean | string | number } }; +}; + +export type IndividualScreenData = + | { screenId: 'Eula'; values: ScreenData['Eula']; isAccountExist?: boolean } + | { screenId: 'CreateAccount'; values: ScreenData['CreateAccount']; isAccountExist?: boolean } + | { screenId: 'VerifyCode'; values: ScreenData['VerifyCode']; isAccountExist?: boolean } + | { screenId: 'CreatePassword'; values: ScreenData['CreatePassword']; isAccountExist?: boolean } + | { screenId: 'AccountDetails'; values: ScreenData['AccountDetails']; isAccountExist?: boolean } + | { screenId: string; values: { [key: string]: boolean | string | number }; isAccountExist?: boolean }; + +export type RegistrationWorkflowContextProps = { + currentScreen: number; + totalScreens: number; + nextScreen: (data: IndividualScreenData) => Promise | undefined; + previousScreen: (data: IndividualScreenData) => void; + screenData: ScreenData; + updateScreenData: (data: IndividualScreenData) => void; + isInviteRegistration?: boolean; +}; diff --git a/login-workflow/src/contexts/RoutingContext.tsx b/login-workflow/src/contexts/RoutingContext.tsx deleted file mode 100644 index d6dfc9fa..00000000 --- a/login-workflow/src/contexts/RoutingContext.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { createContext, useContext } from 'react'; -import { RouteConfig } from '../routing/AuthNavigationContainer'; - -type RoutingContextType = { - routes: Required; -}; - -/** - * Context Provider that gives access to the custom routes defined for the public routes (pre authentication). - * - * @param routes A object containing the required routes and their respective paths - * - * @category Component - */ -export const RoutingContext = createContext(null); - -export const useRoutes = (): RoutingContextType => { - const context = useContext(RoutingContext); - if (context === null) { - throw new Error('useRoutes must be used within a RoutingContextProvider'); - } - return context; -}; diff --git a/login-workflow/src/contexts/SharedDictionaries/chinese.ts b/login-workflow/src/contexts/SharedDictionaries/chinese.ts new file mode 100644 index 00000000..a4f40f6d --- /dev/null +++ b/login-workflow/src/contexts/SharedDictionaries/chinese.ts @@ -0,0 +1,74 @@ +import { CommonTranslationsFile } from './types'; + +const resources: CommonTranslationsFile = { + translation: { + ACTIONS: { + FINISH: '完成', + NEXT: '继续', + BACK: '返回', + CANCEL: '取消', + CREATE_ACCOUNT: '创建账号', + OKAY: '好的', + DONE: '完成', + CONTINUE: '继续', + LOG_IN: '登录', + LOG_OUT: '登出', + CLICK_BUTTON: '点击按钮', + UPDATE_REDUX: '点击按钮以更新redux中存的值', + CHANGE_LANGUAGE: '更改语言设置', + GO_HOME: '进入主页', + GO_TEST: '进入测试页面', + RESEND: '重新发送', + UPDATE: '更新', + REMEMBER: '记住我的登录信息', + SUBMIT: '提交', + }, + LABELS: { + EMAIL: '邮箱地址', + USERNAME: '用户名', + PASSWORD: '密码', + CURRENT_PASSWORD: '当前密码', + NEW_PASSWORD: '新密码', + OPTIONAL: '可选', + FORGOT_PASSWORD: '忘记密码?', + NEED_ACCOUNT: '新用户?', + VIEW_ALL_EVENTS: '查看共{{count}}个事件', + }, + MESSAGES: { + EMAIL_SENT: '邮件已发送', + WELCOME: '欢迎', + WELCOME_PROJECT: '欢迎来到{{project}}', + LOGIN_MESSAGE: '您已登录', + CONGRATS: '恭喜!', + CONTACT: '联系伊顿客服人员', + ERROR: '错误!', + EMAIL_ENTRY_ERROR: '请输入有效的电子邮件地址', + USERNAME_ENTRY_ERROR: '请输入有效的用户名', + SUCCESS: '成功', + FAILURE: '失败', + LOADING: '正在加载……', + REQUEST_ERROR: '抱歉,发送您的请求时出现了程序错误。', + PASSWORD_REQUIRED_ERROR: '密码为必填项', + }, + FORMS: { + FIRST_NAME: '名', + LAST_NAME: '姓', + PHONE_NUMBER: '手机号码', + PASSWORD: '密码', + CONFIRM_PASSWORD: '确认密码', + PASS_MATCH_ERROR: '密码不匹配', + TOGGLE_PASSWORD_VISIBILITY: '显示密码', + RESET_PASSWORD: '重置密码', + FIRST_NAME_LENGTH_ERROR: '名字必须至少包含1个字符', + LAST_NAME_LENGTH_ERROR: '姓氏必须至少包含1个字符', + }, + PASSWORD_REQUIREMENTS: { + LENGTH: '8至16个字符', + NUMBERS: '1个数字', + UPPER: '1个大写字母', + LOWER: '1个小写字母', + SPECIAL: '1个特殊字符', + }, + }, +}; +export default resources; diff --git a/login-workflow/src/contexts/SharedDictionaries/english.ts b/login-workflow/src/contexts/SharedDictionaries/english.ts new file mode 100644 index 00000000..3e4e0c56 --- /dev/null +++ b/login-workflow/src/contexts/SharedDictionaries/english.ts @@ -0,0 +1,74 @@ +import { CommonTranslationsFile } from './types'; + +const resources: CommonTranslationsFile = { + translation: { + ACTIONS: { + FINISH: 'Finish', + NEXT: 'Next', + BACK: 'Back', + CREATE_ACCOUNT: 'Create Account', + OKAY: 'Okay', + CANCEL: 'Cancel', + CONTINUE: 'Continue', + DONE: 'Done', + LOG_IN: 'Log In', + LOG_OUT: 'Log Out', + CLICK_BUTTON: 'Click the button', + UPDATE_REDUX: 'Click the button to update the redux store value!', + CHANGE_LANGUAGE: 'Change Language here!', + GO_HOME: 'Go to Home', + GO_TEST: 'Go to Test Page', + RESEND: 'Send Again', + UPDATE: 'Update', + REMEMBER: 'Remember Me', + SUBMIT: 'Submit', + }, + LABELS: { + EMAIL: 'Email Address', + USERNAME: 'Username', + PASSWORD: 'Password', + CURRENT_PASSWORD: 'Current Password', + NEW_PASSWORD: 'New Password', + OPTIONAL: 'Optional', + FORGOT_PASSWORD: 'Forgot your password?', + NEED_ACCOUNT: 'Need an account?', + VIEW_ALL_EVENTS: 'View All {{count}} Events', + }, + MESSAGES: { + EMAIL_SENT: 'Email Sent', + WELCOME: 'Welcome', + WELCOME_PROJECT: 'Welcome to {{project}}', + LOGIN_MESSAGE: "You are 'logged' in", + CONGRATS: 'Congratulations!', + CONTACT: 'Contact an Eaton Support Representative', + ERROR: 'Error!', + EMAIL_ENTRY_ERROR: 'Please enter a valid email', + USERNAME_ENTRY_ERROR: 'Please enter a valid username', + SUCCESS: 'Success', + FAILURE: 'Failure', + LOADING: 'Loading...', + REQUEST_ERROR: 'Sorry, there was a problem sending your request.', + PASSWORD_REQUIRED_ERROR: 'Password Required', + }, + FORMS: { + FIRST_NAME: 'First Name', + LAST_NAME: 'Last Name', + PHONE_NUMBER: 'Phone Number', + PASSWORD: 'Password', + CONFIRM_PASSWORD: 'Confirm Password', + PASS_MATCH_ERROR: 'Passwords do not match', + TOGGLE_PASSWORD_VISIBILITY: 'Toggle password visibility', + RESET_PASSWORD: 'Reset Password', + FIRST_NAME_LENGTH_ERROR: 'First name must be at least 1 characters', + LAST_NAME_LENGTH_ERROR: 'Last name must be at least 1 characters', + }, + PASSWORD_REQUIREMENTS: { + LENGTH: '8-16 Characters', + NUMBERS: 'One number', + UPPER: 'One uppercase letter', + LOWER: 'One lowercase letter', + SPECIAL: 'One special character', + }, + }, +}; +export default resources; diff --git a/login-workflow/src/contexts/SharedDictionaries/french.ts b/login-workflow/src/contexts/SharedDictionaries/french.ts new file mode 100644 index 00000000..fcf6e6cc --- /dev/null +++ b/login-workflow/src/contexts/SharedDictionaries/french.ts @@ -0,0 +1,74 @@ +import { CommonTranslationsFile } from './types'; + +const resources: CommonTranslationsFile = { + translation: { + ACTIONS: { + FINISH: 'Terminer', + NEXT: 'Prochain', + BACK: 'Retour', + CREATE_ACCOUNT: 'Créer un compte', + OKAY: "d'accord", + CANCEL: 'Annuler', + CONTINUE: 'Continuer', + DONE: 'Terminé', + LOG_IN: "S'identifier", + LOG_OUT: 'Se déconnecter', + CLICK_BUTTON: 'Cliquez sur le bouton', + UPDATE_REDUX: 'Cliquez sur le bouton pour mettre à jour la valeur du magasin redux!', + CHANGE_LANGUAGE: 'Changer de langue ici!', + GO_HOME: 'Aller à la maison', + GO_TEST: 'Aller à la page de test', + RESEND: 'Envoyer à nouveau', + UPDATE: 'Mise à jour', + REMEMBER: 'Souvenez-vous de moi', + SUBMIT: 'Soumettre', + }, + LABELS: { + EMAIL: 'Adresse e-mail', + USERNAME: `Nom d'utilisateur`, + PASSWORD: 'Mot de passe', + CURRENT_PASSWORD: 'Mot de passe actuel', + NEW_PASSWORD: 'Nouveau mot de passe', + OPTIONAL: 'Optionnel', + FORGOT_PASSWORD: 'Mot de passe oublié', + NEED_ACCOUNT: 'Besoin dun compte?', + VIEW_ALL_EVENTS: 'Afficher les {{count}} événements', + }, + MESSAGES: { + EMAIL_SENT: 'Email envoyé', + WELCOME: 'Bienvenue', + WELCOME_PROJECT: 'Bienvenue sur {{project}}', + LOGIN_MESSAGE: 'Vous êtes connecté', + CONGRATS: 'Toutes nos félicitations!', + CONTACT: 'Contacter un représentant du support Eaton', + ERROR: 'Erreur!', + EMAIL_ENTRY_ERROR: "S'il vous plaît entrer un email valide", + USERNAME_ENTRY_ERROR: "Merci d'entrer un nom d'utilisateur valide", + SUCCESS: 'Succès', + FAILURE: 'Échec', + LOADING: 'le chargement...', + REQUEST_ERROR: `Désolé, un problème est survenu lors de l'envoi de votre demande.`, + PASSWORD_REQUIRED_ERROR: 'Mot de passe requis', + }, + FORMS: { + FIRST_NAME: 'Prénom', + LAST_NAME: 'Nom de Famille', + PHONE_NUMBER: 'Numéro de Téléphone', + PASSWORD: 'Mot de Passe', + CONFIRM_PASSWORD: 'Confirmez', + PASS_MATCH_ERROR: 'Les mots de passe ne correspondent pas', + TOGGLE_PASSWORD_VISIBILITY: 'Basculer la visibilité du mot de passe', + RESET_PASSWORD: 'Réinitialiser le Mot de Passe', + FIRST_NAME_LENGTH_ERROR: 'Le prénom doit comporter au moins 1 caractères', + LAST_NAME_LENGTH_ERROR: 'Le nom de famille doit comporter au moins 1 caractères', + }, + PASSWORD_REQUIREMENTS: { + LENGTH: '8-16 Caractères', + NUMBERS: 'Un nombre', + UPPER: 'Une lettre majuscule', + LOWER: 'Une lettre miniscule', + SPECIAL: 'Un caractère spécial', + }, + }, +}; +export default resources; diff --git a/login-workflow/src/contexts/SharedDictionaries/index.ts b/login-workflow/src/contexts/SharedDictionaries/index.ts new file mode 100644 index 00000000..d71e46b3 --- /dev/null +++ b/login-workflow/src/contexts/SharedDictionaries/index.ts @@ -0,0 +1,19 @@ +import english from './english'; +import french from './french'; +import spanish from './spanish'; +import chinese from './chinese'; +import portuguese from './portuguese'; + +export { default as english } from './english'; +export { default as french } from './french'; +export { default as spanish } from './spanish'; +export { default as chinese } from './chinese'; +export { default as portuguese } from './portuguese'; + +export const SharedDictionaries = { + english: english, + french: french, + spanish: spanish, + chinese: chinese, + portuguese: portuguese, +}; diff --git a/login-workflow/src/contexts/SharedDictionaries/portuguese.ts b/login-workflow/src/contexts/SharedDictionaries/portuguese.ts new file mode 100644 index 00000000..24f9eeff --- /dev/null +++ b/login-workflow/src/contexts/SharedDictionaries/portuguese.ts @@ -0,0 +1,74 @@ +import { CommonTranslationsFile } from './types'; + +const resources: CommonTranslationsFile = { + translation: { + ACTIONS: { + FINISH: 'Concluir', + NEXT: 'Próximo', + BACK: 'Anterior', + CREATE_ACCOUNT: 'Criar Conta', + OKAY: 'OK', + CANCEL: 'Cancelar', + CONTINUE: 'Continuar', + DONE: 'Concluir', + LOG_IN: 'Iniciar Sessão', + LOG_OUT: 'Terminar Sessão', + CLICK_BUTTON: 'Clique no botão', + UPDATE_REDUX: 'Clique no botão para atualizar o valor de armazenamento redux!', + CHANGE_LANGUAGE: 'Alterar idioma aqui!', + GO_HOME: 'Ir para a Página Principal', + GO_TEST: 'Ir para a Página de testes', + RESEND: 'Envie novamente', + UPDATE: 'Atualizar', + REMEMBER: 'Lembrar-me', + SUBMIT: 'Enviar', + }, + LABELS: { + EMAIL: 'E-mail', + USERNAME: 'Nome de Utilizador', + PASSWORD: 'Palavra-passe', + CURRENT_PASSWORD: 'Palavra-passe atual', + NEW_PASSWORD: 'Nova Palavra-passe', + OPTIONAL: 'Opcional', + FORGOT_PASSWORD: 'Esqueceu-se da sua palavra-passe?', + NEED_ACCOUNT: 'Precisa de uma conta?', + VIEW_ALL_EVENTS: 'Ver todos os {{count}} Eventos', + }, + MESSAGES: { + EMAIL_SENT: 'E-mail enviado', + WELCOME: 'Bem vindo', + WELCOME_PROJECT: 'Bem vindo ao {{project}}', + LOGIN_MESSAGE: 'Iniciou sessão!', + CONGRATS: 'Parabéns!', + CONTACT: 'Contacte um representante do apoio técnico da Eaton', + ERROR: 'Erro!', + EMAIL_ENTRY_ERROR: 'Por favor insira um e-mail válido', + USERNAME_ENTRY_ERROR: 'Insira um nome de usuário válido', + SUCCESS: 'Sucesso', + FAILURE: 'Falha', + LOADING: 'A carregar...', + REQUEST_ERROR: 'Pedimos desculpa, existe um problema ao submeter o seu pedido', + PASSWORD_REQUIRED_ERROR: 'Senha requerida', + }, + FORMS: { + FIRST_NAME: 'Primeiro Nome', + LAST_NAME: 'Apelido', + PHONE_NUMBER: 'Número de telefone', + PASSWORD: 'Palavra-passe', + CONFIRM_PASSWORD: 'Confirmar palavra-passe', + PASS_MATCH_ERROR: 'Palavras-passe não coincidem', + TOGGLE_PASSWORD_VISIBILITY: 'Ative a visibilidade da palavra-passe', + RESET_PASSWORD: 'Redefinir Palavra-passe', + FIRST_NAME_LENGTH_ERROR: 'O primeiro nome deve ter pelo menos 1 caracteres', + LAST_NAME_LENGTH_ERROR: 'O sobrenome deve ter pelo menos 1 caracteres', + }, + PASSWORD_REQUIREMENTS: { + LENGTH: '8-16 caracteres', + NUMBERS: 'Um número', + UPPER: 'Uma letra maiúscula', + LOWER: 'Uma letra minúscula', + SPECIAL: 'Um caracter especial', + }, + }, +}; +export default resources; diff --git a/login-workflow/src/contexts/SharedDictionaries/spanish.ts b/login-workflow/src/contexts/SharedDictionaries/spanish.ts new file mode 100644 index 00000000..dfda5388 --- /dev/null +++ b/login-workflow/src/contexts/SharedDictionaries/spanish.ts @@ -0,0 +1,74 @@ +import { CommonTranslationsFile } from './types'; + +const resources: CommonTranslationsFile = { + translation: { + ACTIONS: { + FINISH: 'Terminar', + NEXT: 'Siguiente', + BACK: 'Atrás', + CREATE_ACCOUNT: 'Crear una cuenta', + OKAY: 'Okey', + CANCEL: 'Cancelar', + CONTINUE: 'Seguir', + DONE: 'Hecho', + LOG_IN: 'Iniciar sesión', + LOG_OUT: 'Cerrar sesión', + CLICK_BUTTON: '¡Haga clic en el botón', + UPDATE_REDUX: '¡Haga clic en el botón para actualizar el valor de la tienda redux!', + CHANGE_LANGUAGE: '¡Cambie el idioma aquí!', + GO_HOME: 'Ir a casa', + GO_TEST: 'Ir a la página de prueba', + RESEND: 'Enviar de nuevo', + UPDATE: 'Actualizar', + REMEMBER: 'Recordar contraseña', + SUBMIT: 'Entregar', + }, + LABELS: { + EMAIL: 'Correo electrónico', + USERNAME: 'Nombre de usuario', + PASSWORD: 'Contraseña', + CURRENT_PASSWORD: 'Contraseña actual', + NEW_PASSWORD: 'Nueva contraseña', + OPTIONAL: 'Opcional', + FORGOT_PASSWORD: '¿Ha olvidado su contraseña?', + NEED_ACCOUNT: '¿Necesitas una cuenta?', + VIEW_ALL_EVENTS: 'Ver todos los {{count}} eventos', + }, + MESSAGES: { + EMAIL_SENT: 'Correo electrónico enviado', + WELCOME: 'Bienvenido', + WELCOME_PROJECT: 'Bienvenido a {{project}}', + LOGIN_MESSAGE: 'Has iniciado sesión', + CONGRATS: '¡Felicitaciones!', + CONTACT: 'Contactar un representante de soporte de Eaton', + ERROR: '¡Error!', + EMAIL_ENTRY_ERROR: 'Ingrese un correo electrónico válido', + USERNAME_ENTRY_ERROR: 'Introduzca un nombre de usuario válido', + SUCCESS: 'Éxito', + FAILURE: 'Fallo', + LOADING: 'Cargando...', + REQUEST_ERROR: 'Lo sentimos, hubo un problema al enviar su solicitud.', + PASSWORD_REQUIRED_ERROR: 'Se requiere contraseña', + }, + FORMS: { + FIRST_NAME: 'Nombre', + LAST_NAME: 'Apellido', + PHONE_NUMBER: 'Número de teléfono', + PASSWORD: 'Contraseña', + CONFIRM_PASSWORD: 'Confirmar contraseña', + PASS_MATCH_ERROR: 'Las contraseñas no coinciden', + TOGGLE_PASSWORD_VISIBILITY: 'Alternar visibilidad de contraseña', + RESET_PASSWORD: 'Restablecer contraseña', + FIRST_NAME_LENGTH_ERROR: 'El nombre debe tener al menos 1 caracteres', + LAST_NAME_LENGTH_ERROR: 'El apellido debe tener al menos 1 caracteres', + }, + PASSWORD_REQUIREMENTS: { + LENGTH: '8-16 caracteres', + NUMBERS: 'Un número', + UPPER: 'Una letra mayúscula', + LOWER: 'Una letra minúscula', + SPECIAL: 'Un carácter especial', + }, + }, +}; +export default resources; diff --git a/login-workflow/src/contexts/SharedDictionaries/types.ts b/login-workflow/src/contexts/SharedDictionaries/types.ts new file mode 100644 index 00000000..25457b9e --- /dev/null +++ b/login-workflow/src/contexts/SharedDictionaries/types.ts @@ -0,0 +1,72 @@ +export type CommonTranslations = { + ACTIONS: { + FINISH: string; + NEXT: string; + BACK: string; + CREATE_ACCOUNT: string; + OKAY: string; + CANCEL: string; + CONTINUE: string; + DONE: string; + LOG_IN: string; + LOG_OUT: string; + CLICK_BUTTON: string; + UPDATE_REDUX: string; + CHANGE_LANGUAGE: string; + GO_HOME: string; + GO_TEST: string; + RESEND: string; + UPDATE: string; + REMEMBER: string; + SUBMIT: string; + }; + LABELS: { + EMAIL: string; + USERNAME: string; + PASSWORD: string; + CURRENT_PASSWORD: string; + NEW_PASSWORD: string; + OPTIONAL: string; + FORGOT_PASSWORD: string; + NEED_ACCOUNT: string; + VIEW_ALL_EVENTS: string; + }; + MESSAGES: { + EMAIL_SENT: string; + WELCOME: string; + WELCOME_PROJECT: string; + LOGIN_MESSAGE: string; + CONGRATS: string; + CONTACT: string; + ERROR: string; + EMAIL_ENTRY_ERROR: string; + USERNAME_ENTRY_ERROR: string; + SUCCESS: string; + FAILURE: string; + LOADING: string; + REQUEST_ERROR: string; + PASSWORD_REQUIRED_ERROR: string; + }; + FORMS: { + FIRST_NAME: string; + LAST_NAME: string; + PHONE_NUMBER: string; + PASSWORD: string; + CONFIRM_PASSWORD: string; + PASS_MATCH_ERROR: string; + TOGGLE_PASSWORD_VISIBILITY: string; + RESET_PASSWORD: string; + FIRST_NAME_LENGTH_ERROR: string; + LAST_NAME_LENGTH_ERROR: string; + }; + PASSWORD_REQUIREMENTS: { + LENGTH: string; + NUMBERS: string; + UPPER: string; + LOWER: string; + SPECIAL: string; + }; +}; +export type CommonTranslationsFile = { + translation: CommonTranslations; +}; diff --git a/login-workflow/src/contexts/index.ts b/login-workflow/src/contexts/index.ts new file mode 100644 index 00000000..e52a63b2 --- /dev/null +++ b/login-workflow/src/contexts/index.ts @@ -0,0 +1,3 @@ +export * from './RegistrationWorkflowContext'; +export * from './AuthContext'; +export * from './RegistrationContext'; diff --git a/login-workflow/src/hooks/index.ts b/login-workflow/src/hooks/index.ts new file mode 100644 index 00000000..7234070b --- /dev/null +++ b/login-workflow/src/hooks/index.ts @@ -0,0 +1,2 @@ +export * from './isFirstRender'; +export * from './useQueryString'; diff --git a/login-workflow/src/hooks/isFirstRender.ts b/login-workflow/src/hooks/isFirstRender.ts new file mode 100644 index 00000000..4e97d1a6 --- /dev/null +++ b/login-workflow/src/hooks/isFirstRender.ts @@ -0,0 +1,15 @@ +/** + * @packageDocumentation + * @module Hooks + * @internal + */ + +import { useRef, useEffect } from 'react'; + +export const useIsFirstRender = (): boolean => { + const isFirstRender = useRef(true); + useEffect(() => { + isFirstRender.current = false; + }, []); + return isFirstRender.current; +}; diff --git a/login-workflow/src/index.ts b/login-workflow/src/index.ts index 68fb2ff9..6f46d376 100644 --- a/login-workflow/src/index.ts +++ b/login-workflow/src/index.ts @@ -1,14 +1,7 @@ -/** - Copyright (c) 2021-present, Eaton - All rights reserved. - This code is licensed under the BSD-3 license found in the LICENSE file in the root directory of this source tree and at https://opensource.org/licenses/BSD-3-Clause. - **/ -import './index.css'; -export { AuthNavigationContainer } from './routing/AuthNavigationContainer'; -export { RouteConfig } from './routing/AuthNavigationContainer'; - -export { default as i18n } from './translations/i18n'; - -export { ContactSupportContent } from './screens/ContactSupport'; - -export * from '@brightlayer-ui/react-auth-shared'; +export * from './components'; +export * from './contexts'; +export * from './screens'; +export * from './utils'; +export * from './constants'; +export * from './hooks'; +export * from './types'; diff --git a/login-workflow/src/lib/README.md b/login-workflow/src/lib/README.md new file mode 100644 index 00000000..238d47dd --- /dev/null +++ b/login-workflow/src/lib/README.md @@ -0,0 +1 @@ +# This folder holds libraries/utility functions \ No newline at end of file diff --git a/login-workflow/src/lib/clock.ts b/login-workflow/src/lib/clock.ts new file mode 100644 index 00000000..be394812 --- /dev/null +++ b/login-workflow/src/lib/clock.ts @@ -0,0 +1,56 @@ +import { subMilliseconds, differenceInMilliseconds } from 'date-fns'; + +let timeTravelOffset = 0; +let frozenTime: Date | undefined; + +const internalNow = (): Date => { + if (frozenTime) { + return frozenTime; + } + + return subMilliseconds(new Date(), timeTravelOffset); +}; + +const now = (): Date => internalNow(); + +const assertInTest = (): void => { + if (process.env.NODE_ENV !== 'test') { + throw new Error('Time travel is only allowed in tests!'); + } +}; + +const timeTravel = (time: Date | string): void => { + assertInTest(); + timeTravelOffset = differenceInMilliseconds(new Date(), typeof time === 'string' ? new Date(time) : time); + frozenTime = undefined; +}; + +const restoreTime = (): void => { + assertInTest(); + timeTravelOffset = 0; + frozenTime = undefined; +}; + +const freezeTime = (time: Date | string | undefined): void => { + assertInTest(); + if (time) { + timeTravel(time); + } + + frozenTime = internalNow(); +}; + +const unfreezeTime = (): void => { + assertInTest(); + frozenTime = undefined; +}; + +export const Clock = { + now, + Testing: { + timeTravel, + restoreTime, + freezeTime, + unfreezeTime, + }, +}; diff --git a/login-workflow/src/lib/date-time-formatter.ts b/login-workflow/src/lib/date-time-formatter.ts new file mode 100644 index 00000000..37fa71ea --- /dev/null +++ b/login-workflow/src/lib/date-time-formatter.ts @@ -0,0 +1,37 @@ +import { formatDistance } from 'date-fns'; +import { Clock } from '.'; +import { dateLocale } from '../utils'; + +const formatDateTime = (dateTime: string | undefined | null, locales?: string | string[] | undefined): string => + dateTime ? new Date(dateTime).toLocaleString(locales) : ''; + +const formatMonthLong = (dateTime: string | undefined | null, locales?: string | string[] | undefined): string => + dateTime ? new Date(dateTime).toLocaleString(locales, { month: 'long' }) : ''; + +const formatDate = (dateTime: string | undefined | null, locales?: string | string[] | undefined): string => + dateTime ? new Date(dateTime).toLocaleDateString(locales) : ''; + +const formatDateShort = (dateTime: string | undefined | null, locales?: string | string[] | undefined): string => + dateTime + ? new Date(dateTime).toLocaleDateString(locales, { + month: '2-digit', + day: '2-digit', + year: '2-digit', + }) + : ''; + +const formatTime = (dateTime: string | undefined | null, locales?: string | string[] | undefined): string => + dateTime ? new Date(dateTime).toLocaleTimeString(locales) : ''; + +const formatTimeShort = (dateTime: string | undefined | null, locales?: string | string[] | undefined): string => + dateTime + ? new Date(dateTime).toLocaleTimeString(locales, { + hour: '2-digit', + minute: '2-digit', + }) + : ''; + +const timeSince = (dateTime: string | undefined | null): string => + dateTime ? formatDistance(new Date(dateTime), Clock.now(), { locale: dateLocale, addSuffix: true }) : ''; + +export { formatDateTime, formatMonthLong, formatDate, formatDateShort, formatTime, formatTimeShort, timeSince }; diff --git a/login-workflow/src/lib/index.ts b/login-workflow/src/lib/index.ts new file mode 100644 index 00000000..989b0074 --- /dev/null +++ b/login-workflow/src/lib/index.ts @@ -0,0 +1 @@ +export * from './clock'; diff --git a/login-workflow/src/routing/AuthNavigationContainer.tsx b/login-workflow/src/routing/AuthNavigationContainer.tsx deleted file mode 100644 index 36d8c518..00000000 --- a/login-workflow/src/routing/AuthNavigationContainer.tsx +++ /dev/null @@ -1,166 +0,0 @@ -import React, { useEffect } from 'react'; -import { BrowserRouter, Navigate, Route, Routes } from 'react-router-dom'; -import { AuthUIInternalStore, useSecurityState, useInjectedUIContext } from '@brightlayer-ui/react-auth-shared'; -import { Splash as SplashScreen } from '../screens/Splash'; -import { ChangePasswordModal, AuthGuard } from '../components'; -import { RoutingContext } from '../contexts/RoutingContext'; -import { GuestGuard } from '../components/GuestGuard'; -import { ForgotPassword } from '../screens/ForgotPassword'; -import { ResetPassword } from '../screens/ResetPassword'; -import { InviteRegistrationPager } from '../screens/InviteRegistrationPager'; -import { SelfRegistrationPager } from '../screens/SelfRegistrationPager'; -import { ContactSupport } from '../screens/ContactSupport'; -import { Login } from '../screens/Login'; - -export type RouteConfig = { - LOGIN?: string; - FORGOT_PASSWORD?: string; - RESET_PASSWORD?: string; - REGISTER_INVITE?: string; - REGISTER_SELF?: string; - SUPPORT?: string; -}; -export type NavigationContainerComponentProps = { - routeConfig?: RouteConfig; - extraRoutes?: JSX.Element[]; -}; - -const defaultRoutes: Required = { - LOGIN: '/login', - FORGOT_PASSWORD: '/forgot-password', - RESET_PASSWORD: '/reset-password', - REGISTER_INVITE: '/register/invite', - REGISTER_SELF: '/register/create-account', - SUPPORT: '/support', -}; - -/* Ensures that all routes supplied by the user start with a forward slash */ -const prefixRoutes = (routes: RouteConfig): { routes: Required; routesArray: string[] } => { - const newRoutes = defaultRoutes; - const newRoutesArray: string[] = []; - Object.keys(routes).forEach((route) => { - const customPath = routes[route as keyof RouteConfig]; - const routeWithPrefix = `${customPath.startsWith('/') ? '' : '/'}${customPath}`; - newRoutes[route as keyof RouteConfig] = routeWithPrefix; - }); - Object.keys(newRoutes).forEach((route) => { - newRoutesArray.push(newRoutes[route as keyof RouteConfig]); - }); - return { routes: newRoutes, routesArray: newRoutesArray }; -}; - -/** - * Container component which holds the authentication and navigation state - * for the web application. - * This should be rendered at the root wrapping the whole app. - * The routes used for the login and registration screens can be customized - * if desired - * - * @param routeConfig Specifies the mapping of screens to URLs - * @param extraRoutes Specifies additional routes that should be accessible without logging in - * @param children Main application content. - * - * @category Component - */ -export const AuthNavigationContainer: React.FC< - React.PropsWithChildren> -> = (props) => { - const securityState = useSecurityState(); - const injectedContext = useInjectedUIContext(); - const { routeConfig, extraRoutes, children, ...otherProps } = props; - const { - enableResetPassword = true, - showContactSupport = true, - enableInviteRegistration = true, - showSelfRegistration = true, - } = injectedContext; - - useEffect(() => { - const bootstrapAsync = async (): Promise => { - await injectedContext.authActions().initiateSecurity(); - return; - }; - - void bootstrapAsync(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - const { routes } = prefixRoutes({ ...defaultRoutes, ...routeConfig }); - const extraRoutesPathnames = extraRoutes ? extraRoutes.map((route) => route.props.path) : []; - - // Show the splash loading screen until we have loaded the initial authentication state - if (securityState.isLoading && !extraRoutesPathnames.includes(window.location.pathname)) { - return ; - } - - const RedirectToLogin = ; - - return ( - - - - - {/* Screens visible for non-logged in users */} - <> - - - - } - /> - - {enableResetPassword ? : RedirectToLogin} - - } - /> - {enableResetPassword ? : RedirectToLogin} - } - /> - - {enableInviteRegistration ? : RedirectToLogin} - - } - /> - - {showSelfRegistration ? : RedirectToLogin} - - } - /> - {showContactSupport ? : RedirectToLogin} - } - /> - - - {/* Additional public routes specified by the user accessible whether logged in or not */} - {extraRoutes} - - {/* Main user application content routes, behind authentication guard */} - }> - {children} - - - - {/* If the user is authenticated, the change password modal is accessible */} - {securityState.isAuthenticatedUser && } - - - - ); -}; diff --git a/login-workflow/src/screens/AccountDetailsScreen/AccountDetailsScreen.test.tsx b/login-workflow/src/screens/AccountDetailsScreen/AccountDetailsScreen.test.tsx new file mode 100644 index 00000000..96f519a4 --- /dev/null +++ b/login-workflow/src/screens/AccountDetailsScreen/AccountDetailsScreen.test.tsx @@ -0,0 +1,101 @@ +import React from 'react'; +import '@testing-library/jest-dom'; +import { cleanup, render, screen, RenderResult, fireEvent } from '@testing-library/react'; +import { AccountDetailsScreen } from './AccountDetailsScreen'; +import { RegistrationContextProvider } from '../../contexts'; +import { AccountDetailsScreenProps } from './types'; +import { RegistrationWorkflow } from '../../components'; +import { registrationContextProviderProps } from '../../testUtils'; + +afterEach(cleanup); + +describe('Account Details Screen', () => { + let mockOnNext: any; + let mockOnPrevious: any; + + afterEach(() => { + jest.clearAllMocks(); + }); + + beforeEach(() => { + mockOnNext = jest.fn(); + mockOnPrevious = jest.fn(); + }); + + const renderer = (props?: AccountDetailsScreenProps): RenderResult => + render( + + + + + + ); + + it('renders without crashing', () => { + renderer(); + + expect(screen.getByText('Account Details')).toBeInTheDocument(); + }); + + it('should update values when passed as props', () => { + renderer({ + WorkflowCardHeaderProps: { + title: 'Test Title', + }, + }); + + expect(screen.queryByText('Account Details')).toBeNull(); + expect(screen.getByText('Test Title')).toBeInTheDocument(); + }); + + it('should update instruction when passed as props', () => { + renderer({ + WorkflowCardInstructionProps: { + instructions: 'Test Instruction', + }, + }); + + expect(screen.queryByText('Enter your details below to complete account creation.')).toBeNull(); + expect(screen.getByText('Test Instruction')).toBeInTheDocument(); + }); + + it('should call onNext, when Next button clicked', () => { + const { getByLabelText } = renderer({ + WorkflowCardActionsProps: { + onNext: mockOnNext(), + showNext: true, + nextLabel: 'Next', + }, + }); + + const firstNameInput = getByLabelText('First Name'); + fireEvent.change(firstNameInput, { target: { value: 'Test First Name' } }); + fireEvent.blur(firstNameInput); + + const lastNameInput = getByLabelText('Last Name'); + fireEvent.change(lastNameInput, { target: { value: 'Test Last Name' } }); + fireEvent.blur(lastNameInput); + + const nextButton = screen.getByText('Next'); + expect(nextButton).toBeInTheDocument(); + expect(screen.getByText(/Next/i)).toBeEnabled(); + fireEvent.click(nextButton); + expect(mockOnNext).toHaveBeenCalled(); + }); + + it('should call onPrevious, when Back button clicked', () => { + renderer({ + WorkflowCardActionsProps: { + onPrevious: mockOnPrevious(), + showPrevious: true, + previousLabel: 'Back', + }, + }); + + const backButton = screen.getByText('Back'); + expect(backButton).toBeInTheDocument(); + expect(screen.getByText(/Back/i)).toBeEnabled(); + fireEvent.click(backButton); + expect(mockOnPrevious).toHaveBeenCalled(); + }); +}); diff --git a/login-workflow/src/screens/AccountDetailsScreen/AccountDetailsScreen.tsx b/login-workflow/src/screens/AccountDetailsScreen/AccountDetailsScreen.tsx new file mode 100644 index 00000000..b011c907 --- /dev/null +++ b/login-workflow/src/screens/AccountDetailsScreen/AccountDetailsScreen.tsx @@ -0,0 +1,151 @@ +import React, { useCallback, useState } from 'react'; +import { AccountDetailsScreenBase, AccountDetailsScreenProps } from '../AccountDetailsScreen'; +import { useRegistrationContext, useRegistrationWorkflowContext } from '../../contexts'; +import { useErrorManager } from '../../contexts/ErrorContext/useErrorManager'; +import { useTranslation } from 'react-i18next'; + +/** + * Component renders a screen with account details information for support with the application. + * Contact information is pulled from the context passed into the workflow. + * + * @param firstNameLabel label for the first name text field + * @param initialFirstName initial value for the first name text field + * @param firstNameValidator function that validates the first name text field + * @param firstNameTextFieldProps props to pass to the first name field + * @param lastNameLabel label for the last name text field + * @param initialLastName initial value for the last name text field + * @param lastNameValidator function that validates the last name text field + * @param lastNameTextFieldProps props to pass to the last name field + * @param WorkflowCardBaseProps props that will be passed to the WorkflowCard component + * @param WorkflowCardHeaderProps props that will be passed to the WorkflowCardHeader component + * @param WorkflowCardInstructionProps props that will be passed to the WorkflowCardInstructions component + * @param WorkflowCardActionsProps props that will be passed to the WorkflowCardActions component + * @param errorDisplayConfig configuration for customizing how errors are displayed + * + * @category Component + */ + +export const AccountDetailsScreen: React.FC = (props) => { + const { t } = useTranslation(); + const { actions } = useRegistrationContext(); + const regWorkflow = useRegistrationWorkflowContext(); + const { nextScreen, previousScreen, screenData, currentScreen, totalScreens } = regWorkflow; + const [firstName, setFirstName] = useState(screenData.AccountDetails.firstName); + const [lastName, setLastName] = useState(screenData.AccountDetails.lastName); + const [isLoading, setIsLoading] = useState(false); + const { triggerError, errorManagerConfig } = useErrorManager(); + const errorDisplayConfig = { + ...errorManagerConfig, + ...props.errorDisplayConfig, + onClose: (): void => { + if (props.errorDisplayConfig && props.errorDisplayConfig.onClose) props.errorDisplayConfig.onClose(); + if (errorManagerConfig.onClose) errorManagerConfig?.onClose(); + }, + }; + + const onNext = useCallback(async (): Promise => { + try { + setIsLoading(true); + await actions?.setAccountDetails?.({ firstName, lastName }); + void nextScreen({ + screenId: 'AccountDetails', + values: { firstName, lastName }, + }); + } catch (_error) { + triggerError(_error as Error); + } finally { + setIsLoading(false); + } + }, [actions, firstName, lastName, nextScreen, triggerError]); + + const onPrevious = useCallback(() => { + previousScreen({ + screenId: 'AccountDetails', + values: { firstName, lastName }, + }); + }, [firstName, lastName, previousScreen]); + + const { + WorkflowCardHeaderProps, + WorkflowCardInstructionProps, + WorkflowCardActionsProps, + WorkflowCardBaseProps, + firstNameLabel = t('bluiCommon:FORMS.FIRST_NAME'), + lastNameLabel = t('bluiCommon:FORMS.LAST_NAME'), + firstNameValidator = (name: string): boolean | string => { + if (name?.length > 0) { + return true; + } + return t('bluiCommon:FORMS.FIRST_NAME_LENGTH_ERROR'); + }, + lastNameValidator = (name: string): boolean | string => { + if (name?.length > 0) { + return true; + } + return t('bluiCommon:FORMS.LAST_NAME_LENGTH_ERROR'); + }, + firstNameTextFieldProps, + lastNameTextFieldProps, + initialFirstName = screenData.AccountDetails.firstName, + initialLastName = screenData.AccountDetails.lastName, + } = props; + + const workflowCardHeaderProps = { + title: t('bluiRegistration:REGISTRATION.STEPS.ACCOUNT_DETAILS'), + ...WorkflowCardHeaderProps, + }; + + const workflowCardInstructionProps = { + instructions: t('bluiRegistration:REGISTRATION.INSTRUCTIONS.ACCOUNT_DETAILS'), + ...WorkflowCardInstructionProps, + }; + + const workflowCardBaseProps = { + loading: isLoading, + ...WorkflowCardBaseProps, + }; + + const workflowCardActionsProps = { + canGoNext: true, + showNext: true, + showPrevious: true, + nextLabel: t('bluiCommon:ACTIONS.NEXT'), + previousLabel: t('bluiCommon:ACTIONS.BACK'), + totalSteps: totalScreens, + currentStep: currentScreen, + ...WorkflowCardActionsProps, + onNext: (): void => { + void onNext(); + WorkflowCardActionsProps?.onNext?.(); + }, + onPrevious: (): void => { + void onPrevious(); + WorkflowCardActionsProps?.onPrevious?.(); + }, + }; + + const onFirstNameInputChange = (e: any): void => { + setFirstName(e.target.value); + }; + const onLastNameInputChange = (e: any): void => { + setLastName(e.target.value); + }; + + return ( + 0 ? firstName : initialFirstName} + initialLastName={lastName.length > 0 ? lastName : initialLastName} + firstNameLabel={firstNameLabel} + firstNameTextFieldProps={{ ...firstNameTextFieldProps, onChange: onFirstNameInputChange }} + firstNameValidator={firstNameValidator} + lastNameLabel={lastNameLabel} + lastNameTextFieldProps={{ ...lastNameTextFieldProps, onChange: onLastNameInputChange }} + lastNameValidator={lastNameValidator} + WorkflowCardActionsProps={workflowCardActionsProps} + errorDisplayConfig={errorDisplayConfig} + /> + ); +}; diff --git a/login-workflow/src/screens/AccountDetailsScreen/AccountDetailsScreenBase.test.tsx b/login-workflow/src/screens/AccountDetailsScreen/AccountDetailsScreenBase.test.tsx new file mode 100644 index 00000000..bc6e7d87 --- /dev/null +++ b/login-workflow/src/screens/AccountDetailsScreen/AccountDetailsScreenBase.test.tsx @@ -0,0 +1,122 @@ +import React from 'react'; +import '@testing-library/jest-dom'; +import { render, cleanup, screen, fireEvent, RenderResult } from '@testing-library/react'; +import { AccountDetailsScreenBase } from './AccountDetailsScreenBase'; +import { AccountDetailsScreenProps } from './types'; +import { RegistrationContextProvider } from '../../contexts'; +import { RegistrationWorkflow } from '../../components'; +import { registrationContextProviderProps } from '../../testUtils'; + +afterEach(cleanup); + +const renderer = (props?: AccountDetailsScreenProps): RenderResult => + render( + + + + + + ); + +describe('AccountDetailsScreenBase tests', () => { + renderer(); + it('renders without crashing', () => { + render(); + }); + + it('testing initial values', () => { + const { getByLabelText } = render( + + ); + + const firstNameInput = getByLabelText('First Name'); + expect(firstNameInput).toHaveValue('Test First Name'); + + const lastNameInput = getByLabelText('Last Name'); + expect(lastNameInput).toHaveValue('Test Last Name'); + }); + + it('input onChange callback', () => { + const { getByLabelText } = render( + + ); + + const firstNameInput = getByLabelText('First Name'); + expect(firstNameInput).toHaveValue(''); + fireEvent.change(firstNameInput, { target: { value: 'Test First Name' } }); + expect(firstNameInput).toHaveValue('Test First Name'); + + const lastNameInput = getByLabelText('Last Name'); + expect(lastNameInput).toHaveValue(''); + fireEvent.change(lastNameInput, { target: { value: 'Test Last Name' } }); + expect(lastNameInput).toHaveValue('Test Last Name'); + }); + + it('error on onChange', () => { + const { getByLabelText } = render( + { + if (firstName?.length > 2) { + return true; + } + return 'Please enter a valid First Name'; + }} + lastNameLabel="Last Name" + lastNameValidator={(lastName: string): boolean | string => { + if (lastName?.length > 2) { + return true; + } + return 'Please enter a valid Last Name'; + }} + /> + ); + + const firstNameInput = getByLabelText('First Name'); + expect(firstNameInput).toHaveValue(''); + fireEvent.change(firstNameInput, { target: { value: 'AA' } }); + expect(firstNameInput).toHaveValue('AA'); + + const lastNameInput = getByLabelText('Last Name'); + expect(lastNameInput).toHaveValue(''); + fireEvent.change(lastNameInput, { target: { value: 'YY' } }); + expect(lastNameInput).toHaveValue('YY'); + }); + + it('passing all the props', () => { + render( + {}} + lastNameLabel="Last Name" + initialLastName="Test Last Name" + lastNameValidator={(): any => {}} + WorkflowCardActionsProps={{ + canGoPrevious: true, + showPrevious: true, + previousLabel: 'Back', + onPrevious: (): void => {}, + canGoNext: true, + showNext: true, + nextLabel: 'Next', + onNext: (): void => {}, + totalSteps: 5, + currentStep: 2, + }} + /> + ); + expect(screen.getByText('Test')).toBeInTheDocument(); + expect(screen.getByLabelText('First Name')).toBeInTheDocument(); + expect(screen.getByLabelText('Last Name')).toBeInTheDocument(); + }); +}); diff --git a/login-workflow/src/screens/AccountDetailsScreen/AccountDetailsScreenBase.tsx b/login-workflow/src/screens/AccountDetailsScreen/AccountDetailsScreenBase.tsx new file mode 100644 index 00000000..6a431a86 --- /dev/null +++ b/login-workflow/src/screens/AccountDetailsScreen/AccountDetailsScreenBase.tsx @@ -0,0 +1,162 @@ +import React, { useCallback, useEffect, useRef } from 'react'; +import TextField from '@mui/material/TextField'; +import { + WorkflowCard, + WorkflowCardActions, + WorkflowCardBody, + WorkflowCardHeader, + WorkflowCardInstructions, +} from '../../components/WorkflowCard'; +import { AccountDetailsScreenProps } from './types'; +import ErrorManager from '../../components/Error/ErrorManager'; + +/** + * Component renders a screen with account details information for support with the application. + * Contact information is pulled from the context passed into the workflow. + * + * @param firstNameLabel label for the first name text field + * @param initialFirstName initial value for the first name text field + * @param firstNameValidator function that validates the first name text field + * @param firstNameTextFieldProps props to pass to the first name field + * @param lastNameLabel label for the last name text field + * @param initialLastName initial value for the last name text field + * @param lastNameValidator function that validates the last name text field + * @param lastNameTextFieldProps props to pass to the last name field + * @param WorkflowCardBaseProps props that will be passed to the WorkflowCard component + * @param WorkflowCardHeaderProps props that will be passed to the WorkflowCardHeader component + * @param WorkflowCardInstructionProps props that will be passed to the WorkflowCardInstructions component + * @param WorkflowCardActionsProps props that will be passed to the WorkflowCardActions component + * @param errorDisplayConfig configuration for customizing how errors are displayed + * + * @category Component + */ + +export const AccountDetailsScreenBase: React.FC = (props) => { + const { + firstNameLabel, + initialFirstName, + firstNameValidator = (): void => {}, + firstNameTextFieldProps, + lastNameLabel, + initialLastName, + lastNameValidator = (): void => {}, + lastNameTextFieldProps, + errorDisplayConfig, + } = props; + + const cardBaseProps = props.WorkflowCardBaseProps || {}; + const headerProps = props.WorkflowCardHeaderProps || {}; + const instructionsProps = props.WorkflowCardInstructionProps || {}; + const actionsProps = props.WorkflowCardActionsProps || {}; + + const firstNameRef = useRef(null); + const lastNameRef = useRef(null); + + const [firstNameInput, setFirstNameInput] = React.useState(initialFirstName ? initialFirstName : ''); + const [lastNameInput, setLastNameInput] = React.useState(initialLastName ? initialLastName : ''); + + const [isFirstNameValid, setIsFirstNameValid] = React.useState(false); + const [isLastNameValid, setIsLastNameValid] = React.useState(false); + + const [firstNameError, setFirstNameError] = React.useState(''); + const [lastNameError, setLastNameError] = React.useState(''); + + const [shouldValidateFirstName, setShouldValidateFirstName] = React.useState(false); + const [shouldValidateLastName, setShouldValidateLastName] = React.useState(false); + + const handleFirstNameInputChange = useCallback( + (firstName: string) => { + setFirstNameInput(firstName); + const firstNameValidatorResponse = firstNameValidator(firstName); + + setIsFirstNameValid(typeof firstNameValidatorResponse === 'boolean' ? firstNameValidatorResponse : false); + setFirstNameError(typeof firstNameValidatorResponse === 'string' ? firstNameValidatorResponse : ''); + }, + [firstNameValidator] + ); + + const handleLastNameInputChange = useCallback( + (lastName: string) => { + setLastNameInput(lastName); + const lastNameValidatorResponse = lastNameValidator(lastName); + + setIsLastNameValid(typeof lastNameValidatorResponse === 'boolean' ? lastNameValidatorResponse : false); + setLastNameError(typeof lastNameValidatorResponse === 'string' ? lastNameValidatorResponse : ''); + }, + [lastNameValidator] + ); + + useEffect(() => { + if (firstNameInput.length > 0) { + setShouldValidateFirstName(true); + handleFirstNameInputChange(firstNameInput); + } + if (lastNameInput.length > 0) { + setShouldValidateLastName(true); + handleLastNameInputChange(lastNameInput); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + + + + + + { + // eslint-disable-next-line no-unused-expressions + firstNameTextFieldProps?.onChange && firstNameTextFieldProps.onChange(e); + handleFirstNameInputChange(e.target.value); + }} + onKeyUp={(e): void => { + if (e.key === 'Enter' && lastNameRef.current) lastNameRef.current.focus(); + }} + onBlur={(): void => setShouldValidateFirstName(true)} + /> + { + // eslint-disable-next-line no-unused-expressions + lastNameTextFieldProps?.onChange && lastNameTextFieldProps.onChange(e); + handleLastNameInputChange(e.target.value); + }} + onKeyUp={(e): void => { + if (e.key === 'Enter' && isFirstNameValid && isLastNameValid && actionsProps.canGoNext) + actionsProps.onNext?.(); + }} + onBlur={(): void => setShouldValidateLastName(true)} + /> + + + + + ); +}; diff --git a/login-workflow/src/screens/AccountDetailsScreen/index.ts b/login-workflow/src/screens/AccountDetailsScreen/index.ts new file mode 100644 index 00000000..c66fe540 --- /dev/null +++ b/login-workflow/src/screens/AccountDetailsScreen/index.ts @@ -0,0 +1,3 @@ +export * from './AccountDetailsScreen'; +export * from './AccountDetailsScreenBase'; +export * from './types'; diff --git a/login-workflow/src/screens/AccountDetailsScreen/types.ts b/login-workflow/src/screens/AccountDetailsScreen/types.ts new file mode 100644 index 00000000..988b4314 --- /dev/null +++ b/login-workflow/src/screens/AccountDetailsScreen/types.ts @@ -0,0 +1,57 @@ +import { BoxProps, TextFieldProps } from '@mui/material'; +import { WorkflowCardProps } from '../../components/WorkflowCard/WorkflowCard.types'; +import { ErrorManagerProps } from '../../components/Error'; + +export type AccountDetailsScreenProps = WorkflowCardProps & + BoxProps & { + /** + * The label for the first name text field + */ + firstNameLabel?: string; + + /** + * The initial value for the first name text field + */ + initialFirstName?: string; + + /** + * The function that validates the first name text field + * @param {string} firstName - validates first name input length + * @returns boolean | string + */ + firstNameValidator?: (firstName: string) => boolean | string; + + /** + * The props to pass to the first name field. + * See [MUI's TextFieldProps API](https://mui.com/material-ui/api/text-field/) for more details. + */ + firstNameTextFieldProps?: TextFieldProps; + + /** + * The label for the last name text field + */ + lastNameLabel?: string; + + /** + * The initial value for the last name text field + */ + initialLastName?: string; + + /** + * The function that validates the last name text field + * @param {string} lastName - validates last name input length + * @returns boolean | string + */ + lastNameValidator?: (lastName: string) => boolean | string; + + /** + * The props to pass to the last name field. + * See [MUI's TextFieldProps API](https://mui.com/material-ui/api/text-field/) for more details. + */ + lastNameTextFieldProps?: TextFieldProps; + + /** + * The configuration for customizing how errors are displayed + */ + errorDisplayConfig?: ErrorManagerProps; + }; diff --git a/login-workflow/src/screens/ContactScreen/ContactSupportScreen.test.tsx b/login-workflow/src/screens/ContactScreen/ContactSupportScreen.test.tsx new file mode 100644 index 00000000..4eb74a44 --- /dev/null +++ b/login-workflow/src/screens/ContactScreen/ContactSupportScreen.test.tsx @@ -0,0 +1,61 @@ +import React from 'react'; +import '@testing-library/jest-dom'; +import { render, cleanup, screen, fireEvent, RenderResult } from '@testing-library/react'; +import { ContactSupportScreen } from './ContactSupportScreen'; +import { ContactSupportScreenProps } from './types'; +import { AuthContextProvider } from '../../contexts'; +import { BrowserRouter } from 'react-router-dom'; +import { authContextProviderProps } from '../../testUtils'; + +afterEach(cleanup); + +describe('ContactSupportScreen tests', () => { + let mockOnNext: any; + + afterEach(() => { + jest.clearAllMocks(); + }); + + beforeEach(() => { + mockOnNext = jest.fn(); + }); + const renderer = (props?: ContactSupportScreenProps): RenderResult => + render( + + + + + + ); + it('rendering the screen without any props', () => { + renderer(); + + expect(screen.getByText('Contact Us')).toBeInTheDocument(); + }); + + it('should display default content', () => { + renderer(); + expect(screen.getByText('Contact Us')).toBeInTheDocument(); + expect(screen.getByText('General Questions')).toBeInTheDocument(); + expect(screen.getByText('something@email.com')).toBeInTheDocument(); + expect(screen.getByText('Emergency Support')).toBeInTheDocument(); + expect(screen.getByText('1-800-123-4567')).toBeInTheDocument(); + expect(screen.getByText('Okay')).toBeInTheDocument(); + expect(screen.getByText(/Okay/i)).toBeEnabled(); + }); + + it('calls onNext when the Okay button is clicked', () => { + renderer({ + WorkflowCardActionsProps: { + onNext: mockOnNext(), + showNext: true, + nextLabel: 'Next', + }, + }); + + const nextButton = screen.getByText('Okay'); + fireEvent.click(nextButton); + + expect(mockOnNext).toHaveBeenCalled(); + }); +}); diff --git a/login-workflow/src/screens/ContactScreen/ContactSupportScreen.tsx b/login-workflow/src/screens/ContactScreen/ContactSupportScreen.tsx new file mode 100644 index 00000000..48e1a2a1 --- /dev/null +++ b/login-workflow/src/screens/ContactScreen/ContactSupportScreen.tsx @@ -0,0 +1,113 @@ +import React from 'react'; +import { ChatBubbleOutline } from '@mui/icons-material'; +import { ContactSupportScreenBase } from './ContactSupportScreenBase'; +import { ContactSupportScreenProps } from './types'; +import { useAuthContext } from '../../contexts'; +import { useTranslation } from 'react-i18next'; +import { LinkStyles } from '../../styles'; +import { Typography } from '@mui/material'; + +/** + * Component renders a screen with contact information for support with the application. + * Contact information is pulled from the context passed into the workflow. + * + * @param icon the icon to display in the header + * @param emailSupportTitle text to display as the contact support title + * @param emailSupportContent content to display as the contact support content + * @param phoneSupportTitle text to display as the phone support title + * @param phoneSupportContent content to display as the phone support content + * @param contactEmail to display the contact email + * @param contactPhone to display contact phone number + * @param dismissButtonLabel to display label for the button + * @param onDismiss function to call when user clicks button + * @param WorkflowCardBaseProps props that will be passed to the WorkflowCard component + * @param WorkflowCardHeaderProps props that will be passed to the WorkflowCardHeader component + * @param WorkflowCardInstructionProps props that will be passed to the WorkflowCardInstructions component + * @param WorkflowCardActionsProps props that will be passed to the WorkflowCardActions component + * + * @category Component + */ + +export const ContactSupportScreen: React.FC = (props) => { + const { t } = useTranslation(); + const { navigate, routeConfig } = useAuthContext(); + + const { contactEmail = 'something@email.com', contactPhone = '1-800-123-4567' } = props; + + const defaultEmailSupportContent = (): JSX.Element => ( + + {`${t('bluiAuth:CONTACT_SUPPORT.SUPPORT_MESSAGE')}`} + + {contactEmail} + + {`.`} + + ); + + const defaultPhoneSupportContent = (): JSX.Element => ( + + {`${t('bluiAuth:CONTACT_SUPPORT.TECHNICAL_ASSISTANCE')}`} + + {contactPhone} + + {`.`} + + ); + + const { + icon = , + emailSupportTitle = t('bluiAuth:CONTACT_SUPPORT.GENERAL_QUESTIONS'), + emailSupportContent = defaultEmailSupportContent, + phoneSupportTitle = t('bluiAuth:CONTACT_SUPPORT.EMERGENCY_SUPPORT'), + phoneSupportContent = defaultPhoneSupportContent, + dismissButtonLabel = t('bluiCommon:ACTIONS.OKAY'), + onDismiss, + WorkflowCardHeaderProps, + WorkflowCardActionsProps, + ...otherContactSupportProps + } = props; + + const workflowCardHeaderProps = { + title: t('bluiAuth:USER_MENU.CONTACT_US'), + ...WorkflowCardHeaderProps, + }; + + const workflowCardActionsProps = { + nextLabel: t('bluiCommon:ACTIONS.OKAY'), + showNext: true, + canGoNext: true, + fullWidthButton: true, + ...WorkflowCardActionsProps, + onNext: (): void => { + navigate(routeConfig.LOGIN as string); + WorkflowCardActionsProps?.onNext?.(); + }, + }; + + return ( + + ); +}; diff --git a/login-workflow/src/screens/ContactScreen/ContactSupportScreenBase.test.tsx b/login-workflow/src/screens/ContactScreen/ContactSupportScreenBase.test.tsx new file mode 100644 index 00000000..4ab55e79 --- /dev/null +++ b/login-workflow/src/screens/ContactScreen/ContactSupportScreenBase.test.tsx @@ -0,0 +1,85 @@ +import React from 'react'; +import '@testing-library/jest-dom'; +import { render, cleanup, screen, fireEvent } from '@testing-library/react'; +import { ContactSupportScreenBase } from './ContactSupportScreenBase'; +import ChatBubbleOutline from '@mui/icons-material/ChatBubbleOutline'; +import Typography from '@mui/material/Typography'; + +afterEach(cleanup); + +describe('ContactSupportScreenBase tests', () => { + let mockOnNext: any; + + afterEach(() => { + jest.clearAllMocks(); + }); + + beforeEach(() => { + mockOnNext = jest.fn(); + }); + it('rendering the screen without any props', () => { + render(); + }); + + it('renders without crashing', () => { + render( + } + emailSupportTitle="General Questions" + phoneSupportTitle="Emergency Support" + contactEmail="something@email.com" + contactPhone="1-800-123-4567" + dismissButtonLabel="Okay" + emailSupportContent={(contactEmail: string): JSX.Element => ( + + {'For questions, feedback, or support please email us at '} + + {contactEmail} + + {`.`} + + )} + phoneSupportContent={(phone: string): JSX.Element => ( + + {'For technical support, please call '} + + {phone} + + {`.`} + + )} + WorkflowCardActionsProps={{ + nextLabel: 'Okay', + showNext: true, + canGoNext: true, + onNext: (): void => {}, + fullWidthButton: true, + }} + /> + ); + expect(screen.getByText('Test Contact Us')).toBeInTheDocument(); + expect(screen.getByText('General Questions')).toBeInTheDocument(); + expect(screen.getByText('something@email.com')).toBeInTheDocument(); + expect(screen.getByText('Emergency Support')).toBeInTheDocument(); + expect(screen.getByText('1-800-123-4567')).toBeInTheDocument(); + expect(screen.getByText('Okay')).toBeInTheDocument(); + expect(screen.getByText(/Okay/i)).toBeEnabled(); + }); + it('calls onNext when the Okay button is clicked', () => { + const { getByText } = render( + + ); + + const nextButton = getByText('Okay'); + fireEvent.click(nextButton); + + expect(mockOnNext).toHaveBeenCalled(); + }); +}); diff --git a/login-workflow/src/screens/ContactScreen/ContactSupportScreenBase.tsx b/login-workflow/src/screens/ContactScreen/ContactSupportScreenBase.tsx new file mode 100644 index 00000000..ae302cdf --- /dev/null +++ b/login-workflow/src/screens/ContactScreen/ContactSupportScreenBase.tsx @@ -0,0 +1,117 @@ +import React from 'react'; +import { Typography } from '@mui/material'; +import { + WorkflowCard, + WorkflowCardActions, + WorkflowCardBody, + WorkflowCardHeader, + WorkflowCardInstructions, +} from '../../components/WorkflowCard'; +import { ContactSupportScreenProps } from './types'; +import Box, { BoxProps } from '@mui/material/Box'; +import { ContactScreenClassKey, getContactScreenUtilityClass } from './utilityClasses'; +import { unstable_composeClasses as composeClasses } from '@mui/base'; + +/** + * Component renders a screen with contact information for support with the application. + * Contact information is pulled from the context passed into the workflow. + * + * @param icon the icon to display in the header + * @param emailSupportTitle text to display as the contact support title + * @param emailSupportContent content to display as the contact support content + * @param phoneSupportTitle text to display as the phone support title + * @param phoneSupportContent content to display as the phone support content + * @param contactEmail to display the contact email + * @param contactPhone to display contact phone number + * @param dismissButtonLabel to display label for the button + * @param onDismiss function to call when user clicks button + * @param WorkflowCardBaseProps props that will be passed to the WorkflowCard component + * @param WorkflowCardHeaderProps props that will be passed to the WorkflowCardHeader component + * @param WorkflowCardInstructionProps props that will be passed to the WorkflowCardInstructions component + * @param WorkflowCardActionsProps props that will be passed to the WorkflowCardActions component + * + * @category Component + */ + +const useUtilityClasses = (ownerState: ContactSupportScreenProps & BoxProps): Record => { + const { classes } = ownerState; + + const slots = { + root: ['root'], + title: ['title'], + icon: ['icon'], + emailSupportTitle: ['emailSupportTitle'], + emailSupportContent: ['emailSupportContent'], + phoneSupportTitle: ['phoneSupportTitle'], + phoneSupportContent: ['phoneSupportContent'], + contactEmail: ['contactEmail'], + contactPhone: ['contactPhone'], + dismissButtonLabel: ['dismissButtonLabel'], + }; + + return composeClasses(slots, getContactScreenUtilityClass, classes); +}; + +export const ContactSupportScreenBase: React.FC = (props) => { + const { + icon, + emailSupportTitle, + emailSupportContent, + phoneSupportTitle, + phoneSupportContent, + contactEmail, + contactPhone, + dismissButtonLabel, + onDismiss, + } = props; + + const defaultClasses = useUtilityClasses(props); + + const cardBaseProps = props.WorkflowCardBaseProps || {}; + const headerProps = props.WorkflowCardHeaderProps || {}; + const instructionsProps = props.WorkflowCardInstructionProps || {}; + const actionsProps = props.WorkflowCardActionsProps || {}; + + return ( + + + {Object.keys(instructionsProps).length !== 0 && } + {icon && ( + + {icon} + + )} + + + {' '} + {emailSupportTitle} + + <>{emailSupportContent?.(contactEmail ?? '')} + + {' '} + {phoneSupportTitle} + + <>{phoneSupportContent?.(contactPhone ?? '')} + + { + if (onDismiss) onDismiss(); + if (actionsProps.onNext) actionsProps.onNext(); + }} + /> + + ); +}; diff --git a/login-workflow/src/screens/ContactScreen/index.ts b/login-workflow/src/screens/ContactScreen/index.ts new file mode 100644 index 00000000..eaabde70 --- /dev/null +++ b/login-workflow/src/screens/ContactScreen/index.ts @@ -0,0 +1,3 @@ +export * from './ContactSupportScreenBase'; +export * from './types'; +export * from './ContactSupportScreen'; diff --git a/login-workflow/src/screens/ContactScreen/types.ts b/login-workflow/src/screens/ContactScreen/types.ts new file mode 100644 index 00000000..8f098d32 --- /dev/null +++ b/login-workflow/src/screens/ContactScreen/types.ts @@ -0,0 +1,50 @@ +import { WorkflowCardProps } from '../../components/WorkflowCard/WorkflowCard.types'; + +export type ContactSupportScreenProps = WorkflowCardProps & { + icon?: JSX.Element; + + /** + * The title for the email support section + */ + emailSupportTitle?: string; + + /** + * The content for the email support section + * @param {string} email - the email address for contacting support + * @returns string | JSX.Element + */ + emailSupportContent?: (email: string) => string | JSX.Element; + + /** + * The title for the phone support section + */ + phoneSupportTitle?: string; + + /** + * The content for the phone support section + * @param {string} phone - the phone number for contacting support + * @returns string | JSX.Element + */ + phoneSupportContent?: (phone: string) => string | JSX.Element; + + /** + * The email address to display in the email support section + */ + contactEmail?: string; + + /** + * The phone number to display in the phone support section + */ + contactPhone?: string; + + /** + * The text to display on the dismiss button + */ + dismissButtonLabel?: string; + + /** + * The function to call when the dismiss button is clicked + * @returns void + */ + onDismiss?: () => void; +}; diff --git a/login-workflow/src/screens/ContactScreen/utilityClasses.ts b/login-workflow/src/screens/ContactScreen/utilityClasses.ts new file mode 100644 index 00000000..81fe5e82 --- /dev/null +++ b/login-workflow/src/screens/ContactScreen/utilityClasses.ts @@ -0,0 +1,20 @@ +import generateUtilityClass from '@mui/material/generateUtilityClass'; + +export type ContactScreenClasses = { + root?: string; + title?: string; + icon?: JSX.Element; + emailSupportTitle?: string; + emailSupportContent?: string; + phoneSupportTitle?: string; + phoneSupportContent?: string; + contactEmail?: string; + contactPhone?: string; + dismissButtonLabel?: string; +}; + +export type ContactScreenClassKey = keyof ContactScreenClasses; + +export function getContactScreenUtilityClass(slot: string): string { + return generateUtilityClass('BluiContact', slot); +} diff --git a/login-workflow/src/screens/ContactSupport.tsx b/login-workflow/src/screens/ContactSupport.tsx deleted file mode 100644 index bded3438..00000000 --- a/login-workflow/src/screens/ContactSupport.tsx +++ /dev/null @@ -1,102 +0,0 @@ -import React from 'react'; -import { useLanguageLocale, useInjectedUIContext } from '@brightlayer-ui/react-auth-shared'; -import { useNavigate } from 'react-router-dom'; -import Button from '@mui/material/Button'; -import CardActions from '@mui/material/CardActions'; -import CardContent from '@mui/material/CardContent'; -import CardHeader from '@mui/material/CardHeader'; -import Divider from '@mui/material/Divider'; -import Typography from '@mui/material/Typography'; -import { SxProps, Theme, useTheme } from '@mui/material/styles'; -import { BrandedCardContainer } from '../components'; -import ChatBubbleOutline from '@mui/icons-material/ChatBubbleOutline'; -import { DialogButtonStyles, DialogActionsStyles, DialogContentStyles, DialogTitleStyles } from '../styles'; -import Box from '@mui/material/Box'; - -const LinkStyles = (theme: Theme): SxProps => ({ - fontWeight: 600, - color: theme.palette.primary.main, - textTransform: 'none', - textDecoration: 'none', - '&:visited': { - color: theme.palette.primary.main, - }, -}); - -/** - * Content for the Contact Us screen. This is exported separately - * in the event that a user wishes to build another area in their - * main application where users can view this information. - * - * @category Component - */ -export const ContactSupportContent: React.FC> = () => { - const { t } = useLanguageLocale(); - const theme = useTheme(); - const { contactPhone, contactEmail } = useInjectedUIContext(); - - return ( - <> - - - - - {t('blui:CONTACT_SUPPORT.GENERAL_QUESTIONS')} - - - {t('blui:CONTACT_SUPPORT.SUPPORT_MESSAGE')} - - {contactEmail} - - . - - - {t('blui:CONTACT_SUPPORT.EMERGENCY_SUPPORT')} - - - {t('blui:CONTACT_SUPPORT.TECHNICAL_ASSISTANCE')} - - {contactPhone} - - . - - - ); -}; - -/** - * Container that renders a screen with contact information for - * support with the application. Contact information is pulled - * from the context passed into the workflow. - * - * @category Component - */ -export const ContactSupport: React.FC> = () => { - const { t } = useLanguageLocale(); - const navigate = useNavigate(); - const theme = useTheme(); - - return ( - - {t('blui:USER_MENU.CONTACT_US')}} - sx={DialogTitleStyles(theme)} - /> - - - - - - - - - ); -}; diff --git a/login-workflow/src/screens/CreateAccountScreen/CreateAccountScreen.test.tsx b/login-workflow/src/screens/CreateAccountScreen/CreateAccountScreen.test.tsx new file mode 100644 index 00000000..321b5b16 --- /dev/null +++ b/login-workflow/src/screens/CreateAccountScreen/CreateAccountScreen.test.tsx @@ -0,0 +1,115 @@ +import React from 'react'; +import '@testing-library/jest-dom'; +import { cleanup, render, screen, fireEvent, RenderResult } from '@testing-library/react'; +import { CreateAccountScreen } from './CreateAccountScreen'; +import { CreateAccountScreenProps } from './types'; +import { RegistrationContextProvider } from '../../contexts'; +import { RegistrationWorkflow } from '../../components'; +import { registrationContextProviderProps } from '../../testUtils'; + +afterEach(cleanup); + +describe('Create Account Screen', () => { + let mockOnNext: any; + let mockOnPrevious: any; + + afterEach(() => { + jest.clearAllMocks(); + }); + + beforeEach(() => { + mockOnNext = jest.fn(); + mockOnPrevious = jest.fn(); + }); + + const renderer = (props?: CreateAccountScreenProps): RenderResult => + render( + + + + + + ); + + it('renders without crashing', () => { + renderer(); + + expect(screen.getByText('Create an Account')).toBeInTheDocument(); + expect(screen.getByLabelText('Email Address')).toBeInTheDocument(); + }); + + it('sets error state when email is too short', () => { + const { getByLabelText } = renderer(); + + const verifyEmailInput = getByLabelText('Email Address'); + fireEvent.change(verifyEmailInput, { target: { value: 't' } }); + fireEvent.blur(verifyEmailInput); + + expect(verifyEmailInput).toHaveAttribute('aria-invalid', 'true'); + expect(screen.getByText('Please enter a valid email')).toBeInTheDocument(); + }); + + it('does not set error state when email is long enough', () => { + const { getByLabelText } = renderer(); + const verifyEmailInput = getByLabelText('Email Address'); + fireEvent.change(verifyEmailInput, { target: { value: 'test@test.net' } }); + fireEvent.blur(verifyEmailInput); + + expect(verifyEmailInput).not.toHaveAttribute('aria-invalid', 'true'); + }); + + it('calls onNext when the next button is clicked', () => { + const { getByLabelText, getByText } = renderer({ + WorkflowCardActionsProps: { + onNext: mockOnNext(), + showNext: true, + nextLabel: 'Next', + }, + }); + + const emailInput = getByLabelText('Email Address'); + fireEvent.change(emailInput, { target: { value: 'Abcd@123.net' } }); + const nextButton = getByText('Next'); + expect(nextButton).toBeInTheDocument(); + expect(screen.getByText(/Next/i)).toBeEnabled(); + fireEvent.click(nextButton); + + expect(mockOnNext).toHaveBeenCalled(); + }); + + it('calls onPrevious when the back button is clicked', () => { + const { getByText } = renderer({ + WorkflowCardActionsProps: { + onPrevious: mockOnPrevious(), + showPrevious: true, + previousLabel: 'Back', + }, + }); + + const backButton = getByText('Back'); + expect(backButton).toBeInTheDocument(); + expect(screen.getByText(/Back/i)).toBeEnabled(); + fireEvent.click(backButton); + expect(mockOnPrevious).toHaveBeenCalled(); + }); + + it('pre-populates the email input field with initialValue', () => { + const { getByLabelText } = renderer(); + + const emailInput = getByLabelText('Email Address'); + fireEvent.change(emailInput, { target: { value: 'Abcd@123' } }); + expect(emailInput).toHaveValue('Abcd@123'); + }); + + it('displays title, instructions and emailLabel correctly', () => { + const { getByText } = renderer(); + + expect(getByText('Create an Account')).toBeInTheDocument(); + expect( + getByText( + 'To register for an Eaton account, enter the required information below. You will need to verify your email address to continue.' + ) + ).toBeInTheDocument(); + expect(getByText('Email Address')).toBeInTheDocument(); + }); +}); diff --git a/login-workflow/src/screens/CreateAccountScreen/CreateAccountScreen.tsx b/login-workflow/src/screens/CreateAccountScreen/CreateAccountScreen.tsx new file mode 100644 index 00000000..8775642a --- /dev/null +++ b/login-workflow/src/screens/CreateAccountScreen/CreateAccountScreen.tsx @@ -0,0 +1,136 @@ +import React, { useCallback, useState } from 'react'; +import { CreateAccountScreenProps } from './types'; +import { CreateAccountScreenBase } from './CreateAccountScreenBase'; +import { useRegistrationContext } from '../../contexts/RegistrationContext/context'; +import { useRegistrationWorkflowContext } from '../../contexts'; +import { useErrorManager } from '../../contexts/ErrorContext/useErrorManager'; +import { useTranslation } from 'react-i18next'; + +/** + * Component that renders a screen for the user to enter their email address to start the + * account creation process. + * + * @param emailLabel label for the email field + * @param initialValue initial value for the email text field + * @param emailValidator function used to test the input for valid formatting + * @param emailTextFieldProps props to pass to the email text field + * @param WorkflowCardBaseProps props that will be passed to the WorkflowCard component + * @param WorkflowCardHeaderProps props that will be passed to the WorkflowCardHeader component + * @param WorkflowCardInstructionProps props that will be passed to the WorkflowCardInstructions component + * @param WorkflowCardActionsProps props that will be passed to the WorkflowCardActions component + * @param errorDisplayConfig configuration for customizing how errors are displayed + * + * @category Component + */ + +const EMAIL_REGEX = /^[A-Z0-9._%+'-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i; + +export const CreateAccountScreen: React.FC = (props) => { + const { t } = useTranslation(); + const { actions } = useRegistrationContext(); + const regWorkflow = useRegistrationWorkflowContext(); + const { nextScreen, previousScreen, screenData, totalScreens, currentScreen } = regWorkflow; + const [emailInputValue, setEmailInputValue] = useState(screenData.CreateAccount.emailAddress); + const [isLoading, setIsLoading] = useState(false); + const { triggerError, errorManagerConfig } = useErrorManager(); + const errorDisplayConfig = { + ...errorManagerConfig, + ...props.errorDisplayConfig, + onClose: (): void => { + if (props.errorDisplayConfig && props.errorDisplayConfig.onClose) props.errorDisplayConfig.onClose(); + if (errorManagerConfig.onClose) errorManagerConfig?.onClose(); + }, + }; + + const onNext = useCallback(async () => { + try { + setIsLoading(true); + await actions?.requestRegistrationCode?.(emailInputValue); + void nextScreen({ + screenId: 'CreateAccount', + values: { emailAddress: emailInputValue }, + }); + } catch (_error) { + triggerError(_error as Error); + } finally { + setIsLoading(false); + } + }, [actions, emailInputValue, nextScreen, triggerError]); + + const onPrevious = (): void => { + previousScreen({ + screenId: 'CreateAccount', + values: { emailAddress: emailInputValue }, + }); + }; + + const { + WorkflowCardBaseProps, + WorkflowCardHeaderProps, + WorkflowCardInstructionProps, + WorkflowCardActionsProps, + emailLabel = t('bluiCommon:LABELS.EMAIL'), + initialValue = screenData.CreateAccount.emailAddress, + emailValidator = (email: string): boolean | string => { + if (!EMAIL_REGEX.test(email)) { + return t('bluiCommon:MESSAGES.EMAIL_ENTRY_ERROR'); + } + return true; + }, + emailTextFieldProps, + } = props; + + const workflowCardBaseProps = { + loading: isLoading, + ...WorkflowCardBaseProps, + }; + + const workflowCardHeaderProps = { + title: t('bluiRegistration:REGISTRATION.STEPS.CREATE_ACCOUNT'), + ...WorkflowCardHeaderProps, + }; + + const workflowCardInstructionProps = { + instructions: t('bluiRegistration:SELF_REGISTRATION.INSTRUCTIONS'), + ...WorkflowCardInstructionProps, + }; + + const workflowCardActionsProps = { + showNext: true, + nextLabel: t('bluiCommon:ACTIONS.NEXT'), + showPrevious: true, + previousLabel: t('bluiCommon:ACTIONS.BACK'), + canGoPrevious: true, + currentStep: currentScreen, + totalSteps: totalScreens, + ...WorkflowCardActionsProps, + onNext: (): void => { + void onNext(); + WorkflowCardActionsProps?.onNext?.(); + }, + onPrevious: (): void => { + void onPrevious(); + WorkflowCardActionsProps?.onPrevious?.(); + }, + }; + + const onEmailInputValueChange = (e: any): void => { + setEmailInputValue(e.target.value); + }; + + return ( + 0 ? screenData.CreateAccount.emailAddress : initialValue + } + emailTextFieldProps={{ ...emailTextFieldProps, onChange: onEmailInputValueChange }} + emailValidator={emailValidator} + WorkflowCardActionsProps={workflowCardActionsProps} + errorDisplayConfig={errorDisplayConfig} + /> + ); +}; diff --git a/login-workflow/src/screens/CreateAccountScreen/CreateAccountScreenBase.test.tsx b/login-workflow/src/screens/CreateAccountScreen/CreateAccountScreenBase.test.tsx new file mode 100644 index 00000000..2918734a --- /dev/null +++ b/login-workflow/src/screens/CreateAccountScreen/CreateAccountScreenBase.test.tsx @@ -0,0 +1,178 @@ +import React from 'react'; +import '@testing-library/jest-dom'; +import { cleanup, render, screen, fireEvent, RenderResult } from '@testing-library/react'; +import { CreateAccountScreenBase } from './CreateAccountScreenBase'; +import { CreateAccountScreenProps } from './types'; +import { RegistrationContextProvider } from '../../contexts'; +import { RegistrationWorkflow } from '../../components'; +import { registrationContextProviderProps } from '../../testUtils'; + +afterEach(cleanup); + +describe('Create Account Screen Base', () => { + let mockOnNext: any; + + afterEach(() => { + jest.clearAllMocks(); + }); + + beforeEach(() => { + mockOnNext = jest.fn(); + }); + + const renderer = (props?: CreateAccountScreenProps): RenderResult => + render( + + + + + + ); + + it('renders without crashing', () => { + renderer(); + render( + + ); + expect(screen.getByText('Create Account')).toBeInTheDocument(); + expect(screen.getByText('Create account instructions')).toBeInTheDocument(); + expect(screen.getByText('Next')).toBeInTheDocument(); + expect(screen.getByText(/Next/i)).toBeEnabled(); + expect(screen.getByText('Back')).toBeInTheDocument(); + expect(screen.getByText(/Back/i)).toBeEnabled(); + }); + + it('sets error state when email is too short', () => { + const { getByLabelText, rerender } = render( + { + if (email?.length > 6) { + return true; + } + return 'Please enter a valid email'; + }} + /> + ); + + const verifyEmailInput = getByLabelText('Email Address'); + fireEvent.change(verifyEmailInput, { target: { value: 't' } }); + fireEvent.blur(verifyEmailInput); + + // Rerender to ensure state changes have taken effect + rerender( + { + if (email?.length > 6) { + return true; + } + return 'Please enter a valid email'; + }} + /> + ); + expect(verifyEmailInput).toHaveAttribute('aria-invalid', 'true'); + }); + + it('does not set error state when email is long enough', () => { + const { getByLabelText, rerender } = render( + { + if (email?.length > 2) { + return true; + } + return 'Please enter a valid email'; + }} + /> + ); + + const verifyEmailInput = getByLabelText('Email Address'); + fireEvent.change(verifyEmailInput, { target: { value: 'test' } }); + fireEvent.blur(verifyEmailInput); + + // Rerender to ensure state changes have taken effect + rerender( + { + if (email?.length > 1) { + return true; + } + return 'Please enter a valid email'; + }} + /> + ); + expect(verifyEmailInput).not.toHaveAttribute('aria-invalid', 'true'); + }); + + it('calls onNext when the next button is clicked', () => { + const { getByText } = render( + + ); + + const nextButton = getByText('Next'); + fireEvent.click(nextButton); + + expect(mockOnNext).toHaveBeenCalled(); + }); + + it('pre-populates the email input field with initialValue', () => { + const { getByLabelText } = render( + { + if (email?.length > 1) { + return true; + } + return 'Please enter a valid email'; + }} + /> + ); + + const emailInput = getByLabelText('Email Address'); + expect(emailInput).toHaveValue('te'); + }); + + it('displays title, instructions and emailLabel correctly', () => { + const { getByText } = render( + + ); + + expect(getByText('Title')).toBeInTheDocument(); + expect(getByText('Instructions')).toBeInTheDocument(); + expect(getByText('Email Address')).toBeInTheDocument(); + }); +}); diff --git a/login-workflow/src/screens/CreateAccountScreen/CreateAccountScreenBase.tsx b/login-workflow/src/screens/CreateAccountScreen/CreateAccountScreenBase.tsx new file mode 100644 index 00000000..cd48a7d6 --- /dev/null +++ b/login-workflow/src/screens/CreateAccountScreen/CreateAccountScreenBase.tsx @@ -0,0 +1,111 @@ +import React, { useCallback, useEffect } from 'react'; +import { CreateAccountScreenProps } from './types'; +import { WorkflowCard } from '../../components/WorkflowCard'; +import { WorkflowCardActions } from '../../components/WorkflowCard/WorkflowCardActions'; +import { WorkflowCardBody } from '../../components/WorkflowCard/WorkflowCardBody'; +import { WorkflowCardHeader } from '../../components/WorkflowCard/WorkflowCardHeader'; +import { WorkflowCardInstructions } from '../../components/WorkflowCard/WorkflowCardInstructions'; +import TextField from '@mui/material/TextField'; +import ErrorManager from '../../components/Error/ErrorManager'; + +/** + * Component that renders a screen for the user to enter their email address to start the + * account creation process. + * + * @param emailLabel label for the email field + * @param initialValue initial value for the email text field + * @param emailValidator function used to test the input for valid formatting + * @param emailTextFieldProps props to pass to the email text field + * @param WorkflowCardBaseProps props that will be passed to the WorkflowCard component + * @param WorkflowCardHeaderProps props that will be passed to the WorkflowCardHeader component + * @param WorkflowCardInstructionProps props that will be passed to the WorkflowCardInstructions component + * @param WorkflowCardActionsProps props that will be passed to the WorkflowCardActions component + * @param errorDisplayConfig configuration for customizing how errors are displayed + * + * @category Component + */ + +export const CreateAccountScreenBase: React.FC< + React.PropsWithChildren +> = (props) => { + const { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + emailValidator = (email: string): boolean | string => true, + emailLabel, + initialValue, + emailTextFieldProps, + inputRef, + errorDisplayConfig, + } = props; + + const cardBaseProps = props.WorkflowCardBaseProps || {}; + const headerProps = props.WorkflowCardHeaderProps || {}; + const instructionsProps = props.WorkflowCardInstructionProps || {}; + const actionsProps = props.WorkflowCardActionsProps || {}; + + const [emailInput, setEmailInput] = React.useState(initialValue ? initialValue : ''); + const [isEmailValid, setIsEmailValid] = React.useState(emailValidator(initialValue ?? '') ?? false); + const [emailError, setEmailError] = React.useState(''); + const [shouldValidateEmail, setShouldValidateEmail] = React.useState(false); + + const handleEmailInputChange = useCallback( + (email: string) => { + setEmailInput(email); + const emailValidatorResponse = emailValidator(email); + + setIsEmailValid(typeof emailValidatorResponse === 'boolean' ? emailValidatorResponse : false); + setEmailError(typeof emailValidatorResponse === 'string' ? emailValidatorResponse : ''); + }, + [emailValidator] + ); + useEffect(() => { + if (emailInput.length > 0) { + setShouldValidateEmail(true); + handleEmailInputChange(emailInput); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + + + + + + { + // eslint-disable-next-line no-unused-expressions + emailTextFieldProps?.onChange && emailTextFieldProps.onChange(e); + handleEmailInputChange(e.target.value); + }} + onKeyUp={(e): void => { + if ( + e.key === 'Enter' && + ((emailInput.length > 0 && isEmailValid) || actionsProps.canGoNext) + ) + actionsProps?.onNext?.(); + }} + onBlur={(e): void => { + // eslint-disable-next-line no-unused-expressions + emailTextFieldProps?.onBlur && emailTextFieldProps.onBlur(e); + setShouldValidateEmail(true); + }} + /> + + + 0 && isEmailValid && actionsProps.canGoNext) as any} + > + + ); +}; diff --git a/login-workflow/src/screens/CreateAccountScreen/index.ts b/login-workflow/src/screens/CreateAccountScreen/index.ts new file mode 100644 index 00000000..17a354d2 --- /dev/null +++ b/login-workflow/src/screens/CreateAccountScreen/index.ts @@ -0,0 +1,3 @@ +export * from './CreateAccountScreenBase'; +export * from './CreateAccountScreen'; +export * from './types'; diff --git a/login-workflow/src/screens/CreateAccountScreen/types.ts b/login-workflow/src/screens/CreateAccountScreen/types.ts new file mode 100644 index 00000000..6875c7e9 --- /dev/null +++ b/login-workflow/src/screens/CreateAccountScreen/types.ts @@ -0,0 +1,33 @@ +import { TextFieldProps } from '@mui/material'; +import { WorkflowCardProps } from '../../components/WorkflowCard/WorkflowCard.types'; +import { ErrorManagerProps } from '../../components/Error'; + +export type CreateAccountScreenProps = WorkflowCardProps & { + /** + * The label for the email field + */ + emailLabel?: string; + + /** + * The initial value for the email text field + */ + initialValue?: string; + + /** + * The function used to test the input for valid formatting + * @param {string} email - validate format via EMAIL_REGEX + * @returns boolean | string + */ + emailValidator?: (email: string) => boolean | string; + + /** + * The props to pass to the email text field. + * See [MUI's TextFieldProps API](https://mui.com/material-ui/api/text-field/) for more details. + */ + emailTextFieldProps?: TextFieldProps; + + /** + * The configuration for customizing how errors are displayed + */ + errorDisplayConfig?: ErrorManagerProps; +}; diff --git a/login-workflow/src/screens/CreatePasswordScreen/CreatePasswordScreen.test.tsx b/login-workflow/src/screens/CreatePasswordScreen/CreatePasswordScreen.test.tsx new file mode 100644 index 00000000..8e2106dc --- /dev/null +++ b/login-workflow/src/screens/CreatePasswordScreen/CreatePasswordScreen.test.tsx @@ -0,0 +1,147 @@ +import React from 'react'; +import '@testing-library/jest-dom'; +import { cleanup, render, screen, fireEvent, RenderResult } from '@testing-library/react'; +import { CreatePasswordScreen } from './CreatePasswordScreen'; +import { CreatePasswordScreenProps } from './types'; +import { RegistrationContextProvider } from '../../contexts'; +import { RegistrationWorkflow } from '../../components'; +import { registrationContextProviderProps } from '../../testUtils'; + +const passwordRequirements = [ + { + description: 'Check 1', + regex: /^.{3,5}$/, + }, + { + description: 'Check 2', + regex: /[a-z]+/, + }, +]; + +afterEach(cleanup); + +describe('Create Password Screen', () => { + let mockOnNext: any; + let mockOnPrevious: any; + + afterEach(() => { + jest.clearAllMocks(); + }); + + beforeEach(() => { + mockOnNext = jest.fn(); + mockOnPrevious = jest.fn(); + }); + + const renderer = (props?: CreatePasswordScreenProps): RenderResult => + render( + + + + + + ); + + it('renders without crashing', () => { + renderer(); + + expect(screen.getByText('Create Password')).toBeInTheDocument(); + }); + + it('should display default props', () => { + renderer(); + + expect(screen.getByLabelText('Password')).toBeInTheDocument(); + expect(screen.getByLabelText('Confirm Password')).toBeInTheDocument(); + expect(screen.queryByLabelText('Password')).toBeEmptyDOMElement(); + expect(screen.queryByLabelText('Confirm Password')).toBeEmptyDOMElement(); + }); + + it('should display default password requirements', () => { + renderer(); + + expect(screen.getByText('8-16 Characters')).toBeInTheDocument(); + expect(screen.getByText('One number')).toBeInTheDocument(); + expect(screen.getByText('One uppercase letter')).toBeInTheDocument(); + expect(screen.getByText('One lowercase letter')).toBeInTheDocument(); + expect(screen.getByText('One special character')).toBeInTheDocument(); + }); + + it('should call onNext, when Next button clicked', () => { + const { getByLabelText } = renderer({ + WorkflowCardActionsProps: { + onNext: mockOnNext(), + showNext: true, + nextLabel: 'Next', + }, + PasswordProps: { + newPasswordLabel: 'Password', + confirmPasswordLabel: 'Confirm Password', + onPasswordChange: jest.fn(), + passwordRequirements: passwordRequirements, + }, + }); + + const passwordField = getByLabelText('Password'); + const confirmPasswordField = getByLabelText('Confirm Password'); + + fireEvent.change(passwordField, { target: { value: 'Abcd@123' } }); + fireEvent.blur(passwordField); + fireEvent.change(confirmPasswordField, { target: { value: 'Abcd@123' } }); + fireEvent.blur(confirmPasswordField); + + const nextButton = screen.getByText('Next'); + expect(nextButton).toBeInTheDocument(); + expect(screen.getByText(/Next/i)).toBeEnabled(); + fireEvent.click(nextButton); + expect(mockOnNext).toHaveBeenCalled(); + }); + + it('should enable next button, when passwordRequirements prop is empty', () => { + const { getByLabelText } = renderer({ + WorkflowCardActionsProps: { + onNext: mockOnNext(), + showNext: true, + nextLabel: 'Next', + }, + PasswordProps: { + newPasswordLabel: 'Password', + confirmPasswordLabel: 'Confirm Password', + onPasswordChange: jest.fn(), + passwordRequirements: [], + }, + }); + + const passwordField = getByLabelText('Password'); + const confirmPasswordField = getByLabelText('Confirm Password'); + + fireEvent.change(passwordField, { target: { value: 'A' } }); + fireEvent.blur(passwordField); + fireEvent.change(confirmPasswordField, { target: { value: 'A' } }); + fireEvent.blur(confirmPasswordField); + + expect(screen.getByText(/Next/i)).toBeEnabled(); + }); + + it('should call onPrevious, when Back button clicked', () => { + renderer({ + WorkflowCardActionsProps: { + onPrevious: mockOnPrevious(), + showPrevious: true, + previousLabel: 'Back', + }, + PasswordProps: { + newPasswordLabel: 'Password', + confirmPasswordLabel: 'Confirm Password', + onPasswordChange: jest.fn(), + passwordRequirements: passwordRequirements, + }, + }); + + const backButton = screen.getByText('Back'); + expect(backButton).toBeInTheDocument(); + expect(screen.getByText(/Back/i)).toBeEnabled(); + fireEvent.click(backButton); + expect(mockOnPrevious).toHaveBeenCalled(); + }); +}); diff --git a/login-workflow/src/screens/CreatePasswordScreen/CreatePasswordScreen.tsx b/login-workflow/src/screens/CreatePasswordScreen/CreatePasswordScreen.tsx new file mode 100644 index 00000000..9182c663 --- /dev/null +++ b/login-workflow/src/screens/CreatePasswordScreen/CreatePasswordScreen.tsx @@ -0,0 +1,172 @@ +import React, { useCallback, useRef, useState } from 'react'; +import { CreatePasswordScreenBase } from './CreatePasswordScreenBase'; +import { defaultPasswordRequirements } from '../../constants'; +import { CreatePasswordScreenProps } from './types'; +import { useRegistrationContext, useRegistrationWorkflowContext } from '../../contexts'; +import { useErrorManager } from '../../contexts/ErrorContext/useErrorManager'; +import { useTranslation } from 'react-i18next'; + +/** + * The component renders a screen with the password and confirm password field for creating a new password. + * + * @param errorDisplayConfig configuration for customizing how errors are displayed + * @param PasswordProps props passed from SetPassword component + * @param WorkflowCardBaseProps props that will be passed to the WorkflowCard component + * @param WorkflowCardHeaderProps props that will be passed to the WorkflowCardHeader component + * @param WorkflowCardInstructionProps props that will be passed to the WorkflowCardInstructions component + * @param WorkflowCardActionsProps props that will be passed to the WorkflowCardActions component + * + * @category Component + */ + +export const CreatePasswordScreen: React.FC = (props) => { + const { t } = useTranslation(); + const { actions } = useRegistrationContext(); + const regWorkflow = useRegistrationWorkflowContext(); + const { + nextScreen, + previousScreen, + screenData: { + CreatePassword: { password, confirmPassword }, + }, + currentScreen, + totalScreens, + } = regWorkflow; + + const { + WorkflowCardBaseProps, + WorkflowCardHeaderProps, + WorkflowCardInstructionProps, + WorkflowCardActionsProps, + PasswordProps, + } = props; + + const passwordRef = useRef(null); + const confirmRef = useRef(null); + const [passwordInput, setPasswordInput] = useState( + password !== '' ? password : PasswordProps?.initialNewPasswordValue ?? '' + ); + const [confirmInput, setConfirmInput] = useState( + confirmPassword !== '' ? confirmPassword : PasswordProps?.initialConfirmPasswordValue ?? '' + ); + const [isLoading, setIsLoading] = useState(false); + const passwordRequirements = defaultPasswordRequirements(t); + const { triggerError, errorManagerConfig } = useErrorManager(); + const errorDisplayConfig = { + ...errorManagerConfig, + ...props.errorDisplayConfig, + onClose: (): void => { + if (props.errorDisplayConfig && props.errorDisplayConfig.onClose) props.errorDisplayConfig.onClose(); + if (errorManagerConfig.onClose) errorManagerConfig?.onClose(); + }, + }; + + const onNext = useCallback(async (): Promise => { + try { + setIsLoading(true); + await actions?.createPassword?.(passwordInput); + void nextScreen({ + screenId: 'CreatePassword', + values: { password: passwordInput, confirmPassword: confirmInput }, + }); + } catch (_error) { + triggerError(_error as Error); + } finally { + setIsLoading(false); + } + }, [actions, passwordInput, nextScreen, confirmInput, triggerError]); + + const onPrevious = useCallback(() => { + previousScreen({ + screenId: 'CreatePassword', + values: { password: passwordInput, confirmPassword: confirmInput }, + }); + }, [confirmInput, passwordInput, previousScreen]); + + const updateFields = useCallback( + (fields: { password: string; confirm: string }) => { + setPasswordInput(fields.password); + setConfirmInput(fields.confirm); + }, + [setPasswordInput, setConfirmInput] + ); + + const areValidMatchingPasswords = useCallback((): boolean => { + if (PasswordProps?.passwordRequirements?.length === 0) { + return confirmInput === passwordInput; + } + for (let i = 0; i < passwordRequirements.length; i++) { + if (!new RegExp(passwordRequirements[i].regex).test(passwordInput)) return false; + } + return confirmInput === passwordInput; + }, [PasswordProps?.passwordRequirements?.length, passwordRequirements, passwordInput, confirmInput]); + + const passwordProps = { + newPasswordLabel: t('bluiCommon:FORMS.PASSWORD'), + confirmPasswordLabel: t('bluiCommon:FORMS.CONFIRM_PASSWORD'), + passwordNotMatchError: t('bluiCommon:FORMS.PASS_MATCH_ERROR'), + passwordRequirements: PasswordProps?.passwordRequirements ?? passwordRequirements, + passwordRef, + confirmRef, + ...PasswordProps, + initialNewPasswordValue: passwordInput, + initialConfirmPasswordValue: confirmInput, + onPasswordChange: (passwordData: { password: string; confirm: string }): void => { + updateFields(passwordData); + PasswordProps?.onPasswordChange?.(passwordData); + }, + onSubmit: (): void => { + if (areValidMatchingPasswords()) { + void onNext(); + WorkflowCardActionsProps?.onNext?.(); + PasswordProps?.onSubmit?.(); + } + }, + }; + + const workflowCardBaseProps = { + loading: isLoading, + ...WorkflowCardBaseProps, + }; + + const workflowCardHeaderProps = { + title: t('bluiRegistration:REGISTRATION.STEPS.PASSWORD'), + ...WorkflowCardHeaderProps, + }; + + const workflowCardInstructionProps = { + instructions: t('bluiRegistration:REGISTRATION.INSTRUCTIONS.PASSWORD_INFO'), + ...WorkflowCardInstructionProps, + }; + + const workflowCardActionsProps = { + showNext: true, + nextLabel: t('bluiCommon:ACTIONS.NEXT'), + canGoNext: passwordInput !== '' && confirmInput !== '' && areValidMatchingPasswords(), + showPrevious: true, + previousLabel: t('bluiCommon:ACTIONS.BACK'), + canGoPrevious: true, + currentStep: currentScreen, + totalSteps: totalScreens, + ...WorkflowCardActionsProps, + onNext: (): void => { + void onNext(); + WorkflowCardActionsProps?.onNext?.(); + }, + onPrevious: (): void => { + void onPrevious(); + WorkflowCardActionsProps?.onPrevious?.(); + }, + }; + + return ( + + ); +}; diff --git a/login-workflow/src/screens/CreatePasswordScreen/CreatePasswordScreenBase.test.tsx b/login-workflow/src/screens/CreatePasswordScreen/CreatePasswordScreenBase.test.tsx new file mode 100644 index 00000000..5341e481 --- /dev/null +++ b/login-workflow/src/screens/CreatePasswordScreen/CreatePasswordScreenBase.test.tsx @@ -0,0 +1,82 @@ +import React from 'react'; +import '@testing-library/jest-dom'; +import { cleanup, render, screen, fireEvent } from '@testing-library/react'; +import { CreatePasswordScreenBase } from './CreatePasswordScreenBase'; +import { SetPasswordProps } from '../../components'; + +afterEach(cleanup); + +const defaultProps: SetPasswordProps = { + newPasswordLabel: '', + confirmPasswordLabel: '', + initialNewPasswordValue: '', + initialConfirmPasswordValue: '', + onPasswordChange: jest.fn(), +}; + +describe('Create Password Screen Base', () => { + let mockOnNext: any; + + afterEach(() => { + jest.clearAllMocks(); + }); + + beforeEach(() => { + mockOnNext = jest.fn(); + }); + + it('renders without crashing', () => { + render( + + ); + expect(screen.getByText('Create Password')).toBeInTheDocument(); + expect( + screen.getByText( + 'Please select a password. Make sure that your password meets the necessary complexity requirements outlined below.' + ) + ).toBeInTheDocument(); + expect(screen.getByText('Next')).toBeInTheDocument(); + expect(screen.getByText(/Next/i)).toBeEnabled(); + expect(screen.getByText('Back')).toBeInTheDocument(); + expect(screen.getByText(/Back/i)).toBeEnabled(); + }); + + it('calls onNext when the next button is clicked', () => { + const { getByText } = render( + + ); + + const nextButton = getByText('Next'); + fireEvent.click(nextButton); + + expect(mockOnNext).toHaveBeenCalled(); + }); +}); diff --git a/login-workflow/src/screens/CreatePasswordScreen/CreatePasswordScreenBase.tsx b/login-workflow/src/screens/CreatePasswordScreen/CreatePasswordScreenBase.tsx new file mode 100644 index 00000000..6e3c9916 --- /dev/null +++ b/login-workflow/src/screens/CreatePasswordScreen/CreatePasswordScreenBase.tsx @@ -0,0 +1,46 @@ +import React from 'react'; +import { CreatePasswordScreenProps } from './types'; +import { + WorkflowCard, + WorkflowCardActions, + WorkflowCardBody, + WorkflowCardHeader, + WorkflowCardInstructions, +} from '../../components'; +import { SetPassword } from '../../components/SetPassword'; +import ErrorManager from '../../components/Error/ErrorManager'; + +/** + * The component renders a screen with the password and confirm password field for creating a new password. + * + * @param errorDisplayConfig configuration for customizing how errors are displayed + * @param PasswordProps props passed from SetPassword component + * @param WorkflowCardBaseProps props that will be passed to the WorkflowCard component + * @param WorkflowCardHeaderProps props that will be passed to the WorkflowCardHeader component + * @param WorkflowCardInstructionProps props that will be passed to the WorkflowCardInstructions component + * @param WorkflowCardActionsProps props that will be passed to the WorkflowCardActions component + * + * @category Component + */ + +export const CreatePasswordScreenBase: React.FC> = (props) => { + const cardBaseProps = props.WorkflowCardBaseProps || {}; + const headerProps = props.WorkflowCardHeaderProps || {}; + const instructionsProps = props.WorkflowCardInstructionProps || {}; + const actionsProps = props.WorkflowCardActionsProps || {}; + const passwordProps = props.PasswordProps || { onPasswordChange: () => ({}) }; + const { errorDisplayConfig } = props; + + return ( + + + + + + + + + + + ); +}; diff --git a/login-workflow/src/screens/CreatePasswordScreen/index.ts b/login-workflow/src/screens/CreatePasswordScreen/index.ts new file mode 100644 index 00000000..74f6511a --- /dev/null +++ b/login-workflow/src/screens/CreatePasswordScreen/index.ts @@ -0,0 +1,3 @@ +export * from './CreatePasswordScreenBase'; +export * from './CreatePasswordScreen'; +export * from './types'; diff --git a/login-workflow/src/screens/CreatePasswordScreen/types.ts b/login-workflow/src/screens/CreatePasswordScreen/types.ts new file mode 100644 index 00000000..2adede0f --- /dev/null +++ b/login-workflow/src/screens/CreatePasswordScreen/types.ts @@ -0,0 +1,15 @@ +import { SetPasswordProps } from '../../components'; +import { ErrorManagerProps } from '../../components/Error'; +import { WorkflowCardProps } from '../../components/WorkflowCard/WorkflowCard.types'; + +export type CreatePasswordScreenProps = WorkflowCardProps & { + /** + * The props passed from SetPassword component + */ + PasswordProps?: SetPasswordProps; + + /** + * The configuration for customizing how errors are displayed + */ + errorDisplayConfig?: ErrorManagerProps; +}; diff --git a/login-workflow/src/screens/EulaScreen/EulaScreen.test.tsx b/login-workflow/src/screens/EulaScreen/EulaScreen.test.tsx new file mode 100644 index 00000000..ccacd33e --- /dev/null +++ b/login-workflow/src/screens/EulaScreen/EulaScreen.test.tsx @@ -0,0 +1,100 @@ +import React from 'react'; +import '@testing-library/jest-dom'; +import { cleanup, render, screen, RenderResult, fireEvent } from '@testing-library/react'; +import { EulaScreen } from './EulaScreen'; +import { RegistrationContextProvider } from '../../contexts'; +import { EulaScreenProps } from './types'; +import { RegistrationWorkflow } from '../../components'; +import { registrationContextProviderProps } from '../../testUtils'; +afterEach(cleanup); + +describe('Eula Screen', () => { + let mockOnNext: any; + let mockOnPrevious: any; + + afterEach(() => { + jest.clearAllMocks(); + }); + + beforeEach(() => { + mockOnNext = jest.fn(); + mockOnPrevious = jest.fn(); + }); + + const renderer = (props?: EulaScreenProps): RenderResult => + render( + + + + + + ); + + it('renders without crashing', () => { + renderer(); + + expect(screen.getByText('License Agreement')).toBeInTheDocument(); + }); + + it('should update values when passed as props', () => { + renderer({ WorkflowCardHeaderProps: { title: 'Test Title' } }); + + expect(screen.queryByText('License Agreement')).toBeNull(); + expect(screen.getByText('Test Title')).toBeInTheDocument(); + }); + + it('should update content of Eula Screen when eulaContent prop set ', () => { + renderer({ eulaContent: 'Test Eula Content' }); + expect(screen.getByText('Test Eula Content')).toBeInTheDocument(); + }); + + it('should show button when html prop is true', () => { + renderer({ html: true, eulaContent: '' }); + expect( + screen.getByRole('button', { + name: /Submit/i, + }) + ).toBeVisible(); + }); + + it('should show button element as as a string when html prop is true', () => { + renderer({ html: false, eulaContent: '' }); + expect(screen.getByText('')).toBeInTheDocument(); + }); + + it('should call onNext, when Next button clicked', () => { + const { getByLabelText } = renderer({ + WorkflowCardActionsProps: { + onNext: mockOnNext(), + showNext: true, + nextLabel: 'Next', + }, + }); + + const checkboxLabel = getByLabelText('I have read and agree to the Terms & Conditions'); + fireEvent.click(checkboxLabel); + fireEvent.change(checkboxLabel, { target: { accepted: true } }); + + const nextButton = screen.getByText('Next'); + expect(nextButton).toBeInTheDocument(); + expect(screen.getByText(/Next/i)).toBeEnabled(); + fireEvent.click(nextButton); + expect(mockOnNext).toHaveBeenCalled(); + }); + + it('should call onPrevious, when Back button clicked', () => { + renderer({ + WorkflowCardActionsProps: { + onPrevious: mockOnPrevious(), + showPrevious: true, + previousLabel: 'Back', + }, + }); + + const backButton = screen.getByText('Back'); + expect(backButton).toBeInTheDocument(); + expect(screen.getByText(/Back/i)).toBeEnabled(); + fireEvent.click(backButton); + expect(mockOnPrevious).toHaveBeenCalled(); + }); +}); diff --git a/login-workflow/src/screens/EulaScreen/EulaScreen.tsx b/login-workflow/src/screens/EulaScreen/EulaScreen.tsx new file mode 100644 index 00000000..34b4a3af --- /dev/null +++ b/login-workflow/src/screens/EulaScreen/EulaScreen.tsx @@ -0,0 +1,217 @@ +import React, { useCallback, useEffect, useState } from 'react'; +import { EulaScreenProps } from './types'; +import { EulaScreenBase } from './EulaScreenBase'; +import { useRegistrationContext, useRegistrationWorkflowContext } from '../../contexts'; +import { useErrorManager } from '../../contexts/ErrorContext/useErrorManager'; +import { useTranslation } from 'react-i18next'; + +/** + * Component that renders a screen displaying the EULA and requests acceptance via a checkbox. + * + * @param eulaContent the content to render for the EULA. Can be a plain string or HTML + * @param html true if the EULA should be rendered as HTML + * @param checkboxLabel label for the EULA checkbox + * @param initialCheckboxValue used to pre-populate the checked/unchecked checkbox when the screen loads + * @param checkboxProps used to set checkbox props + * @param onEulaAcceptedChange used to test eula checkbox accepted + * @param WorkflowCardBaseProps props that will be passed to the WorkflowCard component + * @param WorkflowCardHeaderProps props that will be passed to the WorkflowCardHeader component + * @param WorkflowCardInstructionProps props that will be passed to the WorkflowCardInstructions component + * @param WorkflowCardActionsProps props that will be passed to the WorkflowCardActions component + * @param errorDisplayConfig configuration for customizing how errors are displayed + * @param onRefetch used to refetch Eula content. + * + * @category Component + */ + +export const EulaScreen: React.FC = (props) => { + const { t } = useTranslation(); + const { actions, language } = useRegistrationContext(); + const { triggerError, errorManagerConfig } = useErrorManager(); + const errorDisplayConfig = { + ...errorManagerConfig, + ...props.errorDisplayConfig, + onClose: (): void => { + if (props.errorDisplayConfig && props.errorDisplayConfig.onClose) props.errorDisplayConfig.onClose(); + if (errorManagerConfig.onClose) errorManagerConfig?.onClose(); + }, + }; + const regWorkflow = useRegistrationWorkflowContext(); + const { + nextScreen, + previousScreen, + screenData, + currentScreen, + totalScreens, + isInviteRegistration, + updateScreenData, + } = regWorkflow; + const { + WorkflowCardBaseProps, + WorkflowCardHeaderProps, + WorkflowCardActionsProps, + eulaContent, + checkboxLabel = t('bluiRegistration:REGISTRATION.EULA.AGREE_TERMS'), + html, + initialCheckboxValue, + ...otherEulaScreenProps + } = props; + + const eulaAccepted = initialCheckboxValue ? initialCheckboxValue : screenData.Eula.accepted; + const [isLoading, setIsLoading] = useState(true); + const [eulaData, setEulaData] = useState(); + const [eulaFetchError, setEulaFetchError] = useState(false); + + const loadAndCacheEula = useCallback(async (): Promise => { + setIsLoading(true); + if (!eulaContent) { + setEulaData(t('bluiRegistration:REGISTRATION.EULA.LOADING')); + try { + const eulaText = await actions?.loadEula?.(language); + setEulaData(eulaText); + setIsLoading(false); + } catch (_error) { + triggerError(_error as Error); + setEulaFetchError(true); + setIsLoading(false); + } finally { + setIsLoading(false); + } + } else { + setIsLoading(false); + setEulaData(eulaContent); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [eulaContent, t, actions, language]); + + const onNext = useCallback(async (): Promise => { + setIsLoading(true); + try { + if (screenData.Eula.accepted) { + await actions?.acceptEula?.(); + } + let isAccExist; + if (isInviteRegistration) { + const { codeValid, accountExists } = + (await actions?.validateUserRegistrationRequest?.( + screenData.VerifyCode.code, + screenData.CreateAccount.emailAddress + )) || {}; + isAccExist = accountExists; + if (isAccExist) { + updateScreenData({ + screenId: 'Eula', + values: { accepted: screenData.Eula.accepted }, + isAccountExist: accountExists, + }); + } else { + if (typeof codeValid === 'boolean') { + if (codeValid) + void nextScreen({ + screenId: 'Eula', + values: { accepted: screenData.Eula.accepted }, + isAccountExist: accountExists, + }); + else { + triggerError( + new Error(t('bluiRegistration:SELF_REGISTRATION.VERIFY_EMAIL.CODE_VALIDATOR_ERROR')) + ); + } + } else { + triggerError(new Error(codeValid)); + } + } + } else { + void nextScreen({ + screenId: 'Eula', + values: { accepted: screenData.Eula.accepted }, + isAccountExist: isAccExist, + }); + } + } catch (_error) { + triggerError(_error as Error); + } finally { + setIsLoading(false); + } + }, [actions, nextScreen, triggerError, isInviteRegistration, screenData, t, updateScreenData]); + + const onPrevious = useCallback((): void => { + setIsLoading(true); + try { + previousScreen({ + screenId: 'Eula', + values: { accepted: eulaAccepted }, + }); + } catch (_error) { + triggerError(_error as Error); + } finally { + setIsLoading(false); + } + }, [previousScreen, triggerError, eulaAccepted]); + + const updateEulaAcceptedStatus = useCallback( + (accepted: boolean): void => { + screenData.Eula = { ...screenData, accepted }; + props?.onEulaAcceptedChange?.(accepted); + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [screenData] + ); + + useEffect(() => { + void loadAndCacheEula(); + }, [loadAndCacheEula]); + + const { + checkboxProps = { ...props.checkboxProps, disabled: eulaFetchError }, + onRefetch = (): void => { + setEulaFetchError(false); + void loadAndCacheEula(); + }, + } = props; + + const workflowCardHeaderProps = { + title: t('bluiRegistration:REGISTRATION.STEPS.LICENSE'), + ...WorkflowCardHeaderProps, + }; + + const workflowCardActionsProps = { + showNext: true, + nextLabel: t('bluiCommon:ACTIONS.NEXT'), + canGoNext: true, + showPrevious: true, + previousLabel: t('bluiCommon:ACTIONS.BACK'), + canGoPrevious: true, + currentStep: currentScreen, + totalSteps: totalScreens, + ...WorkflowCardActionsProps, + onNext: (): void => { + void onNext(); + WorkflowCardActionsProps?.onNext?.(); + }, + onPrevious: (): void => { + void onPrevious(); + WorkflowCardActionsProps?.onPrevious?.(); + }, + }; + + return ( + + ); +}; diff --git a/login-workflow/src/screens/EulaScreen/EulaScreenBase.test.tsx b/login-workflow/src/screens/EulaScreen/EulaScreenBase.test.tsx new file mode 100644 index 00000000..3e5b3f72 --- /dev/null +++ b/login-workflow/src/screens/EulaScreen/EulaScreenBase.test.tsx @@ -0,0 +1,125 @@ +import React from 'react'; +import '@testing-library/jest-dom'; +import { cleanup, render, screen, fireEvent, RenderResult } from '@testing-library/react'; +import { EulaScreenBase } from './EulaScreenBase'; +import { RegistrationContextProvider } from '../../contexts'; +import { EulaScreenProps } from './types'; +import { RegistrationWorkflow } from '../../components'; +import { registrationContextProviderProps } from '../../testUtils'; +// Constants +import { SAMPLE_EULA } from '../../constants/index'; + +afterEach(cleanup); + +const renderer = (props?: EulaScreenProps): RenderResult => + render( + + + + + + ); + +describe('Eula Screen Base', () => { + renderer(); + it('renders without crashing', () => { + render( + accepted} + WorkflowCardActionsProps={{ + showNext: true, + nextLabel: 'Next', + canGoNext: true, + showPrevious: true, + previousLabel: 'Back', + canGoPrevious: true, + currentStep: 0, + totalSteps: 6, + }} + /> + ); + expect(screen.getByText('License Agreement')).toBeInTheDocument(); + expect(screen.getByText('I have read and agree to the Terms & Conditions')).toBeInTheDocument(); + expect(screen.getByText('Next')).toBeInTheDocument(); + expect(screen.getByText('Back')).toBeInTheDocument(); + expect(screen.getByText(/Back/i)).toBeEnabled(); + }); + + it('next button is disabled when eula not accepted', () => { + render( + accepted} + WorkflowCardActionsProps={{ + showNext: true, + nextLabel: 'Next', + canGoNext: true, + showPrevious: true, + previousLabel: 'Back', + canGoPrevious: true, + currentStep: 0, + totalSteps: 6, + }} + /> + ); + expect(screen.getByText('Next')).toBeInTheDocument(); + expect(screen.getByText('Next')).not.toBeEnabled(); + }); + + it('next button is enabled when eula accepted', () => { + const { getByLabelText, rerender } = render( + accepted} + WorkflowCardActionsProps={{ + showNext: true, + nextLabel: 'Next', + canGoNext: true, + showPrevious: true, + previousLabel: 'Back', + canGoPrevious: true, + currentStep: 0, + totalSteps: 6, + }} + /> + ); + + // Rerender to ensure state changes have taken effect + rerender( + accepted} + WorkflowCardActionsProps={{ + showNext: true, + nextLabel: 'Next', + canGoNext: true, + showPrevious: true, + previousLabel: 'Back', + canGoPrevious: true, + currentStep: 0, + totalSteps: 6, + }} + /> + ); + + const checkboxLabel = getByLabelText('I have read and agree to the Terms & Conditions'); + fireEvent.click(checkboxLabel); + fireEvent.change(checkboxLabel, { target: { accepted: true } }); + + expect(screen.getByText('Next')).toBeInTheDocument(); + expect(screen.getByText('Next')).toBeEnabled(); + }); +}); diff --git a/login-workflow/src/screens/EulaScreen/EulaScreenBase.tsx b/login-workflow/src/screens/EulaScreen/EulaScreenBase.tsx new file mode 100644 index 00000000..200112d5 --- /dev/null +++ b/login-workflow/src/screens/EulaScreen/EulaScreenBase.tsx @@ -0,0 +1,131 @@ +import React, { useCallback, useState } from 'react'; +import { EulaScreenProps } from './types'; +import { + WorkflowCard, + WorkflowCardActions, + WorkflowCardBody, + WorkflowCardHeader, + WorkflowCardInstructions, +} from '../../components/WorkflowCard'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Checkbox from '@mui/material/Checkbox'; +import Box from '@mui/material/Box'; +import DOMPurify from 'dompurify'; +import ErrorManager from '../../components/Error/ErrorManager'; +import { Typography } from '@mui/material'; +import ReplaySharpIcon from '@mui/icons-material/ReplaySharp'; + +/** + * Component that renders a screen displaying the EULA and requests acceptance via a checkbox. + * + * @param eulaContent the content to render for the EULA. Can be a plain string or HTML + * @param html true if the EULA should be rendered as HTML + * @param checkboxLabel label for the EULA checkbox + * @param initialCheckboxValue used to pre-populate the checked/unchecked checkbox when the screen loads + * @param checkboxProps used to set checkbox props + * @param onEulaAcceptedChange called when the checkbox clicked + * @param WorkflowCardBaseProps props that will be passed to the WorkflowCard component + * @param WorkflowCardHeaderProps props that will be passed to the WorkflowCardHeader component + * @param WorkflowCardInstructionProps props that will be passed to the WorkflowCardInstructions component + * @param WorkflowCardActionsProps props that will be passed to the WorkflowCardActions component + * @param errorDisplayConfig configuration for customizing how errors are displayed + * @param onRefetch used to refetch Eula content. + * + * @category Component + */ + +export const EulaScreenBase: React.FC = (props) => { + const { + onEulaAcceptedChange, + eulaContent, + checkboxLabel, + html, + initialCheckboxValue, + checkboxProps, + errorDisplayConfig, + onRefetch, + } = props; + + const cardBaseProps = props.WorkflowCardBaseProps || {}; + const headerProps = props.WorkflowCardHeaderProps || {}; + const instructionsProps = props.WorkflowCardInstructionProps || {}; + const actionsProps = props.WorkflowCardActionsProps || {}; + + const [eulaAccepted, setEulaAccepted] = useState(initialCheckboxValue ?? false); + + const handleEulaAcceptedChecked = useCallback( + (accepted: boolean) => { + setEulaAccepted(accepted); + onEulaAcceptedChange?.(accepted); + }, + [onEulaAcceptedChange] + ); + + const handleOnNext = (): void => { + const { onNext } = actionsProps; + if (onNext) onNext({ accepted: eulaAccepted }); + }; + + return ( + + + {Object.keys(instructionsProps).length !== 0 && } + + {checkboxProps?.disabled ? ( + + + + + Retry + + + + ) : html ? ( + + ) : ( + {eulaContent} + )} + + ): void => + handleEulaAcceptedChecked(event.target.checked) + } + {...checkboxProps} + /> + } + label={checkboxLabel} + sx={{ flex: '0 0 auto', mr: 0, mt: 2 }} + onKeyUp={(e): void => { + if (e.key === 'Enter' && eulaAccepted) handleOnNext(); + }} + /> + + + + + ); +}; diff --git a/login-workflow/src/screens/EulaScreen/index.ts b/login-workflow/src/screens/EulaScreen/index.ts new file mode 100644 index 00000000..00bf82d1 --- /dev/null +++ b/login-workflow/src/screens/EulaScreen/index.ts @@ -0,0 +1,3 @@ +export * from './EulaScreen'; +export * from './EulaScreenBase'; +export * from './types'; diff --git a/login-workflow/src/screens/EulaScreen/types.ts b/login-workflow/src/screens/EulaScreen/types.ts new file mode 100644 index 00000000..5befc015 --- /dev/null +++ b/login-workflow/src/screens/EulaScreen/types.ts @@ -0,0 +1,50 @@ +import { CheckboxProps } from '@mui/material'; +import { WorkflowCardProps } from '../../components/WorkflowCard/WorkflowCard.types'; +import { ErrorManagerProps } from '../../components/Error'; + +export type EulaScreenProps = WorkflowCardProps & { + /** + * The content to render for the EULA. Can be a plain string or HTML + */ + eulaContent?: string | JSX.Element; + + /** + * The label for the EULA checkbox + */ + checkboxLabel?: string; + + /** + * Used to set checkbox props + */ + checkboxProps?: CheckboxProps; + + /** + * The EULA should be rendered as HTML + * @default false + */ + html?: boolean; + + /** + * Used to pre-populate the checked/unchecked checkbox when the screen loads + * @default false + */ + initialCheckboxValue?: boolean; + + /** + * Function called when the checkbox clicked + * @param {boolean} accepted - verify Eula accepted + * @returns void + */ + onEulaAcceptedChange?: (accepted: boolean) => void; + + /** + * The configuration for customizing how errors are displayed + */ + errorDisplayConfig?: ErrorManagerProps; + + /** + * Function to refetch Eula content + * @returns void + */ + onRefetch?: () => void; +}; diff --git a/login-workflow/src/screens/ExistingAccountSuccessScreen/ExistingAccountSuccessScreen.test.tsx b/login-workflow/src/screens/ExistingAccountSuccessScreen/ExistingAccountSuccessScreen.test.tsx new file mode 100644 index 00000000..b5655b4e --- /dev/null +++ b/login-workflow/src/screens/ExistingAccountSuccessScreen/ExistingAccountSuccessScreen.test.tsx @@ -0,0 +1,15 @@ +import React from 'react'; +import { render } from '@testing-library/react'; +import { ExistingAccountSuccessScreen } from './ExistingAccountSuccessScreen'; +import { RegistrationContextProvider } from '../../contexts'; +import { registrationContextProviderProps } from '../../testUtils'; + +describe('ExistingAccountSuccessScreen', () => { + it('rendering the screen without any props', () => { + render( + + + + ); + }); +}); diff --git a/login-workflow/src/screens/ExistingAccountSuccessScreen/ExistingAccountSuccessScreen.tsx b/login-workflow/src/screens/ExistingAccountSuccessScreen/ExistingAccountSuccessScreen.tsx new file mode 100644 index 00000000..af89ba2b --- /dev/null +++ b/login-workflow/src/screens/ExistingAccountSuccessScreen/ExistingAccountSuccessScreen.tsx @@ -0,0 +1,62 @@ +import React from 'react'; +import { Person } from '@mui/icons-material'; +import { useRegistrationContext } from '../../contexts'; +import { SuccessScreenBase, SuccessScreenProps } from '../SuccessScreen'; +import { useTranslation } from 'react-i18next'; + +/** + * Full Screen component that renders a Success Screen for the accounts which are already exists in the records + * + * @param icon the icon to be displayed on the screen + * @param messageTitle title of the success message + * @param message success message to be displayed on the screen + * @param dismissButtonLabel to display label for the button + * @param canDismiss boolean flag prop to dismiss the success screen or not + * @param onDismiss function to call when the dismiss button is clicked + * + * @category Component + */ + +export const ExistingAccountSuccessScreen: React.FC = (props) => { + const { t } = useTranslation(); + const { navigate, routeConfig } = useRegistrationContext(); + + const { + icon = , + messageTitle = t('bluiCommon:MESSAGES.WELCOME'), + message = t('bluiRegistration:REGISTRATION.SUCCESS_EXISTING'), + canDismiss = true, + onDismiss = (): void => navigate(routeConfig.LOGIN as string), + WorkflowCardHeaderProps, + WorkflowCardActionsProps, + ...otherExistingAccountSuccessScreenProps + } = props; + + const workflowCardHeaderProps = { + title: t('bluiRegistration:REGISTRATION.STEPS.COMPLETE'), + ...WorkflowCardHeaderProps, + }; + + const workflowCardActionsProps = { + nextLabel: t('bluiCommon:ACTIONS.CONTINUE'), + showNext: true, + canGoNext: canDismiss, + fullWidthButton: true, + ...WorkflowCardActionsProps, + onNext: (): void => { + onDismiss(); + WorkflowCardActionsProps?.onNext?.(); + }, + }; + + return ( + + ); +}; diff --git a/login-workflow/src/screens/ExistingAccountSuccessScreen/index.ts b/login-workflow/src/screens/ExistingAccountSuccessScreen/index.ts new file mode 100644 index 00000000..fa8e4d03 --- /dev/null +++ b/login-workflow/src/screens/ExistingAccountSuccessScreen/index.ts @@ -0,0 +1 @@ +export * from './ExistingAccountSuccessScreen'; diff --git a/login-workflow/src/screens/ForgotPassword.tsx b/login-workflow/src/screens/ForgotPassword.tsx deleted file mode 100644 index cf00c573..00000000 --- a/login-workflow/src/screens/ForgotPassword.tsx +++ /dev/null @@ -1,199 +0,0 @@ -import React, { useEffect, ChangeEvent, useCallback } from 'react'; -import { - useLanguageLocale, - useAccountUIState, - useAccountUIActions, - AccountActions, - EMAIL_REGEX, - useInjectedUIContext, -} from '@brightlayer-ui/react-auth-shared'; -import { Trans } from 'react-i18next'; -import { useNavigate } from 'react-router-dom'; -import { BrandedCardContainer, SimpleDialog, FinishState } from '../components'; -import Button from '@mui/material/Button'; -import CardActions from '@mui/material/CardActions'; -import CardContent from '@mui/material/CardContent'; -import CardHeader from '@mui/material/CardHeader'; -import Divider from '@mui/material/Divider'; -import Typography from '@mui/material/Typography'; -import Grid from '@mui/material/Grid'; -import TextField from '@mui/material/TextField'; -import { SxProps, Theme, useTheme } from '@mui/material/styles'; -import CheckCircle from '@mui/icons-material/CheckCircle'; -import { - DialogButtonStyles, - DialogActionsStyles, - DialogContentStyles, - DialogTitleStyles, - FullDividerStyles, -} from '../styles'; -import Box from '@mui/material/Box'; - -const LinkStyles = (theme: Theme): SxProps => ({ - fontWeight: 600, - color: theme.palette.primary.main, - textTransform: 'none', - textDecoration: 'none', - '&:visited': { - color: theme.palette.primary.main, - }, -}); - -/** - * Renders the screen for Forgot Password where a user enters their - * email to receive a reset link. - * - * @category Component - */ -export const ForgotPassword: React.FC> = () => { - const { t } = useLanguageLocale(); - const navigate = useNavigate(); - const theme = useTheme(); - const accountUIState = useAccountUIState(); - const accountUIActions = useAccountUIActions(); - const { contactPhone } = useInjectedUIContext(); - - // Local state - const [emailInput, setEmailInput] = React.useState(''); - const [hasAcknowledgedError, setHasAcknowledgedError] = React.useState(false); - - // Network state (forgotPassword) - const forgotPasswordTransit = accountUIState.forgotPassword; - const isInTransit = forgotPasswordTransit.transitInProgress; - const hasTransitError = forgotPasswordTransit.transitErrorMessage !== null; - const transitErrorMessage = forgotPasswordTransit.transitErrorMessage; - const finished = accountUIState.forgotPassword.transitSuccess; - - const resetPassword = useCallback( - (email: string): void => { - setHasAcknowledgedError(false); - void accountUIActions.actions.forgotPassword(email); - }, - [setHasAcknowledgedError, accountUIActions] - ); - - const canContinue = useCallback( - (): boolean => EMAIL_REGEX.test(emailInput) && !accountUIState.forgotPassword.transitInProgress, - [emailInput, accountUIState] - ); - - const onContinue = useCallback((): void => { - if (accountUIState.forgotPassword.transitSuccess) { - navigate(-1); - } else { - resetPassword(emailInput); - } - }, [accountUIState, resetPassword, navigate, emailInput]); - - // Reset state on dismissal - useEffect( - () => (): void => { - accountUIActions.dispatch(AccountActions.resetPasswordReset()); - }, // eslint-disable-next-line react-hooks/exhaustive-deps - [] - ); - - // Dynamic Elements - const errorDialog = ( - { - setHasAcknowledgedError(true); - }} - /> - ); - - let body: JSX.Element; - if (accountUIState.forgotPassword.transitSuccess) { - body = ( - } - title={t('blui:MESSAGES.EMAIL_SENT')} - description={ - - Link has been sent to {emailInput}. - - } - /> - ); - } else { - body = ( - <> - - - Please enter your email, we will respond in one business day. For urgent issues please - call{' '} - - {contactPhone} - - . - - - - - - ): void => setEmailInput(evt.target.value)} - onKeyPress={(e): void => { - if (e.key === 'Enter' && canContinue()) onContinue(); - }} - variant="filled" - error={hasTransitError} - helperText={hasTransitError ? t('blui:FORGOT_PASSWORD.ERROR') : ''} - /> - - ); - } - - return ( - - {errorDialog} - - {t('blui:HEADER.FORGOT_PASSWORD')} - - } - sx={DialogTitleStyles(theme)} - /> - {body} - - - - {!finished && ( - - )} - - - - - ); -}; diff --git a/login-workflow/src/screens/ForgotPasswordScreen/ForgotPasswordScreen.test.tsx b/login-workflow/src/screens/ForgotPasswordScreen/ForgotPasswordScreen.test.tsx new file mode 100644 index 00000000..738089fd --- /dev/null +++ b/login-workflow/src/screens/ForgotPasswordScreen/ForgotPasswordScreen.test.tsx @@ -0,0 +1,189 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import React from 'react'; +import { cleanup, fireEvent, render, RenderResult, screen } from '@testing-library/react'; +import { ForgotPasswordScreenProps } from './types'; +import { AuthContextProvider } from '../../contexts'; +import { BrowserRouter } from 'react-router-dom'; +import { ForgotPasswordScreen } from './ForgotPasswordScreen'; +import '@testing-library/jest-dom'; +import Box from '@mui/material/Box'; +import { authContextProviderProps } from '../../testUtils'; + +afterEach(cleanup); + +describe('Forgot Password Screen tests', () => { + let mockOnNext: any; + let mockOnPrevious: any; + + afterEach(() => { + jest.clearAllMocks(); + }); + + beforeEach(() => { + mockOnNext = jest.fn(); + mockOnPrevious = jest.fn(); + }); + + const renderer = (props?: ForgotPasswordScreenProps): RenderResult => + render( + + + + + + ); + + it('renders without crashing', () => { + renderer(); + + expect(screen.getByText('Forgot Password')).toBeInTheDocument(); + }); + + it('renders with props crashing', () => { + renderer({ + emailLabel: 'Email Address', + initialEmailValue: '', + emailValidator: (): any => {}, + contactPhone: '', + }); + + expect(screen.getByText('Forgot Password')).toBeInTheDocument(); + }); + + it('email validation test', () => { + const { getByLabelText } = renderer(); + + const emailInput = getByLabelText('Email Address'); + expect(emailInput).toHaveValue(''); + fireEvent.change(emailInput, { target: { value: 'aa@aa.aa' } }); + expect(emailInput).toHaveValue('aa@aa.aa'); + }); + + it('firing onPrevious Callback functions', () => { + renderer({ + WorkflowCardActionsProps: { + canGoPrevious: true, + showPrevious: true, + previousLabel: 'Back', + onPrevious: mockOnPrevious(), + }, + }); + + const previousButton = screen.getByText('Back'); + expect(previousButton).toBeInTheDocument(); + fireEvent.click(previousButton); + expect(mockOnPrevious).toHaveBeenCalled(); + }); + + it('firing onNext Callback functions', () => { + const { getByLabelText } = renderer({ + WorkflowCardActionsProps: { + canGoNext: true, + showNext: true, + nextLabel: 'Next', + onNext: mockOnNext(), + }, + }); + + const emailInput = getByLabelText('Email Address'); + const nextButton = screen.getByText('Next'); + expect(emailInput).toHaveValue(''); + expect(screen.getByText(/Next/i)).toBeDisabled(); + fireEvent.change(emailInput, { target: { value: 'aa@aa.aa' } }); + fireEvent.blur(emailInput); + expect(emailInput).toHaveValue('aa@aa.aa'); + + expect(nextButton).toBeInTheDocument(); + expect(screen.getByText(/Next/i)).toBeEnabled(); + fireEvent.click(nextButton); + expect(mockOnNext).toHaveBeenCalled(); + }); + + it('should show success screen, when next button is clicked', async () => { + const { getByLabelText } = render( + + + + + + ); + + const emailInput = getByLabelText('Email Address'); + const nextButton = screen.getByText('Submit'); + fireEvent.change(emailInput, { target: { value: 'aa@aa.aa' } }); + fireEvent.blur(emailInput); + expect(emailInput).toHaveValue('aa@aa.aa'); + expect(nextButton).toBeInTheDocument(); + expect(screen.getByText(/Submit/i)).toBeEnabled(); + fireEvent.click(nextButton); + + const successMessage = await screen.findByText('Email Sent'); + expect(successMessage).toBeInTheDocument(); + }); + + it('should not show success screen, when showSuccessScreen is false', () => { + const { getByLabelText } = render( + + + + + + ); + + const emailInput = getByLabelText('Email Address'); + const nextButton = screen.getByText('Submit'); + fireEvent.change(emailInput, { target: { value: 'aa@aa.aa' } }); + fireEvent.blur(emailInput); + expect(emailInput).toHaveValue('aa@aa.aa'); + expect(nextButton).toBeInTheDocument(); + expect(screen.getByText(/Submit/i)).toBeEnabled(); + fireEvent.click(nextButton); + + const successMessage = screen.queryByText('Email Sent'); + expect(successMessage).toBeNull(); + }); + + it('should show custom success screen, when passed in slots', async () => { + const { getByLabelText } = render( + + + Success }} /> + + + ); + + const emailInput = getByLabelText('Email Address'); + const nextButton = screen.getByText('Submit'); + fireEvent.change(emailInput, { target: { value: 'aa@aa.aa' } }); + fireEvent.blur(emailInput); + expect(emailInput).toHaveValue('aa@aa.aa'); + expect(nextButton).toBeInTheDocument(); + expect(screen.getByText(/Submit/i)).toBeEnabled(); + fireEvent.click(nextButton); + + const successMessage = await screen.findByText('Success'); + expect(successMessage).toBeInTheDocument(); + }); + + it('should show loader, when loading prop is passed to WorkflowCardBaseProps', () => { + renderer({ WorkflowCardBaseProps: { loading: true } }); + + expect(screen.getByTestId('blui-spinner')).toBeInTheDocument(); + }); + + it('should disable submit button when initialEmailValue prop is invalid', () => { + render( + + + + + + ); + + const nextButton = screen.getByText('Submit'); + + expect(nextButton).toBeInTheDocument(); + expect(screen.getByText(/Submit/i)).toBeDisabled(); + expect(screen.getByText(/Please enter a valid email/i)).toBeInTheDocument(); + }); +}); diff --git a/login-workflow/src/screens/ForgotPasswordScreen/ForgotPasswordScreen.tsx b/login-workflow/src/screens/ForgotPasswordScreen/ForgotPasswordScreen.tsx new file mode 100644 index 00000000..83707e0b --- /dev/null +++ b/login-workflow/src/screens/ForgotPasswordScreen/ForgotPasswordScreen.tsx @@ -0,0 +1,184 @@ +import React, { useCallback, useState } from 'react'; +import { Trans, useTranslation } from 'react-i18next'; +import Box from '@mui/material/Box'; +import { useAuthContext } from '../../contexts'; +import { ForgotPasswordScreenBase } from './ForgotPasswordScreenBase'; +import { ForgotPasswordScreenProps } from './types'; +import Typography from '@mui/material/Typography'; +import CheckCircle from '@mui/icons-material/CheckCircle'; +import { LinkStyles } from '../../styles'; +import { useErrorManager } from '../../contexts/ErrorContext/useErrorManager'; + +/** + * Component renders a screen with forgot password for support with the application. + * + * @param emailLabel label for the email field + * @param initialEmailValue initial value for the email text field + * @param emailValidator function used to test the input for valid formatting + * @param showSuccessScreen used to determine whether to show a success screen after the form is submitted + * @param slots used for ForgotPasswordScreen SuccessScreen + * @param slotProps applied to slot from SuccessScreen + * @param WorkflowCardBaseProps props that will be passed to the WorkflowCard component + * @param WorkflowCardHeaderProps props that will be passed to the WorkflowCardHeader component + * @param WorkflowCardInstructionProps props that will be passed to the WorkflowCardInstructions component + * @param WorkflowCardActionsProps props that will be passed to the WorkflowCardActions component + * @param errorDisplayConfig configuration for customizing how errors are displayed + * @param emailTextFieldProps props to pass to the email field. + * + * @category Component + */ + +export const ForgotPasswordScreen: React.FC = (props) => { + const { t } = useTranslation(); + const { actions, navigate, routeConfig } = useAuthContext(); + const { triggerError, errorManagerConfig } = useErrorManager(); + const errorDisplayConfig = { + ...errorManagerConfig, + ...props.errorDisplayConfig, + onClose: (): void => { + if (props.errorDisplayConfig && props.errorDisplayConfig.onClose) props.errorDisplayConfig.onClose(); + if (errorManagerConfig.onClose) errorManagerConfig?.onClose(); + }, + }; + + const [emailInput, setEmailInput] = useState(''); + const [isLoading, setIsLoading] = useState(false); + const [showSuccessScreen, setShowSuccessScreen] = useState(false); + + const EMAIL_REGEX = /^[A-Z0-9._%+'-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i; + + const handleOnNext = useCallback( + async (email: string): Promise => { + try { + setIsLoading(true); + await actions.forgotPassword(email); + if (props.showSuccessScreen === false) { + navigate(routeConfig.LOGIN as string); + } else { + setShowSuccessScreen(true); + } + } catch (_error) { + triggerError(_error as Error); + } finally { + setIsLoading(false); + } + }, + [actions, triggerError] + ); + + const { + emailLabel = t('bluiCommon:LABELS.EMAIL'), + contactPhone = '1-800-123-4567', + initialEmailValue, + description, + responseTime = t('bluiAuth:FORGOT_PASSWORD.RESPONSE_TIME'), + emailValidator = (email: string): boolean | string => + new RegExp(EMAIL_REGEX).test(email) ? true : t('bluiCommon:MESSAGES.EMAIL_ENTRY_ERROR'), + WorkflowCardBaseProps, + WorkflowCardHeaderProps, + WorkflowCardInstructionProps, + WorkflowCardActionsProps, + showSuccessScreen: enableSuccessScreen = true, + slots = {}, + slotProps = {}, + emailTextFieldProps, + } = props; + + const workflowCardBaseProps = { + loading: isLoading, + ...WorkflowCardBaseProps, + }; + + const workflowCardInstructionProps = { + instructions: description ? ( + {description(responseTime)} + ) : ( + + + Please enter your email, we will respond in {responseTime}. For urgent issues please call{' '} + + {contactPhone} + + {'.'} + + + ), + ...WorkflowCardInstructionProps, + }; + + const workflowCardHeaderProps = { + title: t('bluiAuth:HEADER.FORGOT_PASSWORD'), + ...WorkflowCardHeaderProps, + }; + + const workflowCardActionsProps = { + showNext: true, + showPrevious: true, + nextLabel: t('bluiCommon:ACTIONS.SUBMIT'), + previousLabel: t('bluiCommon:ACTIONS.BACK'), + canGoNext: true, + canGoPrevious: true, + ...WorkflowCardActionsProps, + onNext: (data: any): void => { + setEmailInput(data.email); + void handleOnNext(data.email); + WorkflowCardActionsProps?.onNext?.(); + }, + onPrevious: (): void => { + navigate(routeConfig.LOGIN as string); + WorkflowCardActionsProps?.onPrevious?.(); + }, + }; + + return ( + , + messageTitle: t('bluiCommon:MESSAGES.EMAIL_SENT'), + message: ( + + + Link has been sent to {emailInput}. + + + ), + WorkflowCardHeaderProps: { + title: t('bluiAuth:HEADER.FORGOT_PASSWORD'), + }, + WorkflowCardActionsProps: { + showNext: true, + nextLabel: t('bluiCommon:ACTIONS.DONE'), + canGoNext: true, + fullWidthButton: true, + onNext: (): void => { + navigate(routeConfig.LOGIN as string); + }, + }, + ...slotProps.SuccessScreen, + }, + }} + errorDisplayConfig={errorDisplayConfig} + /> + ); +}; diff --git a/login-workflow/src/screens/ForgotPasswordScreen/ForgotPasswordScreenBase.test.tsx b/login-workflow/src/screens/ForgotPasswordScreen/ForgotPasswordScreenBase.test.tsx new file mode 100644 index 00000000..fec1caac --- /dev/null +++ b/login-workflow/src/screens/ForgotPasswordScreen/ForgotPasswordScreenBase.test.tsx @@ -0,0 +1,199 @@ +import React from 'react'; +import '@testing-library/jest-dom'; +import { cleanup, render, screen, fireEvent } from '@testing-library/react'; +import { ForgotPasswordScreenBase } from './ForgotPasswordScreenBase'; +import Box from '@mui/material/Box'; + +afterEach(cleanup); + +describe('Forgot Password Screen Base', () => { + let mockOnNext: any; + + afterEach(() => { + jest.clearAllMocks(); + }); + + beforeEach(() => { + mockOnNext = jest.fn(); + }); + + it('renders without crashing', () => { + render( + Success }} + /> + ); + expect(screen.getByText('Forgot Password')).toBeInTheDocument(); + expect(screen.getByText('Forgot Password instructions')).toBeInTheDocument(); + expect(screen.getByText('Next')).toBeInTheDocument(); + expect(screen.getByText(/Next/i)).toBeEnabled(); + expect(screen.getByText('Back')).toBeInTheDocument(); + expect(screen.getByText(/Back/i)).toBeEnabled(); + }); + + it('sets error state when email is too short', () => { + const { getByLabelText, rerender } = render( + { + if (email?.length > 6) { + return true; + } + return 'Please enter a valid email'; + }} + slots={{ SuccessScreen: (): JSX.Element => Success }} + /> + ); + + const verifyEmailInput = getByLabelText('Email Address'); + fireEvent.change(verifyEmailInput, { target: { value: 't' } }); + fireEvent.blur(verifyEmailInput); + + // Rerender to ensure state changes have taken effect + rerender( + { + if (email?.length > 6) { + return true; + } + return 'Please enter a valid email'; + }} + slots={{ SuccessScreen: (): JSX.Element => Success }} + /> + ); + expect(verifyEmailInput).toHaveAttribute('aria-invalid', 'true'); + }); + + it('it disables next button when initialEmailValue prop is invalid', () => { + render( + { + if (email?.length > 5) { + return true; + } + return 'Please enter a valid email'; + }} + WorkflowCardActionsProps={{ + showNext: true, + nextLabel: 'Next', + showPrevious: true, + previousLabel: 'Back', + canGoNext: true, + }} + slots={{ SuccessScreen: (): JSX.Element => Success }} + /> + ); + expect(screen.getByText('Forgot Password')).toBeInTheDocument(); + expect(screen.getByText('Next')).toBeInTheDocument(); + expect(screen.getByText(/Next/i)).toBeDisabled(); + }); + + it('does not set error state when email is long enough', () => { + const { getByLabelText, rerender } = render( + { + if (email?.length > 2) { + return true; + } + return 'Please enter a valid email'; + }} + slots={{ SuccessScreen: (): JSX.Element => Success }} + /> + ); + + const verifyEmailInput = getByLabelText('Email Address'); + fireEvent.change(verifyEmailInput, { target: { value: 'test' } }); + fireEvent.blur(verifyEmailInput); + + // Rerender to ensure state changes have taken effect + rerender( + { + if (email?.length > 1) { + return true; + } + return 'Please enter a valid email'; + }} + slots={{ SuccessScreen: (): JSX.Element => Success }} + /> + ); + expect(verifyEmailInput).not.toHaveAttribute('aria-invalid', 'true'); + }); + + it('calls onNext when the next button is clicked', () => { + const { getByText } = render( + Success }} + /> + ); + + const nextButton = getByText('Next'); + fireEvent.click(nextButton); + + expect(mockOnNext).toHaveBeenCalled(); + }); + + it('pre-populates the email input field with initialEmailValue', () => { + const { getByLabelText } = render( + { + if (email?.length > 1) { + return true; + } + return 'Please enter a valid email'; + }} + slots={{ SuccessScreen: (): JSX.Element => Success }} + /> + ); + + const emailInput = getByLabelText('Email Address'); + expect(emailInput).toHaveValue('te'); + }); + + it('displays title, instructions and emailLabel correctly', () => { + const { getByText } = render( + Success }} + /> + ); + + expect(getByText('Title')).toBeInTheDocument(); + expect(getByText('Instructions')).toBeInTheDocument(); + expect(getByText('Email Address')).toBeInTheDocument(); + }); +}); diff --git a/login-workflow/src/screens/ForgotPasswordScreen/ForgotPasswordScreenBase.tsx b/login-workflow/src/screens/ForgotPasswordScreen/ForgotPasswordScreenBase.tsx new file mode 100644 index 00000000..9d821c3c --- /dev/null +++ b/login-workflow/src/screens/ForgotPasswordScreen/ForgotPasswordScreenBase.tsx @@ -0,0 +1,131 @@ +import React, { useCallback, useState } from 'react'; +import TextField from '@mui/material/TextField'; +import { + WorkflowCard, + WorkflowCardActions, + WorkflowCardBody, + WorkflowCardHeader, + WorkflowCardInstructions, +} from '../../components'; +import { ForgotPasswordScreenProps } from './types'; +import { SuccessScreenBase, SuccessScreenProps } from '../SuccessScreen'; +import ErrorManager from '../../components/Error/ErrorManager'; + +/** + * Component renders a screen with forgot password for support with the application. + * + * @param emailLabel label for the email field + * @param initialEmailValue initial value for the email text field + * @param emailValidator function used to test the input for valid formatting + * @param canGoNext boolean or function that indicates whether the next button should be enabled + * @param showSuccessScreen used to determine whether to show a success screen after the form is submitted + * @param slots used for ForgotPasswordScreen SuccessScreen + * @param slotProps applied to slot from SuccessScreen + * @param WorkflowCardBaseProps props that will be passed to the WorkflowCard component + * @param WorkflowCardHeaderProps props that will be passed to the WorkflowCardHeader component + * @param WorkflowCardInstructionProps props that will be passed to the WorkflowCardInstructions component + * @param WorkflowCardActionsProps props that will be passed to the WorkflowCardActions component + * @param errorDisplayConfig configuration for customizing how errors are displayed + * @param emailTextFieldProps props to pass to the email field. + * + * @category Component + */ + +export const ForgotPasswordScreenBase: React.FC> = (props) => { + const [emailInput, setEmailInput] = useState(props.initialEmailValue ?? ''); + + const { + emailLabel, + initialEmailValue = '', + // eslint-disable-next-line @typescript-eslint/no-unused-vars + emailValidator = (email: string): boolean | string => true, + slots, + slotProps = {}, + showSuccessScreen, + errorDisplayConfig, + emailTextFieldProps, + } = props; + + const cardBaseProps = props.WorkflowCardBaseProps || {}; + const headerProps = props.WorkflowCardHeaderProps || {}; + const instructionsProps = props.WorkflowCardInstructionProps || {}; + const actionsProps = props.WorkflowCardActionsProps || {}; + + const validateEmail = (): boolean => typeof emailValidator(initialEmailValue) !== 'string'; + + const [isEmailValid, setIsEmailValid] = useState(validateEmail); + const [emailError, setEmailError] = useState(!validateEmail() ? emailValidator(initialEmailValue) : ''); + const [shouldValidateEmail, setShouldValidateEmail] = useState(initialEmailValue !== '' ?? validateEmail); + + const handleEmailInputChange = useCallback( + (email: string) => { + setEmailInput(email); + const emailValidatorResponse = emailValidator(email); + + setIsEmailValid(typeof emailValidatorResponse === 'boolean' ? emailValidatorResponse : false); + setEmailError(typeof emailValidatorResponse === 'string' ? emailValidatorResponse : ''); + }, + [emailValidator] + ); + + const handleOnNext = (): void => { + const { onNext } = actionsProps; + if (onNext) { + onNext({ email: emailInput }); + } + }; + + const getSuccessScreen = ( + _props: SuccessScreenProps, + SuccessScreen?: (props: SuccessScreenProps) => JSX.Element + ): JSX.Element => (SuccessScreen ? SuccessScreen(_props) : ); + + return ( + <> + {showSuccessScreen ? ( + getSuccessScreen(slotProps?.SuccessScreen || {}, slots?.SuccessScreen) + ) : ( + + + + + + { + // eslint-disable-next-line no-unused-expressions + emailTextFieldProps?.onBlur && emailTextFieldProps.onBlur(e); + setShouldValidateEmail(true); + }} + onChange={(evt): void => { + // eslint-disable-next-line no-unused-expressions + emailTextFieldProps?.onChange && emailTextFieldProps.onChange(evt); + handleEmailInputChange(evt.target.value); + }} + onKeyUp={(e): void => { + if ( + e.key === 'Enter' && + ((emailInput.length > 0 && isEmailValid) || actionsProps.canGoNext) + ) + handleOnNext(); + }} + /> + + + 0 && isEmailValid && actionsProps.canGoNext} + onNext={handleOnNext} + /> + + )} + + ); +}; diff --git a/login-workflow/src/screens/ForgotPasswordScreen/index.ts b/login-workflow/src/screens/ForgotPasswordScreen/index.ts new file mode 100644 index 00000000..e5036a83 --- /dev/null +++ b/login-workflow/src/screens/ForgotPasswordScreen/index.ts @@ -0,0 +1,3 @@ +export * from './ForgotPasswordScreenBase'; +export * from './types'; +export * from './ForgotPasswordScreen'; diff --git a/login-workflow/src/screens/ForgotPasswordScreen/types.ts b/login-workflow/src/screens/ForgotPasswordScreen/types.ts new file mode 100644 index 00000000..cf0274b6 --- /dev/null +++ b/login-workflow/src/screens/ForgotPasswordScreen/types.ts @@ -0,0 +1,72 @@ +import { TextFieldProps } from '@mui/material'; +import { ErrorManagerProps } from '../../components/Error'; +import { WorkflowCardProps } from '../../components/WorkflowCard/WorkflowCard.types'; +import { SuccessScreenProps } from '../SuccessScreen'; + +export type ForgotPasswordScreenProps = WorkflowCardProps & { + /** + * label for the textfield + */ + emailLabel?: string; + + /** + * used to pre-populate the email input field + */ + initialEmailValue?: string; + + /** + * used to test the input for valid formatting + * @param {string} email - validate format via EMAIL_REGEX + * @returns boolean | string + */ + emailValidator?: (email: string) => boolean | string; + + /** + * used for each slot in `ForgotPasswordScreenBase` + * @param {SuccessScreenProps} props - pass SuccessScreenProps to SuccessScreen + * @returns JSX.Element + */ + slots?: { + SuccessScreen?: (props: SuccessScreenProps) => JSX.Element; + }; + + /** + * props applied to each slot + */ + slotProps?: { + SuccessScreen?: SuccessScreenProps; + }; + + /** + * used to display contact phone number + */ + contactPhone?: string; + + /** + * used to display response time + */ + responseTime?: string; + + /** + * used to update the instruction + * @param {string} responseTime - will add the response time in instructions through desciption function + * @returns React.ReactNode + */ + description?: (responseTime: string) => React.ReactNode; + + /** + * used to determine whether to show a success screen after the form is submitted + */ + showSuccessScreen?: boolean; + + /** + * used to configure how errors are rendered + */ + errorDisplayConfig?: ErrorManagerProps; + + /** + * The props to pass to the email field. + * See [MUI's TextFieldProps API](https://mui.com/material-ui/api/text-field/) for more details. + */ + emailTextFieldProps?: TextFieldProps; +}; diff --git a/login-workflow/src/screens/InviteRegistrationPager.tsx b/login-workflow/src/screens/InviteRegistrationPager.tsx deleted file mode 100644 index 4ef084d7..00000000 --- a/login-workflow/src/screens/InviteRegistrationPager.tsx +++ /dev/null @@ -1,470 +0,0 @@ -import React, { useState, useEffect, useCallback, ComponentType } from 'react'; -import { - useLanguageLocale, - useRegistrationUIState, - useRegistrationUIActions, - useInjectedUIContext, - AccountDetailInformation, - AccountDetailsFormProps, - CustomRegistrationForm, - CustomAccountDetails, - RegistrationActions, -} from '@brightlayer-ui/react-auth-shared'; -import i18n from '../translations/i18n'; -import { useNavigate } from 'react-router-dom'; -import { useRoutes } from '../contexts/RoutingContext'; -import { useQueryString } from '../hooks/useQueryString'; -import Button from '@mui/material/Button'; -import CardActions from '@mui/material/CardActions'; -import CardContent from '@mui/material/CardContent'; -import CardHeader from '@mui/material/CardHeader'; -import Divider from '@mui/material/Divider'; -import Typography from '@mui/material/Typography'; -import MobileStepper from '@mui/material/MobileStepper'; -import { useTheme } from '@mui/material/styles'; -import { BrandedCardContainer, FinishState, SimpleDialog } from '../components'; -import { emptyAccountDetailInformation } from './SelfRegistrationPager'; -import { AcceptEula } from './subScreens/AcceptEula'; -import { CreatePassword as CreatePasswordScreen } from './subScreens/CreatePassword'; -import { AccountDetails as AccountDetailsScreen, AccountDetailsWrapper } from './subScreens/AccountDetails'; -import { RegistrationComplete } from './subScreens/RegistrationComplete'; -import { ExistingAccountComplete } from './subScreens/ExistingAccountComplete'; -import Error from '@mui/icons-material/Error'; - -import { CustomRegistrationDetailsGroup, RegistrationPage } from '../types'; -import { - DialogButtonStyles, - DialogActionsStyles, - DialogContentStyles, - DialogTitleStyles, - StepperDotStyles, - StepperStyles, - TextFieldStyles, -} from '../styles'; -import Box from '@mui/material/Box'; - -/** - * Container component that manages the transition between screens for the - * invite-based registration (i.e., via email) workflow. - * - * @category Component - */ -export const InviteRegistrationPager: React.FC> = () => { - const { t } = useLanguageLocale(); - const navigate = useNavigate(); - const { routes } = useRoutes(); - const theme = useTheme(); - const registrationState = useRegistrationUIState(); - const registrationActions = useRegistrationUIActions(); - const injectedUIContext = useInjectedUIContext(); - - const { code, email } = useQueryString(); - const validationCode = code ?? 'NoCodeEntered'; - const validationEmail = email; - - // Local State - const [hasAcknowledgedError, setHasAcknowledgedError] = useState(false); - const [eulaAccepted, setEulaAccepted] = useState(false); - const [password, setPassword] = useState(''); - const [accountDetails, setAccountDetails] = useState<(AccountDetailInformation & { valid: boolean }) | null>(null); - const [customAccountDetails, setCustomAccountDetails] = useState({}); - const [eulaContent, setEulaContent] = useState(); - const [currentPage, setCurrentPage] = useState(0); - const [accountAlreadyExists, setAccountAlreadyExists] = React.useState(false); - - // Network state (registration) - const registrationTransit = registrationState.inviteRegistration.registrationTransit; - const registrationIsInTransit = registrationTransit.transitInProgress; - const hasRegistrationTransitError = registrationTransit.transitErrorMessage !== null; - const registrationTransitErrorMessage = registrationTransit.transitErrorMessage ?? t('blui:MESSAGES.REQUEST_ERROR'); - const registrationSuccess = registrationState.inviteRegistration.registrationTransit.transitSuccess; - - // Network state (invite code validation) - const isValidationInTransit = registrationState.inviteRegistration.validationTransit.transitInProgress; - const validationTransitErrorMessage = registrationState.inviteRegistration.validationTransit.transitErrorMessage; - const validationSuccess = registrationState.inviteRegistration.validationTransit.transitSuccess; - const validationComplete = registrationState.inviteRegistration.validationTransit.transitComplete; - - // Network state (loading eula) - const loadEulaTransitErrorMessage = registrationState.eulaTransit.transitErrorMessage; - - // Custom Registration Success Screens - const customSuccess = injectedUIContext.registrationSuccessScreen; - const customAccountAlreadyExists = injectedUIContext.accountAlreadyExistsScreen; - - // Reset registration and validation state on dismissal - useEffect( - () => (): void => { - registrationActions.dispatch(RegistrationActions.registerUserReset()); - registrationActions.dispatch(RegistrationActions.validateUserRegistrationReset()); - }, - [] // eslint-disable-line react-hooks/exhaustive-deps - ); - - const validateCode = useCallback(async (): Promise => { - setHasAcknowledgedError(false); - try { - const registrationComplete = await registrationActions.actions.validateUserRegistrationRequest( - validationCode, - validationEmail - ); - if (registrationComplete) { - setAccountAlreadyExists(true); - } - } catch { - // do nothing - } - }, [setHasAcknowledgedError, registrationActions, validationCode, validationEmail, setAccountAlreadyExists]); - - // Validate the email verification code - useEffect(() => { - if (!isValidationInTransit && !validationComplete && validationCode.length > 0) { - void validateCode(); - } - }, [registrationState.inviteRegistration.validationTransit, validationCode, validateCode, validationEmail]); // eslint-disable-line react-hooks/exhaustive-deps - - // Load the Eula if we don't have it yet - const loadAndCacheEula = useCallback(async (): Promise => { - if (!eulaContent) { - try { - const eulaText = await registrationActions.actions.loadEULA(i18n.language); - setEulaContent(eulaText); - } catch { - // do nothing - } - } - }, [eulaContent, setEulaContent, registrationActions]); - - // Make the call to the register API - const attemptRegistration = useCallback(async (): Promise => { - setHasAcknowledgedError(false); - - let flattenedDetails = {}; - Object.keys(customAccountDetails).forEach((key) => { - flattenedDetails = { ...flattenedDetails, ...customAccountDetails[parseInt(key, 10)].values }; - }); - - try { - await registrationActions.actions.completeRegistration( - { - password: password, - accountDetails: { ...(accountDetails ?? emptyAccountDetailInformation), ...flattenedDetails }, - }, - validationCode, - validationEmail - ); - } catch { - // do nothing - } - }, [ - registrationActions, - setHasAcknowledgedError, - accountDetails, - customAccountDetails, - password, - validationCode, - validationEmail, - ]); - - const customDetails = injectedUIContext.customAccountDetails || []; - //@ts-ignore - const FirstCustomPage: ComponentType< - React.PropsWithChildren> - > | null = customDetails.length > 0 && customDetails[0] ? customDetails[0].component : null; - - const RegistrationPages: RegistrationPage[] = [ - { - name: 'Eula', - pageTitle: t('blui:REGISTRATION.STEPS.LICENSE'), - pageBody: ( - - ), - canGoForward: eulaAccepted, - canGoBack: true, - }, - { - name: 'CreatePassword', - pageTitle: t('blui:REGISTRATION.STEPS.PASSWORD'), - pageBody: ( - 0 ? (): void => advancePage(1) : undefined} - /> - ), - canGoForward: password.length > 0, - canGoBack: true, - }, - { - name: 'AccountDetails', - pageTitle: t('blui:REGISTRATION.STEPS.ACCOUNT_DETAILS'), - pageBody: ( - - { - /* TODO Focus first field in custom page */ - } - : accountDetails !== null && accountDetails.valid - ? // eslint-disable-next-line @typescript-eslint/no-use-before-define - (): void => advancePage(1) - : undefined - } - /> - {FirstCustomPage && ( - - { - setCustomAccountDetails({ ...customAccountDetails, 0: { values: details, valid } }); - }} - initialDetails={customAccountDetails[0]?.values} - // eslint-disable-next-line @typescript-eslint/no-use-before-define - onSubmit={customAccountDetails[0]?.valid ? (): void => advancePage(1) : undefined} - /> - - )} - - ), - canGoForward: - accountDetails !== null && - accountDetails.valid && - ((FirstCustomPage && customAccountDetails[0]?.valid) || !FirstCustomPage), - canGoBack: true, - }, - ] - .concat( - customDetails - .slice(1) - //@ts-ignore there won't be any nulls after we filter them - .filter((item: ComponentType | null) => item !== null) - .map((page: CustomRegistrationForm, i: number) => { - const PageComponent = page.component; - return { - name: `CustomPage${i + 1}`, - pageTitle: page.title || t('blui:REGISTRATION.STEPS.ACCOUNT_DETAILS'), - pageBody: ( - - { - setCustomAccountDetails({ - ...customAccountDetails, - [i + 1]: { values: details, valid }, - }); - }} - initialDetails={customAccountDetails[i + 1]?.values} - onSubmit={ - // eslint-disable-next-line @typescript-eslint/no-use-before-define - customAccountDetails[i + 1]?.valid ? (): void => advancePage(1) : undefined - } - /> - - ), - canGoForward: customAccountDetails[i + 1]?.valid, - canGoBack: true, - }; - }) - ) - .concat([ - { - name: 'Complete', - pageTitle: t('blui:REGISTRATION.STEPS.COMPLETE'), - pageBody: ( - - ), - canGoForward: true, - canGoBack: false, - }, - ]); - - const isLastStep = currentPage === RegistrationPages.length - 1; - const isFirstStep = currentPage === 0; - - // If we successfully register, move to the success screen - useEffect(() => { - if (currentPage === RegistrationPages.length - 2 && registrationSuccess) { - setCurrentPage(RegistrationPages.length - 1); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [registrationSuccess]); - - // Screen transition logic - const canProgress = (): boolean => RegistrationPages[currentPage].canGoForward ?? false; - const canGoBackProgress = (): boolean => RegistrationPages[currentPage].canGoBack ?? true; - - const advancePage = (delta = 0): void => { - if (delta === 0) { - return; - } else if (isFirstStep && delta < 0) { - navigate(routes.LOGIN); - } else if (isLastStep && delta > 0) { - navigate(routes.LOGIN); - } else { - // If this is the last user-entry step of the invite flow, it is time to make a network call - // Check > 0 so advancing backwards does not risk going into the completion block - if (currentPage === RegistrationPages.length - 2 && !registrationSuccess && canProgress() && delta > 0) { - void attemptRegistration(); - } else { - setCurrentPage(currentPage + delta); - } - } - }; - - // Screen content logic - const pageTitle = (): string => { - if (isValidationInTransit) { - return t('blui:MESSAGES.LOADING'); - } else if (validationTransitErrorMessage !== null) { - return t('blui:MESSAGES.ERROR'); - } else if (accountAlreadyExists) { - return t('blui:REGISTRATION.STEPS.COMPLETE'); - } - return RegistrationPages[currentPage].pageTitle || ''; - }; - - // Screen actions content - let buttonArea: JSX.Element; - if (isLastStep) { - buttonArea = ( - - ); - } else { - buttonArea = ( - advancePage(-1)} - sx={DialogButtonStyles()} - > - {isFirstStep ? t('blui:ACTIONS.CANCEL') : t('blui:ACTIONS.BACK')} - - } - nextButton={ - - } - sx={{ ...StepperStyles, '& .MuiMobileStepper-dot': StepperDotStyles(theme) }} - /> - ); - } - - const errorDialog = ( - { - setHasAcknowledgedError(true); - }} - /> - ); - - // Custom "Account Already Exists" - if (accountAlreadyExists && customAccountAlreadyExists) { - return ( - - {typeof customAccountAlreadyExists === 'function' && customAccountAlreadyExists(undefined)} - {typeof customAccountAlreadyExists !== 'function' && customAccountAlreadyExists} - - ); - } - // Custom Success Screen - else if (isLastStep && !accountAlreadyExists && validationSuccess && !isValidationInTransit && customSuccess) { - return ( - - {typeof customSuccess === 'function' && - customSuccess({ accountDetails: accountDetails, email: validationEmail })} - {typeof customSuccess !== 'function' && customSuccess} - - ); - } - // Default Screens - return ( - - {errorDialog} - - {pageTitle()} - - } - sx={DialogTitleStyles(theme)} - /> - {!accountAlreadyExists && validationSuccess && !isValidationInTransit ? ( - <> - {RegistrationPages[currentPage].pageBody} - - {buttonArea} - - ) : accountAlreadyExists ? ( - <> - - - - - - - - - ) : !validationComplete ? ( - <> - ) : ( - } - title={t('blui:MESSAGES.FAILURE')} - description={validationTransitErrorMessage} - /> - )} - - ); -}; diff --git a/login-workflow/src/screens/Login.tsx b/login-workflow/src/screens/Login.tsx deleted file mode 100644 index 639889de..00000000 --- a/login-workflow/src/screens/Login.tsx +++ /dev/null @@ -1,459 +0,0 @@ -import React, { ChangeEvent, useCallback, useEffect, useRef } from 'react'; -import { useRoutes } from '../contexts/RoutingContext'; -import { - useSecurityState, - useLanguageLocale, - useAccountUIActions, - useAccountUIState, - useInjectedUIContext, - AccountActions, - EMAIL_REGEX, -} from '@brightlayer-ui/react-auth-shared'; -import { Link } from 'react-router-dom'; -import Button from '@mui/material/Button'; -import Typography from '@mui/material/Typography'; -import TextField from '@mui/material/TextField'; -import Grid from '@mui/material/Grid'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; -import { SxProps, Theme, useTheme } from '@mui/material/styles'; -import { BrandedCardContainer, SimpleDialog, SecureTextField } from '../components'; -import Close from '@mui/icons-material/Close'; -import stackedEatonLogo from '../assets/images/eaton_stacked_logo.png'; -import cyberBadge from '../assets/images/cybersecurity_certified.png'; -import * as Colors from '@brightlayer-ui/colors'; -import Box from '@mui/material/Box'; - -const HELPER_TEXT_HEIGHT = 22; - -const LinkStyles = (theme: Theme): SxProps => ({ - fontWeight: 600, - textTransform: 'none', - textDecoration: 'none', - color: theme.palette.primary.main, - '&:visited': { - color: 'inherit', - }, -}); - -const LinksWrapperStyles = { - textAlign: 'center', - pb: 4, -}; - -/** - * Login screen with loading and error states, as well as "remember me" functionality to store a user's email between logins. - * Requires being wrapped in an [[AuthNavigationContainer]] for access to global state and actions for authentication and registration. - * Has a debug mode which shows buttons that allow direct access to the deep link flows (invite registration, set password from forgot password, etc.). - * - * - * @category Component - */ -export const Login: React.FC> = () => { - const securityState = useSecurityState(); - const { t } = useLanguageLocale(); - const authUIActions = useAccountUIActions(); - const authUIState = useAccountUIState(); - const { routes } = useRoutes(); - const theme = useTheme(); - const { loginErrorDisplayConfig = { mode: 'dialog' }, ...otherUIContext } = useInjectedUIContext(); - const { - showRememberMe = true, - allowDebugMode = false, - showSelfRegistration = true, - enableResetPassword = true, - showContactSupport = true, - showCybersecurityBadge = true, - projectImage, - loginFooter, - loginHeader = ( - - - - ), - loginType = 'email', - loginActions, - } = otherUIContext; - - const passwordField = useRef(null); - - // Local State - const [rememberPassword, setRememberPassword] = React.useState( - showRememberMe ? securityState.rememberMeDetails.rememberMe ?? false : false - ); - const [emailInput, setEmailInput] = React.useState( - showRememberMe ? securityState.rememberMeDetails.email ?? '' : '' - ); - const [passwordInput, setPasswordInput] = React.useState(''); - - const [hasAcknowledgedError, setHasAcknowledgedError] = React.useState(false); - const [debugMode, setDebugMode] = React.useState(false); - - const [showErrorMessageBox, setShowErrorMessageBox] = React.useState(false); - - const loginTapped = useCallback((): void => { - setHasAcknowledgedError(false); - void authUIActions.actions.logIn(emailInput, passwordInput, showRememberMe ? rememberPassword : false); - }, [setHasAcknowledgedError, authUIActions, emailInput, passwordInput, rememberPassword, showRememberMe]); - - const transitState = authUIState.login; - const showLinks = showSelfRegistration || enableResetPassword || showContactSupport; - - const hasTransitError = authUIState.login.transitErrorMessage !== null; - const transitErrorMessage = authUIState.login.transitErrorMessage ?? t('blui:MESSAGES.REQUEST_ERROR'); - - const isInvalidCredentials = - transitErrorMessage.replace('blui:', '') === 'LOGIN.INCORRECT_CREDENTIALS' || - transitErrorMessage.replace('blui:', '') === 'LOGIN.INVALID_CREDENTIALS'; - - const [isValidEmail, setIsValidEmail] = React.useState(false); - const [shouldValidateEmail, setShouldValidateEmail] = React.useState(false); - - useEffect( - () => { - authUIActions.dispatch(AccountActions.resetLogin()); - }, - [] // eslint-disable-line react-hooks/exhaustive-deps - ); - - useEffect(() => { - if (hasTransitError) { - setShowErrorMessageBox(true); - } - }, [hasTransitError]); - - const hasEmailError = useCallback( - (): boolean => loginType === 'email' && shouldValidateEmail && emailInput.length !== 0 && !isValidEmail, - [shouldValidateEmail, emailInput, isValidEmail, loginType] - ); - - // Construct the dynamic elements - const errorDialog = ( - { - setHasAcknowledgedError(true); - }} - /> - ); - - const errorMessageBox: JSX.Element = - !isInvalidCredentials && hasTransitError && transitErrorMessage && showErrorMessageBox ? ( - - {loginErrorDisplayConfig.dismissible !== false && ( - { - setShowErrorMessageBox(false); - }} - /> - )} - {t(transitErrorMessage)} - - ) : ( - <> - ); - - const contactEatonRepresentative: JSX.Element = showContactSupport ? ( - - - {t('blui:MESSAGES.CONTACT')} - - - ) : ( - <> - ); - - const getEmailHelperText = (): string => { - if (hasEmailError()) { - return t('blui:MESSAGES.EMAIL_ENTRY_ERROR'); - } else if (isInvalidCredentials) { - return t('blui:LOGIN.INCORRECT_CREDENTIALS'); - } - return ''; - }; - - let createAccountOption: JSX.Element = <>; - if (showSelfRegistration) { - createAccountOption = ( - - - {t('blui:ACTIONS.CREATE_ACCOUNT')} - - - ); - } - - // Create buttons and links for debug mode - let debugButton: JSX.Element = <>; - if (allowDebugMode) { - debugButton = ( - - ); - } - - let debugMessage: JSX.Element = <>; - if (debugMode) { - debugMessage = ( - - - DEBUG MODE - - - ); - } - - const debugLinks = !debugMode ? null : ( - - - - [Test Invite Register] - - - - - [Test Self Register] - - - - - [Test Forgot Password] - - - - - [Test Reset Password Email] - - - - - [Test Contact Support] - - - - ); - - return ( - - {!isInvalidCredentials && - (loginErrorDisplayConfig.mode === 'dialog' || loginErrorDisplayConfig.mode === 'both') && - transitErrorMessage && - errorDialog} - {debugButton} -
{ - evt.preventDefault(); - loginTapped(); - }} - > - - {loginHeader && typeof loginHeader === 'function' && loginHeader(null)} - {loginHeader && typeof loginHeader !== 'function' && loginHeader} - - {debugMessage} - {debugLinks} - - {(loginErrorDisplayConfig.mode === 'message-box' || loginErrorDisplayConfig.mode === 'both') && - loginErrorDisplayConfig.position !== 'bottom' && - errorMessageBox} - - ): void => { - const { value } = evt.target; - setIsValidEmail(EMAIL_REGEX.test(value)); - setEmailInput(value); - if (authUIState.login.transitErrorMessage !== null) - authUIActions.dispatch(AccountActions.resetLogin()); - }} - onKeyPress={(e): void => { - if (e.key === 'Enter' && passwordField.current) passwordField.current.focus(); - }} - onBlur={(): void => { - setShouldValidateEmail(true); - }} - variant="filled" - error={hasEmailError() || isInvalidCredentials} - helperText={getEmailHelperText()} - /> - ): void => { - setPasswordInput(evt.target.value); - if (authUIState.login.transitErrorMessage !== null) - authUIActions.dispatch(AccountActions.resetLogin()); - }} - variant="filled" - error={isInvalidCredentials} - helperText={isInvalidCredentials ? t('blui:LOGIN.INCORRECT_CREDENTIALS') : ''} - /> - - {(loginErrorDisplayConfig.mode === 'message-box' || loginErrorDisplayConfig.mode === 'both') && - loginErrorDisplayConfig.position === 'bottom' && - errorMessageBox} - - - {showRememberMe && ( - setRememberPassword(evt.target.checked)} - /> - } - label={t('blui:ACTIONS.REMEMBER')} - /> - )} - - - - {loginActions && typeof loginActions === 'function' && loginActions(null)} - {loginActions && typeof loginActions !== 'function' && loginActions} - - - {enableResetPassword && ( - - - {t('blui:LABELS.FORGOT_PASSWORD')} - - - )} - {(showContactSupport || showSelfRegistration) && ( - - {t('blui:LABELS.NEED_ACCOUNT')} - - )} - - {createAccountOption} - {contactEatonRepresentative} - - {loginFooter && typeof loginFooter === 'function' && loginFooter(null)} - {loginFooter && typeof loginFooter !== 'function' && loginFooter} - {showCybersecurityBadge && ( - - )} - - -
- ); -}; diff --git a/login-workflow/src/screens/LoginScreen/AuthUIActions.tsx b/login-workflow/src/screens/LoginScreen/AuthUIActions.tsx new file mode 100644 index 00000000..cd077bc4 --- /dev/null +++ b/login-workflow/src/screens/LoginScreen/AuthUIActions.tsx @@ -0,0 +1,13 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import { AuthUIActions } from '../../contexts'; + +type AuthUIActionsFunction = () => AuthUIActions; + +export const ProjectAuthUIActions: AuthUIActionsFunction = (): any => ({ + initiateSecurity: (): Promise => Promise.resolve(), + logIn: (email: string, password: string, rememberMe: boolean): Promise => Promise.resolve(), + forgotPassword: (email: string): Promise => Promise.resolve(), + verifyResetCode: (code: string, email?: string): Promise => Promise.resolve(), + setPassword: (code: string, password: string, email?: string): Promise => Promise.resolve(), + changePassword: (oldPassword: string, newPassword: string): Promise => Promise.resolve(), +}); diff --git a/login-workflow/src/screens/LoginScreen/LoginScreen.test.tsx b/login-workflow/src/screens/LoginScreen/LoginScreen.test.tsx new file mode 100644 index 00000000..4a726d5d --- /dev/null +++ b/login-workflow/src/screens/LoginScreen/LoginScreen.test.tsx @@ -0,0 +1,82 @@ +import React from 'react'; +import { render, cleanup, screen } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { LoginScreen } from './LoginScreen'; +import { AuthContextProvider } from '../../contexts'; +import { ProjectAuthUIActions } from './AuthUIActions'; +import { authContextProviderProps } from '../../testUtils'; + +afterEach(cleanup); + +describe('LoginScreen', () => { + it('renders without crashing', () => { + render( + + + + ); + expect(screen.getByText('Login')).toBeInTheDocument(); + expect(screen.getByText('Login')).toBeDisabled(); + expect(screen.getByText('forgot password?')).toBeInTheDocument(); + expect(screen.getByText('register')).toBeInTheDocument(); + expect(screen.getByText('contact')).toBeInTheDocument(); + }); + + it('Login is disabled when the form is invalid', () => { + const onLogin = jest.fn(); + render( + + + + ); + + screen.getByText('Login').click(); + expect(onLogin).not.toBeCalled(); + }); + + it('calls onForgotPassword when the forgot password link is clicked', () => { + const onForgotPassword = jest.fn(); + render( + + + + ); + screen.getByText('forgot password?').click(); + expect(onForgotPassword).toHaveBeenCalled(); + }); + + it('calls onSelfRegister when the sign up link is clicked', () => { + const onSelfRegister = jest.fn(); + render( + + + + ); + screen.getByText('register').click(); + expect(onSelfRegister).toHaveBeenCalled(); + }); + + it('calls onContactSupport when the contact support link is clicked', () => { + const onContactSupport = jest.fn(); + render( + + + + ); + screen.getByText('contact').click(); + expect(onContactSupport).toHaveBeenCalled(); + }); +}); diff --git a/login-workflow/src/screens/LoginScreen/LoginScreen.tsx b/login-workflow/src/screens/LoginScreen/LoginScreen.tsx new file mode 100644 index 00000000..b8cb479f --- /dev/null +++ b/login-workflow/src/screens/LoginScreen/LoginScreen.tsx @@ -0,0 +1,147 @@ +import React, { useEffect } from 'react'; +import { LoginScreenProps } from './types'; +import { LoginScreenBase } from './LoginScreenBase'; +import { useAuthContext } from '../../contexts'; +import { useErrorManager } from '../../contexts/ErrorContext/useErrorManager'; +import { useTranslation } from 'react-i18next'; + +const EMAIL_REGEX = /^[A-Z0-9._%+'-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i; + +/** + * Component that renders a login screen that prompts a user to enter a username and password to login. + * + * @param usernameLabel label for the username field + * @param usernameTextFieldProps props to pass to the username text field + * @param usernameValidator function used to validate the username + * @param initialUsernameValue username used to pre-populate the field + * @param passwordLabel label for the password field + * @param passwordTextFieldProps props to pass to the password text field + * @param passwordValidator function used to validate the password + * @param showRememberMe whether or not to show the 'remember me' checkbox + * @param rememberMeLabel label for the 'remember me' checkbox + * @param rememberMeInitialValue whether or not the 'remember me' checkbox should be checked by default + * @param onRememberMeChanged callback function that is called when the 'remember me' checkbox is changed + * @param loginButtonLabel label for the login button + * @param onLogin callback function that is called when the login button is clicked + * @param showForgotPassword whether or not to show the 'forgot password' link + * @param forgotPasswordLabel label for the 'forgot password' link + * @param onForgotPassword callback function that is called when the 'forgot password' link is clicked + * @param showSelfRegistration whether or not to show the 'self registration' link + * @param selfRegisterButtonLabel label for the 'self registration' link + * @param selfRegisterInstructions instructions for the 'self registration' link + * @param onSelfRegister callback function that is called when the 'self registration' link is clicked + * @param showContactSupport whether or not to show the 'contact support' link + * @param contactSupportLabel label for the 'contact support' link + * @param onContactSupport callback function that is called when the 'contact support' link is clicked + * @param errorDisplayConfig configuration for customizing how errors are displayed + * @param showCyberSecurityBadge whether or not to show the cyber security badge + * @param projectImage image to display at the top of the screen + * @param header header to display at the top of the screen + * @param footer footer to display at the bottom of the screen + * @param WorkflowCardBaseProps props that will be passed to the WorkflowCard component + * + * @category Component + */ + +export const LoginScreen: React.FC> = (props) => { + const { t } = useTranslation(); + const auth = useAuthContext(); + const { actions, navigate, routeConfig, rememberMeDetails } = auth; + const { triggerError, errorManagerConfig } = useErrorManager(); + const errorDisplayConfig = { + ...errorManagerConfig, + ...props.errorDisplayConfig, + onClose: (): void => { + if (props.errorDisplayConfig && props.errorDisplayConfig.onClose) props.errorDisplayConfig.onClose(); + if (errorManagerConfig.onClose) errorManagerConfig?.onClose(); + }, + }; + + useEffect(() => { + void actions.initiateSecurity(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const { + usernameLabel = t('bluiCommon:LABELS.EMAIL'), + usernameTextFieldProps, + usernameValidator = (username: string): string | boolean => { + if (!EMAIL_REGEX.test(username)) { + return t('bluiCommon:MESSAGES.EMAIL_ENTRY_ERROR'); + } + return true; + }, + initialUsernameValue = rememberMeDetails?.email || '', + passwordLabel = t('bluiCommon:LABELS.PASSWORD'), + passwordTextFieldProps, + passwordValidator = (password: string): string | boolean => { + if (password.length < 1) { + return t('bluiCommon:MESSAGES.PASSWORD_REQUIRED_ERROR'); + } + return true; + }, + showRememberMe = true, + rememberMeLabel = t('bluiCommon:ACTIONS.REMEMBER'), + rememberMeInitialValue = rememberMeDetails?.rememberMe || false, + onRememberMeChanged = (value: boolean): void => { + props.onRememberMeChanged?.(value); + }, + loginButtonLabel = t('bluiCommon:ACTIONS.LOG_IN'), + showForgotPassword = true, + forgotPasswordLabel = t('bluiCommon:LABELS.FORGOT_PASSWORD'), + onForgotPassword = (): void => navigate(routeConfig.FORGOT_PASSWORD as string), + showSelfRegistration = true, + selfRegisterInstructions = t('bluiCommon:LABELS.NEED_ACCOUNT'), + selfRegisterButtonLabel = t('bluiCommon:ACTIONS.CREATE_ACCOUNT'), + onSelfRegister = (): void => navigate(routeConfig.REGISTER_SELF as string), + showContactSupport = true, + contactSupportLabel = t('bluiCommon:MESSAGES.CONTACT'), + onContactSupport = (): void => navigate(routeConfig.SUPPORT as string), + showCyberSecurityBadge = true, + projectImage, + header, + footer, + } = props; + + return ( + => { + try { + await actions.logIn(username, password, rememberMe); + await props.onLogin?.(username, password, rememberMe); + } catch (_error) { + triggerError(_error as Error); + } + }) as any + } + showForgotPassword={showForgotPassword} + forgotPasswordLabel={forgotPasswordLabel} + onForgotPassword={onForgotPassword} + showSelfRegistration={showSelfRegistration} + selfRegisterButtonLabel={selfRegisterButtonLabel} + selfRegisterInstructions={selfRegisterInstructions} + onSelfRegister={onSelfRegister} + showContactSupport={showContactSupport} + contactSupportLabel={contactSupportLabel} + onContactSupport={onContactSupport} + errorDisplayConfig={errorDisplayConfig} + showCyberSecurityBadge={showCyberSecurityBadge} + projectImage={projectImage} + header={header} + footer={footer} + /> + ); +}; diff --git a/login-workflow/src/screens/LoginScreen/LoginScreenBase.test.tsx b/login-workflow/src/screens/LoginScreen/LoginScreenBase.test.tsx new file mode 100644 index 00000000..626d6a3c --- /dev/null +++ b/login-workflow/src/screens/LoginScreen/LoginScreenBase.test.tsx @@ -0,0 +1,112 @@ +import React from 'react'; +import { render, cleanup, screen, fireEvent } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { LoginScreenBase } from './LoginScreenBase'; + +const EMAIL_REGEX = /^[A-Z0-9._%+'-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i; + +afterEach(cleanup); + +const mockLogin = jest.fn(); +const mockForgotPassword = jest.fn(); +const mockSelfRegister = jest.fn(); +const mockContactSupport = jest.fn(); +const mockRememberMeChanged = jest.fn(); + +describe('LoginScreenBase', () => { + beforeEach(() => { + render( + { + if (!EMAIL_REGEX.test(username)) { + return 'Enter a valid email address'; + } + return true; + }} + initialUsernameValue="" + passwordLabel="Password" + passwordValidator={(password: string): string | boolean => { + if (password.length < 2) { + return 'Password must be at least 2 characters'; + } + return true; + }} + rememberMeLabel="Remember Me" + rememberMeInitialValue={true} + onRememberMeChanged={(value: boolean): void => { + mockRememberMeChanged(value); + }} + loginButtonLabel="Log In" + onLogin={(username: string, password: string): void => { + mockLogin(username, password); + }} + forgotPasswordLabel="Forgot your password?" + onForgotPassword={(): void => { + mockForgotPassword(); + }} + selfRegisterButtonLabel="Register now!" + selfRegisterInstructions="Need an account" + onSelfRegister={(): void => { + mockSelfRegister(); + }} + contactSupportLabel="Contact an Eaton Support Representative" + onContactSupport={(): void => { + mockContactSupport(); + }} + /> + ); + }); + + test('renders without crashing', () => { + expect(screen.getByText('Log In')).toBeInTheDocument(); + expect(screen.getByText('Email Address')).toBeInTheDocument(); + expect(screen.getByText('Password')).toBeInTheDocument(); + }); + + test('disables login button when username and password are invalid', () => { + const usernameInput = screen.getByLabelText('Email Address'); + const passwordInput = screen.getByLabelText('Password'); + const loginButton = screen.getByText('Log In'); + + fireEvent.change(usernameInput, { target: { value: 'us' } }); + fireEvent.change(passwordInput, { target: { value: 'p' } }); + fireEvent.blur(passwordInput); + + expect(loginButton).toBeDisabled(); + }); + + test('disables login button when username and password are invalid', () => { + const usernameInput = screen.getByLabelText('Email Address'); + const passwordInput = screen.getByLabelText('Password'); + const loginButton = screen.getByText('Log In'); + + fireEvent.change(usernameInput, { target: { value: 'us' } }); + fireEvent.change(passwordInput, { target: { value: 'p' } }); + + expect(loginButton).toBeDisabled(); + }); + + test('enables login button when username and password are valid', () => { + const usernameInput = screen.getByLabelText('Email Address'); + const passwordInput = screen.getByLabelText('Password'); + const loginButton = screen.getByText('Log In'); + + fireEvent.change(usernameInput, { target: { value: 'email@email.com' } }); + fireEvent.change(passwordInput, { target: { value: 'pass' } }); + + expect(loginButton).toBeEnabled(); + }); + + test('handles input and submits form', () => { + const usernameInput = screen.getByLabelText('Email Address'); + const passwordInput = screen.getByLabelText('Password'); + const loginButton = screen.getByText('Log In'); + + fireEvent.change(usernameInput, { target: { value: 'email@email.com' } }); + fireEvent.change(passwordInput, { target: { value: 'pass' } }); + fireEvent.click(loginButton); + + expect(mockLogin).toHaveBeenCalledWith('email@email.com', 'pass'); + }); +}); diff --git a/login-workflow/src/screens/LoginScreen/LoginScreenBase.tsx b/login-workflow/src/screens/LoginScreen/LoginScreenBase.tsx new file mode 100644 index 00000000..72973d5e --- /dev/null +++ b/login-workflow/src/screens/LoginScreen/LoginScreenBase.tsx @@ -0,0 +1,463 @@ +import React, { useCallback, useRef, useState } from 'react'; +import { LoginScreenProps } from './types'; +import { WorkflowCard } from '../../components/WorkflowCard'; +import { WorkflowCardBody } from '../../components/WorkflowCard/WorkflowCardBody'; +import TextField from '@mui/material/TextField'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import cyberSecurityBadge from '../../assets/images/cybersecurity_certified.png'; +import { PasswordTextField } from '../../components'; +import Button from '@mui/material/Button'; +import { useTheme } from '@mui/material/styles'; +import Checkbox from '@mui/material/Checkbox'; +import { HELPER_TEXT_HEIGHT } from '../../utils/constants'; +import { LoginScreenClassKey, getLoginScreenUtilityClass } from './utilityClasses'; +import { unstable_composeClasses as composeClasses } from '@mui/base'; +import ErrorManager from '../../components/Error/ErrorManager'; +import { LinkStyles } from '../../styles'; + +/** + * Component that renders a login screen that prompts a user to enter a username and password to login. + * + * @param usernameLabel label for the username field + * @param usernameTextFieldProps props to pass to the username text field + * @param usernameValidator function used to validate the username + * @param initialUsernameValue username used to pre-populate the field + * @param passwordLabel label for the password field + * @param passwordTextFieldProps props to pass to the password text field + * @param passwordValidator function used to validate the password + * @param showRememberMe whether or not to show the 'remember me' checkbox + * @param rememberMeLabel label for the 'remember me' checkbox + * @param rememberMeInitialValue whether or not the 'remember me' checkbox should be checked by default + * @param onRememberMeChanged callback function that is called when the 'remember me' checkbox is changed + * @param loginButtonLabel label for the login button + * @param onLogin callback function that is called when the login button is clicked + * @param showForgotPassword whether or not to show the 'forgot password' link + * @param forgotPasswordLabel label for the 'forgot password' link + * @param onForgotPassword callback function that is called when the 'forgot password' link is clicked + * @param showSelfRegistration whether or not to show the 'self registration' link + * @param selfRegisterButtonLabel label for the 'self registration' link + * @param selfRegisterInstructions instructions for the 'self registration' link + * @param onSelfRegister callback function that is called when the 'self registration' link is clicked + * @param showContactSupport whether or not to show the 'contact support' link + * @param contactSupportLabel label for the 'contact support' link + * @param onContactSupport callback function that is called when the 'contact support' link is clicked + * @param errorDisplayConfig configuration for customizing how errors are displayed + * @param showCyberSecurityBadge whether or not to show the cyber security badge + * @param projectImage image to display at the top of the screen + * @param header header to display at the top of the screen + * @param footer footer to display at the bottom of the screen + * @param WorkflowCardBaseProps props that will be passed to the WorkflowCard component + * + * @category Component + */ + +const useUtilityClasses = (ownerState: LoginScreenProps): Record => { + const { classes } = ownerState; + + const slots = { + root: ['root'], + projectImageWrapper: ['projectImageWrapper'], + inputFieldsWrapper: ['inputFieldsWrapper'], + usernameTextField: ['usernameTextField'], + passwordTextField: ['passwordTextField'], + rememberMeLoginRowWrapper: ['rememberMeLoginRowWrapper'], + rememberMeWrapper: ['rememberMeWrapper'], + rememberMeCheckbox: ['rememberMeCheckbox'], + rememberMeLabel: ['rememberMeLabel'], + loginButtonWrapper: ['loginButtonWrapper'], + loginButton: ['loginButton'], + forgotPasswordWrapper: ['forgotPasswordWrapper'], + forgotPasswordLabel: ['forgotPasswordLabel'], + selfRegisterWrapper: ['selfRegisterWrapper'], + selfRegisterInstructionLabel: ['selfRegisterInstructionLabel'], + selfRegisterLabel: ['selfRegisterLabel'], + contactSupportWrapper: ['contactSupportWrapper'], + contactSupportLabel: ['contactSupportLabel'], + cyberSecurityBadgeWrapper: ['cyberSecurityBadgeWrapper'], + cyberSecurityBadge: ['cyberSecurityBadge'], + }; + + return composeClasses(slots, getLoginScreenUtilityClass, classes); +}; + +export const LoginScreenBase: React.FC> = (props) => { + const { + usernameLabel, + usernameTextFieldProps, + usernameValidator, + initialUsernameValue, + passwordLabel, + passwordTextFieldProps, + passwordValidator, + showRememberMe, + rememberMeLabel, + rememberMeInitialValue, + onRememberMeChanged, + loginButtonLabel, + onLogin, + showForgotPassword, + forgotPasswordLabel, + onForgotPassword, + showSelfRegistration, + selfRegisterButtonLabel, + selfRegisterInstructions, + onSelfRegister, + showContactSupport, + contactSupportLabel, + onContactSupport, + errorDisplayConfig, + showCyberSecurityBadge, + projectImage, + header, + footer, + } = props; + + const theme = useTheme(); + const defaultClasses = useUtilityClasses(props); + + const [username, setUsername] = React.useState(initialUsernameValue || ''); + const [password, setPassword] = React.useState(''); + const [rememberMe, setRememberMe] = React.useState(rememberMeInitialValue); + + const [shouldValidateUsername, setShouldValidateUsername] = React.useState(false); + const [shouldValidatePassword, setShouldValidatePassword] = React.useState(false); + + const passwordField = useRef(null); + + const [isUsernameValid, setIsUsernameValid] = useState(usernameValidator ? usernameValidator(username) : true); + const [isPasswordValid, setIsPasswordValid] = useState(passwordValidator ? passwordValidator(password) : true); + + const [usernameError, setUsernameError] = useState(isUsernameValid === true ? '' : isUsernameValid); + const [passwordError, setPasswordError] = useState(isPasswordValid === true ? '' : isPasswordValid); + + const handleUsernameInputChange = useCallback( + (value: string) => { + setUsername(value); + const validatorResponse = usernameValidator?.(value); + + setIsUsernameValid(typeof validatorResponse === 'boolean' ? validatorResponse : false); + setUsernameError(typeof validatorResponse === 'string' ? validatorResponse : ''); + }, + [usernameValidator] + ); + + const handlePasswordInputChange = useCallback( + (value: string) => { + setPassword(value); + const validatorResponse = passwordValidator?.(value); + + setIsPasswordValid(typeof validatorResponse === 'boolean' ? validatorResponse : false); + setPasswordError(typeof validatorResponse === 'string' ? validatorResponse : ''); + }, + [passwordValidator] + ); + + const handleLogin = (): void => { + if (onLogin) void onLogin(username, password, rememberMe); + }; + + const handleForgotPassword = (): void => { + if (onForgotPassword) onForgotPassword(); + }; + + const handleSelfRegister = (): void => { + if (onSelfRegister) onSelfRegister(); + }; + + const handleContactSupport = (): void => { + if (onContactSupport) onContactSupport(); + }; + + const handleRememberMeChanged = (value: boolean): void => { + if (onRememberMeChanged) { + onRememberMeChanged(value); + setRememberMe(value); + } + }; + + const isFormValid = (): boolean => + typeof isUsernameValid === 'boolean' && + isUsernameValid && + typeof isPasswordValid === 'boolean' && + isPasswordValid; + + const handleLoginSubmit = (e: React.KeyboardEvent): void => { + if (e.key === 'Enter' && isFormValid()) { + void handleLogin(); + } + }; + + return ( + + + {header} + + {projectImage} + + + + + 0 && !isUsernameValid && shouldValidateUsername + ? 4 + : `${(parseInt(theme.spacing(4)) + HELPER_TEXT_HEIGHT).toString()}px`, + [theme.breakpoints.down('sm')]: { + mb: + username.length > 0 && !isUsernameValid && shouldValidateUsername + ? 3 + : `${(parseInt(theme.spacing(3)) + HELPER_TEXT_HEIGHT).toString()}px`, + }, + }} + > + { + // eslint-disable-next-line no-unused-expressions + usernameTextFieldProps?.onChange && usernameTextFieldProps.onChange(e); + handleUsernameInputChange(e.target.value); + }} + onSubmit={(e: any): void => { + // eslint-disable-next-line no-unused-expressions + usernameTextFieldProps?.onSubmit && usernameTextFieldProps.onSubmit(e); + if (e.key === 'Enter' && passwordField.current) passwordField.current.focus(); + }} + onBlur={(e): void => { + // eslint-disable-next-line no-unused-expressions + usernameTextFieldProps?.onBlur && usernameTextFieldProps.onBlur(e); + setShouldValidateUsername(true); + }} + onKeyUp={(e): void => { + if (e.key === 'Enter' && passwordField.current) passwordField.current.focus(); + }} + /> + + 0 && !isPasswordValid && shouldValidatePassword + ? 2 + : `${(parseInt(theme.spacing(2)) + HELPER_TEXT_HEIGHT).toString()}px`, + }} + > + { + // eslint-disable-next-line no-unused-expressions + passwordTextFieldProps?.onChange && passwordTextFieldProps.onChange(e); + handlePasswordInputChange(e.target.value); + }} + onSubmit={(e: any): void => { + // eslint-disable-next-line no-unused-expressions + passwordTextFieldProps?.onSubmit && passwordTextFieldProps.onSubmit(e); + handleLoginSubmit(e); + }} + onBlur={(e): void => { + // eslint-disable-next-line no-unused-expressions + passwordTextFieldProps?.onBlur && passwordTextFieldProps.onBlur(e); + setShouldValidatePassword(true); + }} + onKeyUp={(e): void => { + // eslint-disable-next-line no-unused-expressions + passwordTextFieldProps?.onSubmit && passwordTextFieldProps.onSubmit(e); + handleLoginSubmit(e); + }} + /> + + + + + {showRememberMe && ( + + handleRememberMeChanged(e.target.checked)} + className={defaultClasses.rememberMeCheckbox} + data-testid={defaultClasses.rememberMeCheckbox} + /> + + {rememberMeLabel || 'Remember Me'} + + + )} + + + + + + {showForgotPassword && ( + + + {forgotPasswordLabel || 'Forgot your password?'} + + + )} + + {showSelfRegistration && ( + + + {selfRegisterInstructions || 'Need an account?'} + + + {selfRegisterButtonLabel || 'Register now!'} + + + )} + + {showContactSupport && ( + + + {contactSupportLabel || 'Contact Support'} + + + )} + + {footer} + + {showCyberSecurityBadge && ( + + Cyber Security Badge + + )} + + + ); +}; diff --git a/login-workflow/src/screens/LoginScreen/index.ts b/login-workflow/src/screens/LoginScreen/index.ts new file mode 100644 index 00000000..8526fea9 --- /dev/null +++ b/login-workflow/src/screens/LoginScreen/index.ts @@ -0,0 +1,3 @@ +export * from './types'; +export * from './LoginScreenBase'; +export * from './LoginScreen'; diff --git a/login-workflow/src/screens/LoginScreen/types.ts b/login-workflow/src/screens/LoginScreen/types.ts new file mode 100644 index 00000000..02f0fe48 --- /dev/null +++ b/login-workflow/src/screens/LoginScreen/types.ts @@ -0,0 +1,169 @@ +import { TextFieldProps } from '@mui/material'; +import { WorkflowCardBaseProps } from '../../components/WorkflowCard/WorkflowCard.types'; +import { ErrorManagerProps } from '../../components/Error'; + +export type LoginScreenProps = WorkflowCardBaseProps & { + // configure fields + /** + * The label for the username field + */ + usernameLabel?: string; + + /** + * The props to pass to the username text field. + * See [MUI's TextFieldProps API](https://mui.com/material-ui/api/text-field/) for more details. + */ + usernameTextFieldProps?: TextFieldProps; + + /** + * The function used to validate the username + * @param {string} username - validates username + * @returns boolean | string + */ + usernameValidator?: (username: string) => boolean | string; + + /** + * The username used to pre-populate the field + */ + initialUsernameValue?: string; + + /** + * The label for the password field + */ + passwordLabel?: string; + + /** + * The props to pass to the password text field. + * See [MUI's TextFieldProps API](https://mui.com/material-ui/api/text-field/) for more details. + */ + passwordTextFieldProps?: TextFieldProps; + + /** + * The function used to validate the password + * @param {string} password - validates password + * @returns boolean | string + */ + passwordValidator?: (password: string) => boolean | string; + + // configure Remember Me + /** + * Whether or not to show the 'remember me' checkbox + * @default true + */ + showRememberMe?: boolean; + + /** + * The label for the 'remember me' checkbox + */ + rememberMeLabel?: string; + + /** + * whether or not the 'remember me' checkbox should be checked by default + * @default false + */ + rememberMeInitialValue?: boolean; + + /** + * The callback function that is called when the 'remember me' checkbox is changed + * @param {boolean} onRememberMeChanged - function when remember me has changed + * @returns void + */ + onRememberMeChanged?: (onRememberMeChanged: boolean) => void; + + // configure Login + /** + * The label for the login button + */ + loginButtonLabel?: string; + + /** + * Callback function that is called when the login button is clicked + * @param {string} username - user name value + * @param {string} password - password value + * @param {boolean} rememberMe - value passed to rememberMe or not + * @returns Promise | void + */ + onLogin?: (username?: string, password?: string, rememberMe?: boolean) => Promise | void; + + // configure Forgot Password + /** + * whether or not to show the 'forgot password' link + */ + showForgotPassword?: boolean; + + /** + * The label for the 'forgot password' link + */ + forgotPasswordLabel?: string; + + /** + * The callback function that is called when the 'forgot password' link is clicked + * @returns void + */ + onForgotPassword?: () => void; + + // configure Self Registration + /** + * whether or not to show the 'self registration' link + */ + showSelfRegistration?: boolean; + + /** + * The label for the 'self registration' link + */ + selfRegisterButtonLabel?: string; + + /** + * The instructions for the 'self registration' link + */ + selfRegisterInstructions?: string; + + /** + * The callback function that is called when the 'self registration' link is clicked + * @returns void + */ + onSelfRegister?: () => void; + + // configure Support + /** + * whether or not to show the 'contact support' link + */ + showContactSupport?: boolean; + + /** + * The label for the 'contact support' link + */ + contactSupportLabel?: string; + + /** + * The callback function that is called when the 'contact support' link is clicked + * @returns void + */ + onContactSupport?: () => void; + + // configure visual customizations + /** + * The configuration for customizing how errors are displayed + */ + errorDisplayConfig?: ErrorManagerProps; + + /** + * whether or not to show the cyber security badge + */ + showCyberSecurityBadge?: boolean; + + /** + * The image to display at the top of the screen + */ + projectImage?: React.ReactNode; + + /** + * The header to display at the top of the screen + */ + header?: JSX.Element; + + /** + * The footer to display at the bottom of the screen + */ + footer?: JSX.Element; +}; diff --git a/login-workflow/src/screens/LoginScreen/utilityClasses.ts b/login-workflow/src/screens/LoginScreen/utilityClasses.ts new file mode 100644 index 00000000..86911aea --- /dev/null +++ b/login-workflow/src/screens/LoginScreen/utilityClasses.ts @@ -0,0 +1,30 @@ +import generateUtilityClass from '@mui/material/generateUtilityClass'; + +export type LoginScreenClasses = { + root?: string; + projectImageWrapper?: string; + inputFieldsWrapper?: string; + usernameTextField?: string; + passwordTextField?: string; + rememberMeLoginRowWrapper?: string; + rememberMeWrapper?: string; + rememberMeCheckbox?: string; + rememberMeLabel?: string; + loginButtonWrapper?: string; + loginButton?: string; + forgotPasswordWrapper?: string; + forgotPasswordLabel?: string; + selfRegisterWrapper?: string; + selfRegisterInstructionLabel?: string; + selfRegisterLabel?: string; + contactSupportWrapper?: string; + contactSupportLabel?: string; + cyberSecurityBadgeWrapper?: string; + cyberSecurityBadge?: string; +}; + +export type LoginScreenClassKey = keyof LoginScreenClasses; + +export function getLoginScreenUtilityClass(slot: string): string { + return generateUtilityClass('BluiLogin', slot); +} diff --git a/login-workflow/src/screens/RegistrationSuccessScreen/RegistrationSuccessScreen.test.tsx b/login-workflow/src/screens/RegistrationSuccessScreen/RegistrationSuccessScreen.test.tsx new file mode 100644 index 00000000..6d2ea24f --- /dev/null +++ b/login-workflow/src/screens/RegistrationSuccessScreen/RegistrationSuccessScreen.test.tsx @@ -0,0 +1,72 @@ +import React from 'react'; +import '@testing-library/jest-dom'; +import { render, cleanup, screen, fireEvent, RenderResult } from '@testing-library/react'; +import { RegistrationSuccessScreen } from './RegistrationSuccessScreen'; +import { RegistrationContextProvider, RegistrationWorkflowContextProvider } from '../../contexts'; +import { SuccessScreenProps } from '../SuccessScreen'; +import { registrationContextProviderProps } from '../../testUtils'; + +afterEach(cleanup); + +const registrationWorkflowContextProps = { + currentScreen: 0, + totalScreens: 2, + nextScreen: jest.fn(), + previousScreen: jest.fn(), + screenData: { + Eula: { accepted: true }, + CreateAccount: { emailAddress: 'emailAddress@emailAddress.emailAddress' }, + VerifyCode: { code: '12345' }, + CreatePassword: { password: 'password', confirmPassword: 'confirmPassword' }, + AccountDetails: { firstName: 'firstName', lastName: 'lastName' }, + Other: { RegistrationSuccessScreen: { organizationName: 'Acme Co.' } }, + }, + updateScreenData: jest.fn(), +}; + +describe('RegistrationSuccessScreen', () => { + let mockOnNext: any; + + afterEach(() => { + jest.clearAllMocks(); + }); + + beforeEach(() => { + mockOnNext = jest.fn(); + }); + + const renderer = (props?: SuccessScreenProps): RenderResult => + render( + + + + + + ); + + it('renders without crashing', () => { + renderer(); + + expect(screen.getByText('Account Created!')).toBeInTheDocument(); + }); + + it('should display email id and organization name on success screen', () => { + renderer(); + + expect(screen.getByText('emailAddress@emailAddress.emailAddress')).toBeInTheDocument(); + expect(screen.getByText('Acme Co.')).toBeInTheDocument(); + }); + + it('should call onNext, when click on Continue button', () => { + renderer({ + WorkflowCardActionsProps: { + onNext: mockOnNext(), + }, + }); + + const continueButton = screen.getByText('Finish'); + expect(continueButton).toBeInTheDocument(); + fireEvent.click(continueButton); + expect(mockOnNext).toHaveBeenCalled(); + }); +}); diff --git a/login-workflow/src/screens/RegistrationSuccessScreen/RegistrationSuccessScreen.tsx b/login-workflow/src/screens/RegistrationSuccessScreen/RegistrationSuccessScreen.tsx new file mode 100644 index 00000000..edcff8c6 --- /dev/null +++ b/login-workflow/src/screens/RegistrationSuccessScreen/RegistrationSuccessScreen.tsx @@ -0,0 +1,87 @@ +import React from 'react'; +import { Trans, useTranslation } from 'react-i18next'; +import Typography from '@mui/material/Typography'; +import CheckCircle from '@mui/icons-material/CheckCircle'; +import { SuccessScreenBase, SuccessScreenProps } from '..'; +import { useRegistrationWorkflowContext, useRegistrationContext } from '../../contexts'; + +/** + * Component that renders a success screen for when registration completes. + * + * @param icon the icon to be displayed on the screen + * @param messageTitle title of the success message + * @param message success message to be displayed on the screen + * @param onDismiss function to call when user clicks button + * @param canDismiss function to call when the dismiss button is clicked + * + * @category Component + */ + +export const RegistrationSuccessScreen: React.FC = (props) => { + const { navigate, routeConfig } = useRegistrationContext(); + const { t } = useTranslation(); + + const { + screenData: { + AccountDetails: { firstName, lastName }, + CreateAccount: { emailAddress: email }, + Other: { + // @ts-ignore + RegistrationSuccessScreen: { organizationName: organization }, + }, + }, + } = useRegistrationWorkflowContext(); + + const { + icon = , + messageTitle = `${t('bluiCommon:MESSAGES.WELCOME')}, ${firstName} ${lastName}!`, + message = ( + + + Your account has successfully been created with the email {email} belonging to the + {` ${String(organization)}`} org. + + + ), + onDismiss = (): void => navigate(routeConfig.LOGIN as string), + canDismiss = true, + WorkflowCardHeaderProps, + WorkflowCardActionsProps, + ...otherRegistrationSuccessScreenProps + } = props; + + const workflowCardHeaderProps = { + title: t('bluiRegistration:REGISTRATION.STEPS.COMPLETE'), + ...WorkflowCardHeaderProps, + }; + + const workflowCardActionsProps = { + nextLabel: t('bluiCommon:ACTIONS.FINISH'), + showNext: true, + canGoNext: canDismiss, + fullWidthButton: true, + ...WorkflowCardActionsProps, + onNext: (): void => { + onDismiss(); + WorkflowCardActionsProps?.onNext?.(); + }, + }; + + return ( + + ); +}; diff --git a/login-workflow/src/screens/RegistrationSuccessScreen/index.ts b/login-workflow/src/screens/RegistrationSuccessScreen/index.ts new file mode 100644 index 00000000..93add5b0 --- /dev/null +++ b/login-workflow/src/screens/RegistrationSuccessScreen/index.ts @@ -0,0 +1 @@ +export * from './RegistrationSuccessScreen'; diff --git a/login-workflow/src/screens/ResetPassword.tsx b/login-workflow/src/screens/ResetPassword.tsx deleted file mode 100644 index 0cddc6b0..00000000 --- a/login-workflow/src/screens/ResetPassword.tsx +++ /dev/null @@ -1,212 +0,0 @@ -import React, { useState, useEffect, useCallback, useRef } from 'react'; -import { - useLanguageLocale, - useAccountUIState, - useAccountUIActions, - AccountActions, - useInjectedUIContext, -} from '@brightlayer-ui/react-auth-shared'; -import { useQueryString } from '../hooks/useQueryString'; -import { useRoutes } from '../contexts/RoutingContext'; -import { useNavigate } from 'react-router-dom'; -import Button from '@mui/material/Button'; -import CardActions from '@mui/material/CardActions'; -import CardContent from '@mui/material/CardContent'; -import CardHeader from '@mui/material/CardHeader'; -import Divider from '@mui/material/Divider'; -import Typography from '@mui/material/Typography'; -import Grid from '@mui/material/Grid'; -import { useTheme } from '@mui/material/styles'; -import { BrandedCardContainer, SimpleDialog, FinishState, ChangePasswordForm } from '../components'; -import { defaultPasswordRequirements } from '../constants'; -import CheckCircle from '@mui/icons-material/CheckCircle'; -import Error from '@mui/icons-material/Error'; -import { DialogButtonStyles, DialogActionsStyles, DialogContentStyles, DialogTitleStyles } from '../styles'; - -/** - * Renders a screen stack which handles the reset password flow (deep link from email). - * - * @category Component - */ -export const ResetPassword: React.FC> = () => { - const { t } = useLanguageLocale(); - const navigate = useNavigate(); - const { routes } = useRoutes(); - const theme = useTheme(); - const accountUIState = useAccountUIState(); - const accountUIActions = useAccountUIActions(); - const { code, email } = useQueryString(); - - const passwordRef = useRef(null); - const confirmRef = useRef(null); - - // Local State - const [passwordInput, setPasswordInput] = useState(''); - const [confirmInput, setConfirmInput] = useState(''); - const [hasAcknowledgedError, setHasAcknowledgedError] = useState(false); - - // Network state (verifyResetCode) - const verifyResetCodeTransit = accountUIState.setPassword.verifyResetCodeTransit; - const verifyIsInTransit = verifyResetCodeTransit.transitInProgress; - const validationTransitErrorMessage = verifyResetCodeTransit.transitErrorMessage; - const verifySuccess = verifyResetCodeTransit.transitSuccess; - const verifyComplete = verifyResetCodeTransit.transitComplete; - - // Network state (setPassword) - const setPasswordTransit = accountUIState.setPassword.setPasswordTransit; - const setPasswordTransitSuccess = setPasswordTransit.transitSuccess; - const setPasswordIsInTransit = setPasswordTransit.transitInProgress; - const setPasswordHasTransitError = setPasswordTransit.transitErrorMessage !== null; - const setPasswordTransitErrorMessage = setPasswordTransit.transitErrorMessage; - - // Reset state on dismissal - useEffect( - () => (): void => { - accountUIActions.dispatch(AccountActions.setPasswordReset()); - accountUIActions.dispatch(AccountActions.verifyResetCodeReset()); - }, // eslint-disable-next-line react-hooks/exhaustive-deps - [] - ); - - useEffect(() => { - if (!verifyIsInTransit && !verifyComplete && code.length > 0) { - void accountUIActions.actions.verifyResetCode(code, email); - } - // eslint-disable-line react-hooks/exhaustive-deps - }, [verifyIsInTransit, code, email, verifyComplete, accountUIActions.actions]); - - const { passwordRequirements = defaultPasswordRequirements(t) } = useInjectedUIContext(); - - const areValidMatchingPasswords = useCallback((): boolean => { - for (let i = 0; i < passwordRequirements.length; i++) { - if (!new RegExp(passwordRequirements[i].regex).test(passwordInput)) return false; - } - return confirmInput === passwordInput; - }, [passwordRequirements, passwordInput, confirmInput]); - - const updateFields = useCallback( - (fields: { password: string; confirm: string }) => { - setPasswordInput(fields.password); - setConfirmInput(fields.confirm); - }, - [setPasswordInput, setConfirmInput] - ); - - const resetPassword = useCallback( - (password: string): void => { - void accountUIActions.actions.setPassword(code, password, email); - }, - [accountUIActions, code, email] - ); - - const canContinue = useCallback( - (): boolean => areValidMatchingPasswords() && !setPasswordTransit.transitInProgress, - [areValidMatchingPasswords, setPasswordTransit] - ); - const onContinue = useCallback(() => { - if (setPasswordTransitSuccess) { - navigate(routes.LOGIN); - } else { - resetPassword(passwordInput); - } - }, [resetPassword, setPasswordTransitSuccess, passwordInput, navigate, routes]); - - const getBody = useCallback( - () => - verifySuccess && !verifyIsInTransit ? ( - setPasswordTransitSuccess ? ( - } - title={t('blui:PASSWORD_RESET.SUCCESS_MESSAGE')} - description={t('blui:CHANGE_PASSWORD.SUCCESS_MESSAGE')} - /> - ) : ( - - ) - ) : !verifyComplete ? ( - <> - ) : ( - } - title={t('blui:MESSAGES.FAILURE')} - description={validationTransitErrorMessage} - /> - ), - [ - t, - canContinue, - onContinue, - verifySuccess, - verifyIsInTransit, - verifyComplete, - validationTransitErrorMessage, - setPasswordTransitSuccess, - updateFields, - ] - ); - - const errorDialog = ( - { - setHasAcknowledgedError(true); - }} - /> - ); - - return ( - - {errorDialog} - - {t('blui:FORMS.RESET_PASSWORD')} - - } - sx={DialogTitleStyles(theme)} - /> - {getBody()} - - - - {!setPasswordTransitSuccess && ( - - )} - {verifySuccess && ( - - )} - - - - ); -}; diff --git a/login-workflow/src/screens/ResetPasswordScreen/ResetPasswordScreen.test.tsx b/login-workflow/src/screens/ResetPasswordScreen/ResetPasswordScreen.test.tsx new file mode 100644 index 00000000..9e74e86d --- /dev/null +++ b/login-workflow/src/screens/ResetPasswordScreen/ResetPasswordScreen.test.tsx @@ -0,0 +1,110 @@ +import React from 'react'; +import { BrowserRouter } from 'react-router-dom'; +import '@testing-library/jest-dom'; +import { cleanup, render, screen, fireEvent, RenderResult, waitFor } from '@testing-library/react'; +import { ResetPasswordScreen } from './ResetPasswordScreen'; +import { AuthContextProvider } from '../../contexts'; +import { ResetPasswordScreenProps } from './types'; +import { authContextProviderProps } from '../../testUtils'; + +afterEach(cleanup); + +describe('Reset Password Screen', () => { + let mockOnNext: any; + let mockOnPrevious: any; + + afterEach(() => { + jest.clearAllMocks(); + }); + + beforeEach(() => { + mockOnNext = jest.fn(); + mockOnPrevious = jest.fn(); + }); + + const renderer = (props?: ResetPasswordScreenProps): RenderResult => + render( + + + + + + ); + + it('renders without crashing', () => { + renderer(); + expect(screen.getByText('Reset Password')).toBeInTheDocument(); + }); + + it('should update values when passed as props', () => { + renderer({ WorkflowCardHeaderProps: { title: 'Test Title' } }); + expect(screen.queryByText('Reset Password')).toBeNull(); + expect(screen.getByText('Test Title')).toBeInTheDocument(); + }); + + it('should show success screen, when okay button is clicked', async () => { + const { getByLabelText } = renderer({ + showSuccessScreen: true, + PasswordProps: { + newPasswordLabel: 'New Password', + confirmPasswordLabel: 'Confirm New Password', + onPasswordChange: jest.fn(), + passwordRequirements: [], + }, + WorkflowCardActionsProps: { + canGoNext: true, + nextLabel: 'Next', + }, + }); + + const newPasswordInput = getByLabelText('New Password'); + const confirmPasswordInput = getByLabelText('Confirm New Password'); + fireEvent.change(newPasswordInput, { target: { value: 'Abc@1234' } }); + fireEvent.change(confirmPasswordInput, { target: { value: 'Abc@1234' } }); + fireEvent.click(screen.getByText('Next')); + await waitFor(() => expect(screen.getByText('Your password was successfully reset.'))); + }); + + it('should show loader, when loading prop is passed to WorkflowCardBaseProps', () => { + renderer({ WorkflowCardBaseProps: { loading: true } }); + expect(screen.getByTestId('blui-spinner')).toBeInTheDocument(); + }); + + it('should call onNext, when Next button clicked', async () => { + const { getByLabelText } = renderer({ + WorkflowCardActionsProps: { + onNext: mockOnNext(), + showNext: true, + nextLabel: 'Next', + }, + }); + + const passwordField = getByLabelText('New Password'); + const confirmPasswordField = getByLabelText('Confirm New Password'); + fireEvent.change(passwordField, { target: { value: 'Abcd@123' } }); + fireEvent.blur(passwordField); + fireEvent.change(confirmPasswordField, { target: { value: 'Abcd@123' } }); + fireEvent.blur(confirmPasswordField); + const nextButton = screen.getByText('Next'); + expect(nextButton).toBeInTheDocument(); + expect(screen.getByText(/Next/i)).toBeEnabled(); + fireEvent.click(nextButton); + await waitFor(() => expect(mockOnNext).toHaveBeenCalled()); + }); + + it('should call onPrevious, when Back button clicked', () => { + renderer({ + WorkflowCardActionsProps: { + onPrevious: mockOnPrevious(), + showPrevious: true, + previousLabel: 'Back', + }, + }); + + const backButton = screen.getByText('Back'); + expect(backButton).toBeInTheDocument(); + expect(screen.getByText(/Back/i)).toBeEnabled(); + fireEvent.click(backButton); + expect(mockOnPrevious).toHaveBeenCalled(); + }); +}); diff --git a/login-workflow/src/screens/ResetPasswordScreen/ResetPasswordScreen.tsx b/login-workflow/src/screens/ResetPasswordScreen/ResetPasswordScreen.tsx new file mode 100644 index 00000000..d96f6bbd --- /dev/null +++ b/login-workflow/src/screens/ResetPasswordScreen/ResetPasswordScreen.tsx @@ -0,0 +1,211 @@ +import React, { useCallback, useRef, useState, useEffect } from 'react'; +import CheckCircle from '@mui/icons-material/CheckCircle'; +import { ResetPasswordScreenBase } from './ResetPasswordScreenBase'; +import { useAuthContext } from '../../contexts'; +import { defaultPasswordRequirements } from '../../constants'; +import { parseQueryString } from '../../utils'; +import { ResetPasswordScreenProps } from './types'; +import { useErrorManager } from '../../contexts/ErrorContext/useErrorManager'; +import { useTranslation } from 'react-i18next'; + +/** + * Component that renders a ResetPassword screen that allows a user to reset their password and shows a success message upon a successful password reset.. + * + * @param PasswordProps props that will be passed to the SetPassword component + * @param showSuccessScreen boolean that determines whether to show the success screen or not + * @param slots used for ResetPasswordScreen SuccessScreen props + * @param slotProps props that will be passed to the SuccessScreen component + * @param errorDisplayConfig configuration for customizing how errors are displayed + * @param SuccessScreen component that will be rendered when showSuccessScreen is true + * @param WorkflowCardBaseProps props that will be passed to the WorkflowCard component + * @param WorkflowCardHeaderProps props that will be passed to the WorkflowCardHeader component + * @param WorkflowCardInstructionProps props that will be passed to the WorkflowCardInstructions component + * @param WorkflowCardActionsProps props that will be passed to the WorkflowCardActions component + * @returns a React JSX Element that renders a ResetPassword screen + * + * @category Component + * + */ + +export const ResetPasswordScreen: React.FC = (props) => { + const { t } = useTranslation(); + const passwordRef = useRef(null); + const confirmRef = useRef(null); + const { triggerError, errorManagerConfig } = useErrorManager(); + const errorDisplayConfig = { + ...errorManagerConfig, + ...props.errorDisplayConfig, + onClose: (): void => { + if (props.errorDisplayConfig && props.errorDisplayConfig.onClose) props.errorDisplayConfig.onClose(); + if (errorManagerConfig.onClose) errorManagerConfig?.onClose(); + }, + }; + + const { + WorkflowCardBaseProps, + WorkflowCardHeaderProps, + WorkflowCardInstructionProps, + WorkflowCardActionsProps, + PasswordProps, + slots = {}, + slotProps = {}, + } = props; + + const [passwordInput, setPasswordInput] = useState(PasswordProps?.initialNewPasswordValue ?? ''); + const [confirmInput, setConfirmInput] = useState(PasswordProps?.initialConfirmPasswordValue ?? ''); + const [hasVerifyCodeError, setHasVerifyCodeError] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const [showSuccessScreen, setShowSuccessScreen] = useState(false); + + const { code, email } = parseQueryString(window.location.search); + + const { actions, navigate, routeConfig } = useAuthContext(); + const passwordRequirements = defaultPasswordRequirements(t); + + const verifyResetCode = useCallback(async (): Promise => { + try { + setIsLoading(true); + await actions.verifyResetCode(code, email); + } catch (_error) { + setHasVerifyCodeError(true); + triggerError(_error as Error); + } finally { + setIsLoading(false); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const handleOnNext = useCallback(async (): Promise => { + try { + setIsLoading(true); + await actions.setPassword(code, passwordInput, email); + if (props.showSuccessScreen === false) { + navigate(routeConfig.LOGIN as string); + } else { + setShowSuccessScreen(true); + } + } catch (_error) { + triggerError(_error as Error); + } finally { + setIsLoading(false); + } + }, [actions, code, passwordInput, email, triggerError, props.showSuccessScreen, navigate, routeConfig]); + + const areValidMatchingPasswords = useCallback((): boolean => { + if (PasswordProps?.passwordRequirements?.length === 0) { + return confirmInput === passwordInput; + } + for (let i = 0; i < passwordRequirements.length; i++) { + if (!new RegExp(passwordRequirements[i].regex).test(passwordInput)) return false; + } + return confirmInput === passwordInput; + }, [PasswordProps?.passwordRequirements?.length, passwordRequirements, passwordInput, confirmInput]); + + const updateFields = useCallback( + (fields: { password: string; confirm: string }) => { + setPasswordInput(fields.password); + setConfirmInput(fields.confirm); + }, + [setPasswordInput, setConfirmInput] + ); + + useEffect(() => { + // eslint-disable-next-line + verifyResetCode(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const workflowCardBaseProps = { + loading: isLoading, + ...WorkflowCardBaseProps, + }; + + const workflowCardHeaderProps = { + title: t('bluiCommon:FORMS.RESET_PASSWORD'), + ...WorkflowCardHeaderProps, + }; + + const workflowCardInstructionProps = { + instructions: t('bluiAuth:CHANGE_PASSWORD.PASSWORD_INFO'), + ...WorkflowCardInstructionProps, + }; + + const workflowCardActionsProps = { + showNext: true, + showPrevious: true, + nextLabel: t('bluiCommon:ACTIONS.NEXT'), + previousLabel: t('bluiCommon:ACTIONS.BACK'), + canGoNext: passwordInput !== '' && confirmInput !== '' && areValidMatchingPasswords(), + ...WorkflowCardActionsProps, + onNext: (): void => { + void handleOnNext(); + WorkflowCardActionsProps?.onNext?.(); + }, + onPrevious: (): void => { + navigate(routeConfig.LOGIN as string); + WorkflowCardActionsProps?.onPrevious?.(); + }, + }; + + const passwordProps = { + newPasswordLabel: t('bluiAuth:CHANGE_PASSWORD.NEW_PASSWORD'), + confirmPasswordLabel: t('bluiAuth:CHANGE_PASSWORD.CONFIRM_NEW_PASSWORD'), + passwordNotMatchError: t('bluiCommon:FORMS.PASS_MATCH_ERROR'), + passwordRequirements: PasswordProps?.passwordRequirements ?? passwordRequirements, + passwordRef, + confirmRef, + ...PasswordProps, + initialNewPasswordValue: passwordInput, + initialConfirmPasswordValue: confirmInput, + onPasswordChange: (passwordData: { password: string; confirm: string }): void => { + updateFields(passwordData); + PasswordProps?.onPasswordChange?.(passwordData); + }, + onSubmit: (): void => { + if (areValidMatchingPasswords()) { + void handleOnNext(); + WorkflowCardActionsProps?.onNext?.(); + PasswordProps?.onSubmit?.(); + } + }, + }; + + return ( + , + messageTitle: t('bluiAuth:PASSWORD_RESET.SUCCESS_MESSAGE'), + message: t('bluiAuth:CHANGE_PASSWORD.SUCCESS_MESSAGE'), + WorkflowCardActionsProps: { + showPrevious: false, + fullWidthButton: true, + showNext: true, + nextLabel: t('bluiCommon:ACTIONS.DONE'), + onNext: (): void => { + navigate(routeConfig.LOGIN as string); + }, + }, + ...slotProps.SuccessScreen, + }, + }} + errorDisplayConfig={{ + ...errorDisplayConfig, + onClose: hasVerifyCodeError + ? (): void => { + navigate(routeConfig.LOGIN as string); + // eslint-disable-next-line no-unused-expressions + errorDisplayConfig.onClose; + } + : errorDisplayConfig.onClose, + }} + /> + ); +}; diff --git a/login-workflow/src/screens/ResetPasswordScreen/ResetPasswordScreenBase.test.tsx b/login-workflow/src/screens/ResetPasswordScreen/ResetPasswordScreenBase.test.tsx new file mode 100644 index 00000000..c1883830 --- /dev/null +++ b/login-workflow/src/screens/ResetPasswordScreen/ResetPasswordScreenBase.test.tsx @@ -0,0 +1,96 @@ +import React from 'react'; +import '@testing-library/jest-dom'; +import { cleanup, render, screen } from '@testing-library/react'; +import { ResetPasswordScreenBase } from './ResetPasswordScreenBase'; + +afterEach(cleanup); + +describe('Forgot Password Screen Base', () => { + it('renders without crashing', () => { + render( + + ); + expect(screen.getByText('Reset Password')).toBeInTheDocument(); + expect(screen.getByText('Reset Password instructions')).toBeInTheDocument(); + expect(screen.getByText('Next')).toBeInTheDocument(); + expect(screen.getByText(/Next/i)).toBeEnabled(); + expect(screen.getByText('Back')).toBeInTheDocument(); + expect(screen.getByText(/Back/i)).toBeEnabled(); + }); + + it('show success screen when showSuccessScreen is true', () => { + render( + ( +
+

Success Screen

+
+ ), + }} + /> + ); + expect(screen.getByText('Success Screen')).toBeInTheDocument(); + }); +}); diff --git a/login-workflow/src/screens/ResetPasswordScreen/ResetPasswordScreenBase.tsx b/login-workflow/src/screens/ResetPasswordScreen/ResetPasswordScreenBase.tsx new file mode 100644 index 00000000..59d559a4 --- /dev/null +++ b/login-workflow/src/screens/ResetPasswordScreen/ResetPasswordScreenBase.tsx @@ -0,0 +1,64 @@ +import React from 'react'; +import { ResetPasswordScreenProps } from './types'; +import { + WorkflowCard, + WorkflowCardHeader, + WorkflowCardBody, + WorkflowCardInstructions, + SetPassword, + WorkflowCardActions, +} from '../../components'; +import ErrorManager from '../../components/Error/ErrorManager'; +import { SuccessScreenBase, SuccessScreenProps } from '../SuccessScreen'; + +/** + * Component that renders a ResetPassword screen that allows a user to reset their password and shows a success message upon a successful password reset.. + * + * @param PasswordProps props that will be passed to the SetPassword component + * @param showSuccessScreen boolean that determines whether to show the success screen or not + * @param slots used for ResetPasswordScreen SuccessScreen props + * @param slotProps props that will be passed to the SuccessScreen component + * @param errorDisplayConfig configuration for customizing how errors are displayed + * @param SuccessScreen component that will be rendered when showSuccessScreen is true + * @param WorkflowCardBaseProps props that will be passed to the WorkflowCard component + * @param WorkflowCardHeaderProps props that will be passed to the WorkflowCardHeader component + * @param WorkflowCardInstructionProps props that will be passed to the WorkflowCardInstructions component + * @param WorkflowCardActionsProps props that will be passed to the WorkflowCardActions component + * @returns a React JSX Element that renders a ResetPassword screen + * + * @category Component + * + */ + +export const ResetPasswordScreenBase: React.FC> = (props) => { + const cardBaseProps = props.WorkflowCardBaseProps || {}; + const headerProps = props.WorkflowCardHeaderProps || {}; + const instructionsProps = props.WorkflowCardInstructionProps || {}; + const actionsProps = props.WorkflowCardActionsProps || {}; + const passwordProps = props.PasswordProps || { onPasswordChange: () => ({}) }; + const { showSuccessScreen, slots, slotProps = {}, errorDisplayConfig } = props; + + const getSuccessScreen = ( + _props?: SuccessScreenProps, + SuccessScreen?: (props: SuccessScreenProps) => JSX.Element + ): JSX.Element => (SuccessScreen ? SuccessScreen(_props || {}) : ); + + return ( + <> + {showSuccessScreen ? ( + getSuccessScreen(slotProps?.SuccessScreen, slots?.SuccessScreen) + ) : ( + + + + + + + + + + + )} + + ); +}; diff --git a/login-workflow/src/screens/ResetPasswordScreen/index.ts b/login-workflow/src/screens/ResetPasswordScreen/index.ts new file mode 100644 index 00000000..009155f1 --- /dev/null +++ b/login-workflow/src/screens/ResetPasswordScreen/index.ts @@ -0,0 +1,3 @@ +export * from './types'; +export * from './ResetPasswordScreenBase'; +export * from './ResetPasswordScreen'; diff --git a/login-workflow/src/screens/ResetPasswordScreen/types.ts b/login-workflow/src/screens/ResetPasswordScreen/types.ts new file mode 100644 index 00000000..48c89660 --- /dev/null +++ b/login-workflow/src/screens/ResetPasswordScreen/types.ts @@ -0,0 +1,39 @@ +import { ErrorManagerProps } from '../../components/Error'; +import { SetPasswordProps } from '../../components/SetPassword/types'; +import { WorkflowCardProps } from '../../components/WorkflowCard/WorkflowCard.types'; +import { SuccessScreenProps } from '../SuccessScreen'; + +export type ResetPasswordScreenSlots = { + SuccessScreen?: (props?: SuccessScreenProps) => JSX.Element; +}; + +export type ResetPasswordScreenSlotsProps = { + SuccessScreen?: SuccessScreenProps; +}; + +export type ResetPasswordScreenProps = Omit & { + /** + * The props that will be passed to the SetPassword component + */ + PasswordProps?: SetPasswordProps; + + /** + * Boolean that determines whether to show the success screen or not + */ + showSuccessScreen?: boolean; + + /** + * Used for ResetPasswordScreen SuccessScreen props + */ + slots?: ResetPasswordScreenSlots; + + /** + * The props that will be passed to the SuccessScreen component + */ + slotProps?: ResetPasswordScreenSlotsProps; + + /** + * The configuration for customizing how errors are displayed + */ + errorDisplayConfig?: ErrorManagerProps; +}; diff --git a/login-workflow/src/screens/Screens.test.tsx b/login-workflow/src/screens/Screens.test.tsx deleted file mode 100644 index db842aad..00000000 --- a/login-workflow/src/screens/Screens.test.tsx +++ /dev/null @@ -1,407 +0,0 @@ -import React from 'react'; -import 'regenerator-runtime/runtime'; -import { render, cleanup } from '@testing-library/react'; -import '@testing-library/jest-dom'; -import { AcceptEula } from './subScreens/AcceptEula'; -import { AccountDetails } from './subScreens/AccountDetails'; -import { CreateAccount } from './subScreens/CreateAccount'; -import { CreatePassword } from './subScreens/CreatePassword'; -import { ExistingAccountComplete } from './subScreens/ExistingAccountComplete'; -import { RegistrationComplete } from './subScreens/RegistrationComplete'; -import { VerifyEmail } from './subScreens/VerifyEmail'; -import { - AccountUIActionContext, - // AccountUIActionContext, - AuthUIContextProvider, - SecurityContextProvider, - translations, - // RegistrationActionContext, - // RegistrationActionsCreator, -} from '@brightlayer-ui/react-auth-shared'; -import { ContactSupport } from './ContactSupport'; -import { ForgotPassword } from './ForgotPassword'; -// import { InviteRegistrationPager } from './InviteRegistrationPager'; -import { BrowserRouter } from 'react-router-dom'; -import { RoutingContext } from '../contexts/RoutingContext'; -import { Login } from './Login'; -import { ResetPassword } from './ResetPassword'; -// import { SelfRegistrationPager } from './SelfRegistrationPager'; -import { Splash } from './Splash'; -// import { RoutingContext } from '../contexts/RoutingContext'; -// import { BrowserRouter } from 'react-router-dom'; -import i18n from 'i18next'; -import { initReactI18next } from 'react-i18next'; -import LanguageDetector from 'i18next-browser-languagedetector'; - -import { createTheme, ThemeProvider } from '@mui/material/styles'; -import * as BLUIThemes from '@brightlayer-ui/react-themes'; - -const theme = createTheme(BLUIThemes.blue); -afterEach(cleanup); - -void i18n - .use(initReactI18next) - .use(LanguageDetector) - .init({ - load: 'languageOnly', - detection: { - order: ['querystring', 'localStorage', 'navigator'], - caches: ['localStorage'], - lookupLocalStorage: 'blui-auth-i18nextLng', - }, - whitelist: ['en'], - ns: ['app', 'blui'], - defaultNS: 'app', - fallbackNS: 'blui', - resources: { - en: { - blui: translations.english.translation, - app: {}, - }, - }, - }); - -describe('AcceptEula tests', () => { - it('renders without crashing', () => { - const onEulaChanged = jest.fn(); - - render( - - {}} onEulaChanged={onEulaChanged} /> - - ); - }); -}); - -describe('AccountDetails tests', () => { - it('renders without crashing', () => { - const authUIActions = jest.fn(); - const registrationUIActions = jest.fn(); - const onDetailsChanged = jest.fn(); - - render( - - - - - - ); - }); -}); - -describe('CreateAccount tests', () => { - it('renders without crashing', () => { - const onEmailChanged = jest.fn(); - - render( - - - - ); - }); -}); - -describe('CreatePassword tests', () => { - it('renders without crashing', () => { - const onPasswordChanged = jest.fn(); - const authUIActions = jest.fn(); - const registrationUIActions = jest.fn(); - - render( - - - - - - ); - }); -}); - -describe('ExistingAccountComplete tests', () => { - it('renders without crashing', () => { - render( - - - - ); - }); -}); - -describe('RegistrationComplete tests', () => { - it('renders without crashing', () => { - render( - - - - ); - }); -}); - -describe('VerifyEmail tests', () => { - it('renders without crashing', () => { - const onVerifyCodeChanged = jest.fn(); - const onResendVerificationEmail = jest.fn(); - - render( - - - - ); - }); -}); - -describe('ContactSupport tests', () => { - it('renders without crashing', () => { - const authUIActions = jest.fn(); - const registrationUIActions = jest.fn(); - - render( - - - - - - ); - }); -}); - -jest.mock('@brightlayer-ui/react-auth-shared', () => ({ - // @ts-ignore - ...jest.requireActual('@brightlayer-ui/react-auth-shared'), - useAccountUIActions: jest.fn().mockReturnValue(() => {}), -})); - -describe('ForgotPassword tests', () => { - it('renders without crashing', () => { - const authUIActions = jest.fn(); - const registrationUIActions = jest.fn(); - const accountUIActions = { - initiateSecurity: jest.fn(), - logIn: jest.fn(), - forgotPassword: jest.fn(), - verifyResetCode: jest.fn(), - setPassword: jest.fn(), - changePassword: jest.fn(), - }; - const accountUIDispatch = jest.fn(); - - render( - - - - - - - - ); - }); -}); - -jest.mock('@brightlayer-ui/react-auth-shared', () => ({ - // @ts-ignore - ...jest.requireActual('@brightlayer-ui/react-auth-shared'), - useSecurityState: jest.fn().mockReturnValue({}), -})); - -describe('Login tests', () => { - it('renders without crashing', () => { - const authUIActions = jest.fn(); - const registrationUIActions = jest.fn(); - const accountUIActions = { - initiateSecurity: jest.fn(), - logIn: jest.fn(), - forgotPassword: jest.fn(), - verifyResetCode: jest.fn(), - setPassword: jest.fn(), - changePassword: jest.fn(), - }; - const accountUIDispatch = jest.fn(); - - const defaultRoutes = { - LOGIN: '/login', - FORGOT_PASSWORD: '/forgot-password', - RESET_PASSWORD: '/reset-password', - REGISTER_INVITE: '/register/invite', - REGISTER_SELF: '/register/create-account', - SUPPORT: '/support', - }; - - render( - - - - - - - - - - - - - - ); - }); -}); - -type QueryParams = { - code?: string; - email?: string; - search?: string; -}; - -jest.mock('../hooks/useQueryString', () => ({ - useQueryString: (): QueryParams => ({ search: 'test-search', code: 'test', email: 'test@email.com' }), -})); - -jest.mock('react-router-dom', () => ({ - // @ts-ignore - ...jest.requireActual('react-router-dom'), - useNavigate: jest.fn().mockReturnValue(jest.fn()), - useLocation: jest.fn().mockReturnValue('test-location'), -})); - -jest.mock('@brightlayer-ui/react-auth-shared', () => ({ - // @ts-ignore - ...jest.requireActual('@brightlayer-ui/react-auth-shared'), - useRegistrationUIActions: jest.fn().mockReturnValue(() => ({ - actions: { - loadEULA: jest.fn(), - requestRegistrationCode: jest.fn(), - validateUserRegistrationRequest: jest.fn(), - completeRegistration: jest.fn(), - }, - dispatch: jest.fn().mockReturnValue(() => {}), - })), -})); - -// @TODO: Fix "Error: Uncaught [TypeError: registrationActions.dispatch is not a function]" - -// describe('InviteRegistrationPager tests', () => { -// it('renders without crashing', () => { -// const div = document.createElement('div'); -// const root = createRoot(div); -// const authUIActions = jest.fn(); -// const registrationUIActions = jest.fn(); - -// const defaultRoutes = { -// LOGIN: '/login', -// FORGOT_PASSWORD: '/forgot-password', -// RESET_PASSWORD: '/reset-password', -// REGISTER_INVITE: '/register/invite', -// REGISTER_SELF: '/register/create-account', -// SUPPORT: '/support', -// }; - -// root.render( -// -// -// -// -// -// -// -// ); -// root.unmount(); -// }); -// }); - -// @TODO: Fix "Error: Uncaught [TypeError: registrationActions.dispatch is not a function]" - -// describe('SelfRegistrationPager tests', () => { -// it('renders without crashing', () => { -// const div = document.createElement('div'); -// const root = createRoot(div); -// const authUIActions = jest.fn(); -// const registrationUIActions = jest.fn(); - -// const defaultRoutes = { -// LOGIN: '/login', -// FORGOT_PASSWORD: '/forgot-password', -// RESET_PASSWORD: '/reset-password', -// REGISTER_INVITE: '/register/invite', -// REGISTER_SELF: '/register/create-account', -// SUPPORT: '/support', -// }; - -// root.render( -// -// -// -// -// -// -// -// ); -// root.unmount(); -// }); -// }); - -describe('Splash tests', () => { - it('renders without crashing', () => { - const authUIActions = jest.fn(); - const registrationUIActions = jest.fn(); - - render( - - - - - - ); - }); -}); - -describe('ResetPassword tests', () => { - it('renders without crashing', () => { - const authUIActions = jest.fn(); - const registrationUIActions = jest.fn(); - const defaultRoutes = { - LOGIN: '/login', - FORGOT_PASSWORD: '/forgot-password', - RESET_PASSWORD: '/reset-password', - REGISTER_INVITE: '/register/invite', - REGISTER_SELF: '/register/create-account', - SUPPORT: '/support', - }; - const authActions = { - initiateSecurity: jest.fn(), - logIn: jest.fn(), - forgotPassword: jest.fn(), - verifyResetCode: jest.fn(), - setPassword: jest.fn(), - changePassword: jest.fn(), - }; - const authDispatch = jest.fn(); - - render( - - - - - - - - - - - - ); - }); -}); diff --git a/login-workflow/src/screens/SelfRegistrationPager.tsx b/login-workflow/src/screens/SelfRegistrationPager.tsx deleted file mode 100644 index 097dce10..00000000 --- a/login-workflow/src/screens/SelfRegistrationPager.tsx +++ /dev/null @@ -1,558 +0,0 @@ -import React, { useState, useEffect, useCallback, ComponentType } from 'react'; -import i18n from '../translations/i18n'; -import { - useLanguageLocale, - useRegistrationUIActions, - useRegistrationUIState, - useInjectedUIContext, - RegistrationActions, - AccountDetailInformation, - CustomRegistrationForm, - CustomAccountDetails, - AccountDetailsFormProps, -} from '@brightlayer-ui/react-auth-shared'; -import { useNavigate } from 'react-router-dom'; -import { useQueryString } from '../hooks/useQueryString'; -import { useRoutes } from '../contexts/RoutingContext'; -import Button from '@mui/material/Button'; -import CardActions from '@mui/material/CardActions'; -import CardContent from '@mui/material/CardContent'; -import CardHeader from '@mui/material/CardHeader'; -import Divider from '@mui/material/Divider'; -import Typography from '@mui/material/Typography'; -import MobileStepper from '@mui/material/MobileStepper'; -import { BrandedCardContainer, SimpleDialog } from '../components'; -import { CreateAccount as CreateAccountScreen } from './subScreens/CreateAccount'; -import { AcceptEula } from './subScreens/AcceptEula'; -import { VerifyEmail as VerifyEmailScreen } from './subScreens/VerifyEmail'; -import { CreatePassword as CreatePasswordScreen } from './subScreens/CreatePassword'; -import { AccountDetails as AccountDetailsScreen, AccountDetailsWrapper } from './subScreens/AccountDetails'; -import { RegistrationComplete } from './subScreens/RegistrationComplete'; -import { ExistingAccountComplete } from './subScreens/ExistingAccountComplete'; -import { CustomRegistrationDetailsGroup, RegistrationPage } from '../types'; -import { - DialogButtonStyles, - DialogActionsStyles, - DialogContentStyles, - DialogTitleStyles, - StepperDotStyles, - StepperStyles, - TextFieldStyles, -} from '../styles'; -import { useTheme } from '@mui/material/styles'; -import Box from '@mui/material/Box'; - -export const emptyAccountDetailInformation: AccountDetailInformation = { - firstName: '', - lastName: '', -}; - -/** - * Container component that manages the transition between screens for the - * self-registration (i.e., Create Account) workflow. - * - * @category Component - */ -export const SelfRegistrationPager: React.FC> = () => { - const { t } = useLanguageLocale(); - const navigate = useNavigate(); - const { routes } = useRoutes(); - const registrationActions = useRegistrationUIActions(); - const registrationState = useRegistrationUIState(); - const injectedUIContext = useInjectedUIContext(); - const { code, email: urlEmail } = useQueryString(); - const theme = useTheme(); - - // Local State - const [currentPage, setCurrentPage] = useState(0); - const [eulaAccepted, setEulaAccepted] = useState(false); - const [password, setPassword] = useState(''); - const [accountDetails, setAccountDetails] = useState<(AccountDetailInformation & { valid: boolean }) | null>(null); - const [customAccountDetails, setCustomAccountDetails] = useState({}); - const [eulaContent, setEulaContent] = useState(); - const [accountAlreadyExists, setAccountAlreadyExists] = useState(false); - const [hasAcknowledgedError, setHasAcknowledgedError] = useState(false); - - const [verificationCode, setVerificationCode] = useState(code ?? ''); - const [email, setEmail] = useState(urlEmail ?? ''); - - // Pages - // const isLastStep = currentPage === Pages.__LENGTH - 1; - // const isFirstStep = currentPage === 0; - - // Network state (verify code) - const codeRequestTransit = registrationState.inviteRegistration.codeRequestTransit; - const codeRequestIsInTransit = codeRequestTransit.transitInProgress; - const hasCodeRequestTransitError = codeRequestTransit.transitErrorMessage !== null; - const codeRequestTransitErrorMessage = codeRequestTransit.transitErrorMessage ?? t('blui:MESSAGES.REQUEST_ERROR'); - const codeRequestSuccess = codeRequestTransit.transitSuccess; - - // Network state (registration) - const registrationTransit = registrationState.inviteRegistration.registrationTransit; - const registrationIsInTransit = registrationTransit.transitInProgress; - const hasRegistrationTransitError = registrationTransit.transitErrorMessage !== null; - const registrationTransitErrorMessage = registrationTransit.transitErrorMessage ?? t('blui:MESSAGES.REQUEST_ERROR'); - const registrationSuccess = registrationTransit.transitSuccess; - - // Network state (invite code validation) - const isValidationInTransit = registrationState.inviteRegistration.validationTransit.transitInProgress; - const validationTransitErrorMessage = registrationState.inviteRegistration.validationTransit.transitErrorMessage; - const hasValidationTransitError = - registrationState.inviteRegistration.validationTransit.transitErrorMessage !== null; - const validationSuccess = registrationState.inviteRegistration.validationTransit.transitSuccess; - - // Network state (loading eula) - const loadEulaTransitErrorMessage = registrationState.eulaTransit.transitErrorMessage; - - // Custom Registration Success Screens - const customSuccess = injectedUIContext.registrationSuccessScreen; - const customAccountAlreadyExists = injectedUIContext.accountAlreadyExistsScreen; - - const errorBodyText = - (hasCodeRequestTransitError && codeRequestTransitErrorMessage) || - (hasValidationTransitError && validationTransitErrorMessage) || - (hasRegistrationTransitError && registrationTransitErrorMessage) || - registrationTransitErrorMessage; - - // pre-populate fields if they are present in the url - useEffect(() => { - if (typeof code === 'string') { - setVerificationCode(code); - if (typeof urlEmail === 'string') { - setEmail(urlEmail); - } - } - }, [code, urlEmail, setVerificationCode, setEmail]); - - // Load the Eula if we do not yet have the content - const loadAndCacheEula = useCallback(async (): Promise => { - if (!eulaContent) { - try { - const eulaText = await registrationActions.actions.loadEULA(i18n.language); - setEulaContent(eulaText); - } catch { - // do nothing - } - } - }, [eulaContent, setEulaContent, registrationActions]); - - // Send the verification email - const requestCode = useCallback(async (): Promise => { - registrationActions.dispatch(RegistrationActions.requestRegistrationCodeReset()); - setHasAcknowledgedError(false); - try { - await registrationActions.actions.requestRegistrationCode(email); - } catch { - // do nothing - } - }, [registrationActions, setHasAcknowledgedError, email]); - - // Validate the code entered by the user - const validateCode = useCallback(async (): Promise => { - setHasAcknowledgedError(false); - try { - const registrationComplete = await registrationActions.actions.validateUserRegistrationRequest( - verificationCode, - email - ); - if (registrationComplete) { - setAccountAlreadyExists(true); - } - } catch { - // do nothing - } - }, [setHasAcknowledgedError, registrationActions, verificationCode, email, setAccountAlreadyExists]); - - // Reset registration and validation state on dismissal - useEffect(() => { - if (hasAcknowledgedError) { - if (hasCodeRequestTransitError) - registrationActions.dispatch(RegistrationActions.requestRegistrationCodeReset()); - if (hasValidationTransitError) - registrationActions.dispatch(RegistrationActions.validateUserRegistrationReset()); - if (hasRegistrationTransitError) registrationActions.dispatch(RegistrationActions.registerUserReset()); - setHasAcknowledgedError(false); - } - return (): void => { - registrationActions.dispatch(RegistrationActions.requestRegistrationCodeReset()); - registrationActions.dispatch(RegistrationActions.validateUserRegistrationReset()); - registrationActions.dispatch(RegistrationActions.registerUserReset()); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [hasAcknowledgedError]); - - // Call the API to finish registration - const attemptRegistration = useCallback(async (): Promise => { - setHasAcknowledgedError(false); - - let flattenedDetails = {}; - Object.keys(customAccountDetails).forEach((key) => { - flattenedDetails = { ...flattenedDetails, ...customAccountDetails[parseInt(key, 10)].values }; - }); - - try { - await registrationActions.actions.completeRegistration( - { - password: password, - accountDetails: { ...(accountDetails ?? emptyAccountDetailInformation), ...flattenedDetails }, - }, - verificationCode, - email - ); - } catch { - // do nothing - } - }, [ - setHasAcknowledgedError, - registrationActions, - password, - accountDetails, - customAccountDetails, - verificationCode, - email, - ]); - - // Define the pages in the workflow - const customDetails = injectedUIContext.customAccountDetails || []; - //@ts-ignore - const FirstCustomPage: ComponentType< - React.PropsWithChildren> - > | null = customDetails.length > 0 && customDetails[0] ? customDetails[0].component : null; - - const RegistrationPages: RegistrationPage[] = [ - { - name: 'Eula', - pageTitle: t('blui:REGISTRATION.STEPS.LICENSE'), - pageBody: ( - - ), - canGoForward: eulaAccepted, - canGoBack: true, - }, - { - name: 'CreateAccount', - pageTitle: t('blui:REGISTRATION.STEPS.CREATE_ACCOUNT'), - pageBody: ( - 0 ? (): void => advancePage(1) : undefined} - /> - ), - canGoForward: email.length > 0, - canGoBack: true, - }, - { - name: 'VerifyEmail', - pageTitle: t('blui:REGISTRATION.STEPS.VERIFY_EMAIL'), - pageBody: ( - { - void requestCode(); - }} - // eslint-disable-next-line @typescript-eslint/no-use-before-define - onSubmit={verificationCode.length > 0 ? (): void => advancePage(1) : undefined} - /> - ), - canGoForward: verificationCode.length > 0, - canGoBack: true, - }, - { - name: 'CreatePassword', - pageTitle: t('blui:REGISTRATION.STEPS.PASSWORD'), - pageBody: ( - 0 ? (): void => advancePage(1) : undefined} - /> - ), - canGoForward: password.length > 0, - canGoBack: true, - }, - { - name: 'AccountDetails', - pageTitle: t('blui:REGISTRATION.STEPS.ACCOUNT_DETAILS'), - pageBody: ( - - { - /* TODO Focus first field in custom page */ - } - : accountDetails !== null && accountDetails.valid - ? // eslint-disable-next-line @typescript-eslint/no-use-before-define - (): void => advancePage(1) - : undefined - } - /> - {FirstCustomPage && ( - - { - setCustomAccountDetails({ ...customAccountDetails, 0: { values: details, valid } }); - }} - initialDetails={customAccountDetails[0]?.values} - // eslint-disable-next-line @typescript-eslint/no-use-before-define - onSubmit={customAccountDetails[0]?.valid ? (): void => advancePage(1) : undefined} - /> - - )} - - ), - canGoForward: - accountDetails !== null && - accountDetails.valid && - ((FirstCustomPage && customAccountDetails[0]?.valid) || !FirstCustomPage), - canGoBack: true, - }, - ] - .concat( - customDetails - .slice(1) - //@ts-ignore there won't be any nulls after we filter them - .filter((item: ComponentType | null) => item !== null) - .map((page: CustomRegistrationForm, i: number) => { - const PageComponent = page.component; - return { - name: `CustomPage${i + 1}`, - pageTitle: page.title || t('blui:REGISTRATION.STEPS.ACCOUNT_DETAILS'), - pageBody: ( - - { - setCustomAccountDetails({ - ...customAccountDetails, - [i + 1]: { values: details, valid }, - }); - }} - initialDetails={customAccountDetails[i + 1]?.values} - onSubmit={ - // eslint-disable-next-line @typescript-eslint/no-use-before-define - customAccountDetails[i + 1]?.valid ? (): void => advancePage(1) : undefined - } - /> - - ), - canGoForward: customAccountDetails[i + 1]?.valid, - canGoBack: true, - }; - }) - ) - .concat([ - { - name: 'Complete', - pageTitle: t('blui:REGISTRATION.STEPS.COMPLETE'), - pageBody: ( - - ), - canGoForward: true, - canGoBack: false, - }, - ]); - const isLastStep = currentPage === RegistrationPages.length - 1; - const isFirstStep = currentPage === 0; - const CreateAccountPage = RegistrationPages.findIndex((item) => item.name === 'CreateAccount'); - const VerifyEmailPage = RegistrationPages.findIndex((item) => item.name === 'VerifyEmail'); - const CreatePasswordPage = RegistrationPages.findIndex((item) => item.name === 'CreatePassword'); - const CompletePage = RegistrationPages.length - 1; - - // If there is a code and it is not confirmed, go to the verify screen - useEffect((): void => { - if (verificationCode && !codeRequestSuccess) { - setCurrentPage(VerifyEmailPage); - } - }, [codeRequestSuccess, verificationCode, VerifyEmailPage]); - - // If the registration is successful, go to the success screen - useEffect(() => { - if (currentPage === RegistrationPages.length - 2 && registrationSuccess) { - setCurrentPage(CompletePage); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [registrationSuccess]); - - // If the verification code is sent successfully, go to the confirmation page - useEffect(() => { - if (currentPage === CreateAccountPage && codeRequestSuccess) { - setCurrentPage(VerifyEmailPage); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [codeRequestSuccess]); - - // If the email is validated successfully, go to the create password screen - useEffect(() => { - if (currentPage === VerifyEmailPage && validationSuccess) { - setCurrentPage(CreatePasswordPage); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [validationSuccess]); - - // Screen transition logic - const canProgress = (): boolean => RegistrationPages[currentPage].canGoForward ?? false; - const canGoBackProgress = (): boolean => RegistrationPages[currentPage].canGoBack ?? true; - - const advancePage = (delta = 0): void => { - if (delta === 0) { - return; - } else if (isFirstStep && delta < 0) { - navigate(routes.LOGIN); - } else if (isLastStep && delta > 0) { - navigate(routes.LOGIN); - } else { - // If this is the last user-entry step of the invite flow, it is time to make a network call - // Check > 0 so advancing backwards does not risk going into the completion block - if (currentPage === RegistrationPages.length - 2 && !registrationSuccess && canProgress() && delta > 0) { - void attemptRegistration(); - } else if (currentPage === CreateAccountPage && !codeRequestIsInTransit && canProgress() && delta > 0) { - void requestCode(); - } else if (currentPage === VerifyEmailPage && !isValidationInTransit && canProgress() && delta > 0) { - void validateCode(); - } else { - setCurrentPage(currentPage + delta); - } - } - }; - - // Page content logic - const pageTitle = (): string => { - if (accountAlreadyExists) return t('blui:REGISTRATION.STEPS.COMPLETE'); - return RegistrationPages[currentPage].pageTitle || ''; - }; - - // Page actions logic - let buttonArea: JSX.Element; - if (accountAlreadyExists) { - buttonArea = ( - - ); - } else if (isLastStep) { - buttonArea = ( - - ); - } else { - buttonArea = ( - advancePage(-1)} - sx={DialogButtonStyles()} - > - {isFirstStep ? t('blui:ACTIONS.CANCEL') : t('blui:ACTIONS.BACK')} - - } - nextButton={ - - } - sx={{ ...StepperStyles, '& .MuiMobileStepper-dot': StepperDotStyles(theme) }} - /> - ); - } - - const errorDialog = ( - { - setHasAcknowledgedError(true); - }} - /> - ); - - // Custom "Account Already Exists" - if (accountAlreadyExists && customAccountAlreadyExists) { - return ( - - {typeof customAccountAlreadyExists === 'function' && customAccountAlreadyExists(undefined)} - {typeof customAccountAlreadyExists !== 'function' && customAccountAlreadyExists} - - ); - } - // Custom Success Screen - else if (isLastStep && !accountAlreadyExists && validationSuccess && !isValidationInTransit && customSuccess) { - return ( - - {typeof customSuccess === 'function' && customSuccess({ accountDetails: accountDetails })} - {typeof customSuccess !== 'function' && customSuccess} - - ); - } - - return ( - - {errorDialog} - - {pageTitle()} - - } - sx={DialogTitleStyles(theme)} - /> - - {accountAlreadyExists ? : RegistrationPages[currentPage].pageBody} - - - {buttonArea} - - ); -}; diff --git a/login-workflow/src/screens/Splash.tsx b/login-workflow/src/screens/Splash.tsx deleted file mode 100644 index 189264b0..00000000 --- a/login-workflow/src/screens/Splash.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import React from 'react'; -import CardContent from '@mui/material/CardContent'; -import { BrandedCardContainer } from '../components'; -import CircularProgress from '@mui/material/CircularProgress'; -import Box from '@mui/material/Box'; - -type SplashProps = { - mainImage?: string | number; -}; - -/** - * Renders the splash screen displayed while loading the initial - * authentication state. - * - * @param mainImage the product logo or image to use on the loading screen - * - * @category Component - */ -export const Splash: React.FC>> = (props) => { - const { mainImage } = props; - - return ( - - - {mainImage && ( - - - - )} - - - - ); -}; diff --git a/login-workflow/src/screens/SuccessScreen/SuccessScreenBase.test.tsx b/login-workflow/src/screens/SuccessScreen/SuccessScreenBase.test.tsx new file mode 100644 index 00000000..92f6749b --- /dev/null +++ b/login-workflow/src/screens/SuccessScreen/SuccessScreenBase.test.tsx @@ -0,0 +1,45 @@ +import React from 'react'; +import '@testing-library/jest-dom'; +import { render, cleanup, screen, fireEvent } from '@testing-library/react'; +import { SuccessScreenBase } from './SuccessScreenBase'; +import { Circle } from '@mui/icons-material'; + +afterEach(cleanup); + +describe('SuccessScreenBase tests', () => { + let mockOnDismiss: any; + + afterEach(() => { + jest.clearAllMocks(); + }); + + beforeEach(() => { + mockOnDismiss = jest.fn(); + }); + + it('rendering the screen without any props', () => { + render(} />); + }); + + it('renders without crashing', () => { + render( + {}, + }} + icon={} + messageTitle="Welcome" + message="This is welcome page" + onDismiss={mockOnDismiss} + /> + ); + + expect(screen.getByText('Test')).toBeInTheDocument(); + const continueButton = screen.getByTestId('BluiWorkflowCardActions-nextButton'); + fireEvent.click(continueButton); + }); +}); diff --git a/login-workflow/src/screens/SuccessScreen/SuccessScreenBase.tsx b/login-workflow/src/screens/SuccessScreen/SuccessScreenBase.tsx new file mode 100644 index 00000000..0c53d650 --- /dev/null +++ b/login-workflow/src/screens/SuccessScreen/SuccessScreenBase.tsx @@ -0,0 +1,55 @@ +import React from 'react'; +import { + WorkflowCard, + WorkflowCardActions, + WorkflowCardBody, + WorkflowCardHeader, + WorkflowCardInstructions, +} from '../../components/WorkflowCard'; +import { SuccessScreenProps } from './types'; +import { WorkflowFinishState } from '../../components'; + +/** + * Component that renders a success screen + * + * @param icon the icon to be displayed on the screen + * @param messageTitle title of the success message + * @param message success message to be displayed on the screen + * @param dismissButtonLabel to display label for the button + * @param canDismiss function to call when the dismiss button is clicked + * @param onDismiss function to call when user clicks button + * @param WorkflowCardBaseProps props that will be passed to the WorkflowCard component + * @param WorkflowCardHeaderProps props that will be passed to the WorkflowCardHeader component + * @param WorkflowCardInstructionProps props that will be passed to the WorkflowCardInstructions component + * @param WorkflowCardActionsProps props that will be passed to the WorkflowCardActions component + * + * @category Component + */ + +export const SuccessScreenBase: React.FC = (props) => { + const { icon, messageTitle = '', message = '', dismissButtonLabel = '', canDismiss, onDismiss } = props; + + const cardBaseProps = props.WorkflowCardBaseProps || {}; + const headerProps = props.WorkflowCardHeaderProps || {}; + const instructionsProps = props.WorkflowCardInstructionProps || {}; + const actionsProps = props.WorkflowCardActionsProps || {}; + + return ( + + + {Object.keys(instructionsProps).length !== 0 && } + + + + { + if (onDismiss) onDismiss(); + if (actionsProps.onNext) actionsProps.onNext(); + }} + /> + + ); +}; diff --git a/login-workflow/src/screens/SuccessScreen/index.ts b/login-workflow/src/screens/SuccessScreen/index.ts new file mode 100644 index 00000000..51016209 --- /dev/null +++ b/login-workflow/src/screens/SuccessScreen/index.ts @@ -0,0 +1,2 @@ +export * from './SuccessScreenBase'; +export * from './types'; diff --git a/login-workflow/src/screens/SuccessScreen/types.ts b/login-workflow/src/screens/SuccessScreen/types.ts new file mode 100644 index 00000000..ee477c3a --- /dev/null +++ b/login-workflow/src/screens/SuccessScreen/types.ts @@ -0,0 +1,41 @@ +import { ReactNode } from 'react'; +import { ErrorManagerProps } from '../../components/Error'; +import { WorkflowCardProps } from '../../components/WorkflowCard/WorkflowCard.types'; + +export type SuccessScreenProps = WorkflowCardProps & { + /** + * The icon to display in the header + */ + icon?: JSX.Element; + + /** + * The title of the success message + */ + messageTitle?: string; + + /** + * The success message to be displayed on the screen + */ + message?: ReactNode; + + /** + * To display label for the button + */ + dismissButtonLabel?: string; + + /** + * The function to call when the dismiss button is clicked + */ + canDismiss?: boolean | (() => boolean); + + /** + * The function to call when user clicks button + * @returns void + */ + onDismiss?: () => void; + + /** + * The configuration for customizing how errors are displayed + */ + errorDisplayConfig?: ErrorManagerProps; +}; diff --git a/login-workflow/src/screens/VerifyCodeScreen/VerifyCodeScreen.test.tsx b/login-workflow/src/screens/VerifyCodeScreen/VerifyCodeScreen.test.tsx new file mode 100644 index 00000000..c10748d3 --- /dev/null +++ b/login-workflow/src/screens/VerifyCodeScreen/VerifyCodeScreen.test.tsx @@ -0,0 +1,173 @@ +import React from 'react'; +import '@testing-library/jest-dom'; +import { cleanup, render, screen, fireEvent, RenderResult } from '@testing-library/react'; +import { VerifyCodeScreen } from './VerifyCodeScreen'; +import { VerifyCodeScreenProps } from './types'; +import { RegistrationContextProvider } from '../../contexts'; +import { RegistrationWorkflow } from '../../components'; +import { registrationContextProviderProps } from '../../testUtils'; + +afterEach(cleanup); + +describe('Verify Code Screen', () => { + let mockOnResend: any; + let mockOnNext: any; + + afterEach(() => { + jest.clearAllMocks(); + }); + + beforeEach(() => { + mockOnResend = jest.fn(); + mockOnNext = jest.fn(); + }); + + const renderer = (props?: VerifyCodeScreenProps): RenderResult => + render( + + + + + + ); + + it('renders without crashing', () => { + renderer(); + + expect(screen.getByText('Verify Email')).toBeInTheDocument(); + expect( + screen.getByText( + 'A verification code has been sent to the email address you provided. Click the link or enter the code below to continue. This code is valid for 30 minutes.' + ) + ).toBeInTheDocument(); + expect(screen.getByText('Send Again')).toBeInTheDocument(); + expect(screen.getByText("Didn't receive an email?")).toBeInTheDocument(); + expect(screen.getByText('Next')).toBeInTheDocument(); + expect(screen.getByText(/Next/i)).toBeDisabled(); + expect(screen.getByText('Back')).toBeInTheDocument(); + expect(screen.getByText(/Back/i)).toBeEnabled(); + }); + + it('sets error state when code is too short', () => { + const { getByLabelText, rerender } = renderer(); + + // Rerender to ensure state changes have taken effect + rerender( + + + { + if (code?.length > 2) { + return true; + } + return 'Code must be at least 3 characters'; + }} + /> + + + ); + + const verifyCodeInput = getByLabelText('Verify Code'); + fireEvent.change(verifyCodeInput, { target: { value: '12' } }); + fireEvent.blur(verifyCodeInput); + expect(screen.getByText(/Next/i)).toBeDisabled(); + expect(verifyCodeInput).toHaveAttribute('aria-invalid', 'true'); + }); + + it('does not set error state when code is long enough', () => { + const { getByLabelText, rerender } = renderer(); + + // Rerender to ensure state changes have taken effect + rerender( + + + { + if (code?.length > 2) { + return true; + } + return 'Code must be at least 3 characters'; + }} + /> + + + ); + + const verifyCodeInput = getByLabelText('Verify Code'); + fireEvent.change(verifyCodeInput, { target: { value: '1234' } }); + fireEvent.blur(verifyCodeInput); + expect(screen.getByText(/Next/i)).toBeEnabled(); + expect(verifyCodeInput).toHaveAttribute('aria-invalid', 'false'); + }); + + it('calls onResend when the resend link is clicked', () => { + const { getByText } = render( + + + + + + ); + + const resendLink = getByText('Resend'); + fireEvent.click(resendLink); + expect(mockOnResend).toHaveBeenCalled(); + }); + + it('calls onNext when the next button is clicked', () => { + const { getByLabelText } = renderer({ + WorkflowCardActionsProps: { + canGoNext: true, + showNext: true, + nextLabel: 'Next', + onNext: mockOnNext(), + }, + }); + + const verifyCodeInput = getByLabelText('Verification Code'); + const nextButton = screen.getByText('Next'); + expect(verifyCodeInput).toHaveValue(''); + expect(screen.getByText(/Next/i)).toBeDisabled(); + fireEvent.change(verifyCodeInput, { target: { value: '123' } }); + fireEvent.click(nextButton); + expect(mockOnNext).toHaveBeenCalled(); + }); + + it('pre-populates the input field with initialValue', () => { + const { getByLabelText } = render( + + + + + + ); + + const verifyCodeInput = getByLabelText('Verify Code'); + expect(verifyCodeInput).toHaveValue('123'); + }); + + it('displays title, instructions, resendInstructions, and resendLabel correctly', () => { + const { getByText } = render( + + + + + + ); + + expect(getByText('Title')).toBeInTheDocument(); + expect(getByText('Instructions')).toBeInTheDocument(); + expect(getByText('Resend Instructions')).toBeInTheDocument(); + expect(getByText('Resend')).toBeInTheDocument(); + }); +}); diff --git a/login-workflow/src/screens/VerifyCodeScreen/VerifyCodeScreen.tsx b/login-workflow/src/screens/VerifyCodeScreen/VerifyCodeScreen.tsx new file mode 100644 index 00000000..daa2ec20 --- /dev/null +++ b/login-workflow/src/screens/VerifyCodeScreen/VerifyCodeScreen.tsx @@ -0,0 +1,169 @@ +import React, { useCallback, useState } from 'react'; +import { VerifyCodeScreenBase } from './VerifyCodeScreenBase'; +import { VerifyCodeScreenProps } from './types'; +import { useRegistrationContext, useRegistrationWorkflowContext } from '../../contexts'; +import { useErrorManager } from '../../contexts/ErrorContext/useErrorManager'; +import { useTranslation } from 'react-i18next'; + +/** + * Component that renders a screen that prompts a user to enter the confirmation code + * that was sent to the email address that they used to register. + * + * @param codeValidator function that validates the code text field + * @param onResend function that is called when the resend link/button is clicked + * @param resendInstructions text to display ahead of the resend link/button + * @param resendLabel text to display for the resend link/button + * @param initialValue the initial value for the code text field + * @param verifyCodeInputLabel the label for the code text field + * @param errorDisplayConfig configuration for customizing how errors are displayed + * @param WorkflowCardBaseProps props that will be passed to the WorkflowCard component + * @param WorkflowCardHeaderProps props that will be passed to the WorkflowCardHeader component + * @param WorkflowCardInstructionProps props that will be passed to the WorkflowCardInstructions component + * @param WorkflowCardActionsProps props that will be passed to the WorkflowCardActions component + * @param verifyCodeTextFieldProps props to pass to the verify code field. + * + * @category Component + */ + +export const VerifyCodeScreen: React.FC = (props) => { + const { t } = useTranslation(); + const regWorkflow = useRegistrationWorkflowContext(); + const { actions } = useRegistrationContext(); + const { nextScreen, previousScreen, screenData, currentScreen, totalScreens, updateScreenData } = regWorkflow; + const { emailAddress } = screenData.CreateAccount; + const { triggerError, errorManagerConfig } = useErrorManager(); + const errorDisplayConfig = { + ...errorManagerConfig, + ...props.errorDisplayConfig, + onClose: (): void => { + if (props.errorDisplayConfig && props.errorDisplayConfig.onClose) props.errorDisplayConfig.onClose(); + if (errorManagerConfig.onClose) errorManagerConfig?.onClose(); + }, + }; + + const [verifyCode, setVerifyCode] = useState(screenData.VerifyCode.code); + const [isLoading, setIsLoading] = useState(false); + + const requestResendCode = useCallback(async (): Promise => { + try { + setIsLoading(true); + await actions?.requestRegistrationCode?.(emailAddress ? emailAddress : ''); + } catch (_error) { + triggerError(_error as Error); + } finally { + setIsLoading(false); + } + }, [actions, emailAddress, triggerError]); + + const { + codeValidator = (code: string): boolean | string => + code?.length > 0 ? true : t('bluiRegistration:SELF_REGISTRATION.VERIFY_EMAIL.CODE_VALIDATOR_ERROR'), + onResend = (): void => { + void requestResendCode(); + }, + resendInstructions = t('bluiRegistration:SELF_REGISTRATION.VERIFY_EMAIL.VERIFICATION_CODE_PROMPT'), + resendLabel = t('bluiCommon:ACTIONS.RESEND'), + verifyCodeInputLabel = t('bluiRegistration:SELF_REGISTRATION.VERIFY_EMAIL.VERIFICATION'), + initialValue = screenData.VerifyCode.code, + verifyCodeTextFieldProps, + } = props; + + const handleOnNext = useCallback( + async (code: string) => { + try { + setIsLoading(true); + if (actions?.validateUserRegistrationRequest) { + // eslint-disable-next-line no-unsafe-optional-chaining + const { codeValid, accountExists } = await actions?.validateUserRegistrationRequest(code); + + if (accountExists) { + updateScreenData({ screenId: 'VerifyCode', values: { code }, isAccountExist: accountExists }); + } else { + if (typeof codeValid === 'boolean') { + if (codeValid) + void nextScreen({ + screenId: 'VerifyCode', + values: { code }, + isAccountExist: accountExists, + }); + else { + triggerError( + new Error(t('bluiRegistration:SELF_REGISTRATION.VERIFY_EMAIL.CODE_VALIDATOR_ERROR')) + ); + } + } else { + triggerError(new Error(codeValid)); + } + } + } + } catch (_error) { + triggerError(_error as Error); + } finally { + setIsLoading(false); + } + }, + [t, actions, nextScreen, triggerError, updateScreenData] + ); + + const onPrevious = (code: string): void => { + previousScreen({ + screenId: 'VerifyCode', + values: { code }, + }); + }; + + const { WorkflowCardBaseProps, WorkflowCardHeaderProps, WorkflowCardInstructionProps, WorkflowCardActionsProps } = + props; + + const workflowCardBaseProps = { + loading: isLoading, + ...WorkflowCardBaseProps, + }; + + const workflowCardHeaderProps = { + title: t('bluiRegistration:REGISTRATION.STEPS.VERIFY_EMAIL'), + ...WorkflowCardHeaderProps, + }; + + const workflowCardInstructionProps = { + instructions: t('bluiRegistration:SELF_REGISTRATION.VERIFY_EMAIL.MESSAGE'), + ...WorkflowCardInstructionProps, + }; + + const workflowCardActionsProps = { + showNext: true, + nextLabel: t('bluiCommon:ACTIONS.NEXT'), + showPrevious: true, + previousLabel: t('bluiCommon:ACTIONS.BACK'), + canGoPrevious: true, + currentStep: currentScreen, + totalSteps: totalScreens, + ...WorkflowCardActionsProps, + onNext: (data: any): void => { + setVerifyCode(data.code); + void handleOnNext(data.code); + WorkflowCardActionsProps?.onNext?.(); + }, + onPrevious: (data: any): void => { + void onPrevious(data.code); + WorkflowCardActionsProps?.onPrevious?.(); + }, + }; + + return ( + 0 ? verifyCode : initialValue} + onResend={onResend} + codeValidator={codeValidator} + errorDisplayConfig={errorDisplayConfig} + verifyCodeTextFieldProps={verifyCodeTextFieldProps} + /> + ); +}; diff --git a/login-workflow/src/screens/VerifyCodeScreen/VerifyCodeScreenBase.test.tsx b/login-workflow/src/screens/VerifyCodeScreen/VerifyCodeScreenBase.test.tsx new file mode 100644 index 00000000..285926b9 --- /dev/null +++ b/login-workflow/src/screens/VerifyCodeScreen/VerifyCodeScreenBase.test.tsx @@ -0,0 +1,200 @@ +import React from 'react'; +import '@testing-library/jest-dom'; +import { cleanup, render, screen, fireEvent, RenderResult } from '@testing-library/react'; +import { VerifyCodeScreenBase } from './VerifyCodeScreenBase'; +import { registrationContextProviderProps } from '../../testUtils'; +import { RegistrationContextProvider } from '../../contexts'; +import { VerifyCodeScreenProps } from './types'; +import { RegistrationWorkflow } from '../../components'; + +afterEach(cleanup); + +describe('Verify Code Screen Base', () => { + let mockOnResend: any; + let mockOnNext: any; + + afterEach(() => { + jest.clearAllMocks(); + }); + + beforeEach(() => { + mockOnResend = jest.fn(); + mockOnNext = jest.fn(); + }); + + const renderer = (props?: VerifyCodeScreenProps): RenderResult => + render( + + + + + + ); + + it('renders without crashing', () => { + renderer(); + render( + + ); + expect(screen.getByText('Verify Email')).toBeInTheDocument(); + expect(screen.getByText('Verification code instructions')).toBeInTheDocument(); + expect(screen.getByText('Send Again')).toBeInTheDocument(); + expect(screen.getByText("Didn't receive email?")).toBeInTheDocument(); + expect(screen.getByText('Next')).toBeInTheDocument(); + expect(screen.getByText(/Next/i)).toBeDisabled(); + expect(screen.getByText('Back')).toBeInTheDocument(); + expect(screen.getByText(/Back/i)).toBeEnabled(); + }); + + it('sets error state when code is too short', () => { + const { getByLabelText, rerender } = render( + { + if (code?.length > 2) { + return true; + } + return 'Code must be at least 3 characters'; + }} + /> + ); + + const verifyCodeInput = getByLabelText('Verify Code'); + fireEvent.change(verifyCodeInput, { target: { value: '12' } }); + fireEvent.blur(verifyCodeInput); + + // Rerender to ensure state changes have taken effect + rerender( + { + if (code?.length > 2) { + return true; + } + return 'Code must be at least 3 characters'; + }} + /> + ); + expect(verifyCodeInput).toHaveAttribute('aria-invalid', 'true'); + }); + + it('does not set error state when code is long enough', () => { + const { getByLabelText, rerender } = render( + { + if (code?.length > 2) { + return true; + } + return 'Code must be at least 3 characters'; + }} + /> + ); + + const verifyCodeInput = getByLabelText('Verify Code'); + fireEvent.change(verifyCodeInput, { target: { value: '123' } }); + fireEvent.blur(verifyCodeInput); + + // Rerender to ensure state changes have taken effect + rerender( + { + if (code?.length > 2) { + return true; + } + return 'Code must be at least 3 characters'; + }} + /> + ); + expect(verifyCodeInput).not.toHaveAttribute('aria-invalid', 'true'); + }); + + it('calls onResend when the resend link is clicked', () => { + const { getByText } = render(); + + const resendLink = getByText('Resend'); + fireEvent.click(resendLink); + + expect(mockOnResend).toHaveBeenCalled(); + }); + + it('calls onNext when the next button is clicked', () => { + const { getByText } = render( + + ); + + const nextButton = getByText('Next'); + fireEvent.click(nextButton); + + expect(mockOnNext).toHaveBeenCalled(); + }); + + it('pre-populates the input field with initialValue', () => { + const { getByLabelText } = render( + { + if (code?.length > 2) { + return true; + } + return 'Code must be at least 3 characters'; + }} + /> + ); + + const verifyCodeInput = getByLabelText('Verify Code'); + expect(verifyCodeInput).toHaveValue('123'); + }); + + it('displays title, instructions, resendInstructions, and resendLabel correctly', () => { + const { getByText } = render( + + ); + + expect(getByText('Title')).toBeInTheDocument(); + expect(getByText('Instructions')).toBeInTheDocument(); + expect(getByText('Resend Instructions')).toBeInTheDocument(); + expect(getByText('Resend')).toBeInTheDocument(); + }); +}); diff --git a/login-workflow/src/screens/VerifyCodeScreen/VerifyCodeScreenBase.tsx b/login-workflow/src/screens/VerifyCodeScreen/VerifyCodeScreenBase.tsx new file mode 100644 index 00000000..98e2d116 --- /dev/null +++ b/login-workflow/src/screens/VerifyCodeScreen/VerifyCodeScreenBase.tsx @@ -0,0 +1,138 @@ +import React, { useCallback, useEffect } from 'react'; +import { VerifyCodeScreenProps } from './types'; +import { WorkflowCard } from '../../components/WorkflowCard'; +import { WorkflowCardActions } from '../../components/WorkflowCard/WorkflowCardActions'; +import { WorkflowCardBody } from '../../components/WorkflowCard/WorkflowCardBody'; +import { WorkflowCardHeader } from '../../components/WorkflowCard/WorkflowCardHeader'; +import { WorkflowCardInstructions } from '../../components/WorkflowCard/WorkflowCardInstructions'; +import TextField from '@mui/material/TextField'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import ErrorManager from '../../components/Error/ErrorManager'; + +/** + * Component that renders a screen that prompts a user to enter the confirmation code + * that was sent to the email address that they used to register. + * + * @param codeValidator function that validates the code text field + * @param onResend function that is called when the resend link/button is clicked + * @param resendInstructions text to display ahead of the resend link/button + * @param resendLabel text to display for the resend link/button + * @param initialValue the initial value for the code text field + * @param verifyCodeInputLabel the label for the code text field + * @param errorDisplayConfig configuration for customizing how errors are displayed + * @param WorkflowCardBaseProps props that will be passed to the WorkflowCard component + * @param WorkflowCardHeaderProps props that will be passed to the WorkflowCardHeader component + * @param WorkflowCardInstructionProps props that will be passed to the WorkflowCardInstructions component + * @param WorkflowCardActionsProps props that will be passed to the WorkflowCardActions component + * @param verifyCodeTextFieldProps props to pass to the verify code field. + * + * @category Component + */ + +export const VerifyCodeScreenBase: React.FC> = (props) => { + const { + codeValidator, + onResend, + resendInstructions, + resendLabel, + verifyCodeInputLabel, + initialValue, + errorDisplayConfig, + verifyCodeTextFieldProps, + } = props; + + const cardBaseProps = props.WorkflowCardBaseProps || {}; + const headerProps = props.WorkflowCardHeaderProps || {}; + const instructionsProps = props.WorkflowCardInstructionProps || {}; + const actionsProps = props.WorkflowCardActionsProps || {}; + + const [verifyCode, setVerifyCode] = React.useState(initialValue ?? ''); + const [shouldValidateCode, setShouldValidateCode] = React.useState(false); + const [isCodeValid, setIsCodeValid] = React.useState(codeValidator ? codeValidator(initialValue ?? '') : false); + const [codeError, setCodeError] = React.useState(''); + + const handleVerifyCodeInputChange = useCallback( + (code: string) => { + setVerifyCode(code); + if (codeValidator) { + const validatorResponse = codeValidator(code); + setIsCodeValid(typeof validatorResponse === 'boolean' ? validatorResponse : false); + setCodeError(typeof validatorResponse === 'string' ? validatorResponse : ''); + } + }, + [codeValidator] + ); + + useEffect(() => { + if (verifyCode.length > 0) { + setShouldValidateCode(true); + handleVerifyCodeInputChange(verifyCode); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const handleOnNext = (): void => { + const { onNext } = actionsProps; + if (onNext) onNext({ code: verifyCode }); + }; + + const handleOnPrevious = (): void => { + const { onPrevious } = actionsProps; + if (onPrevious) onPrevious({ code: verifyCode }); + }; + + return ( + + + + + + { + // eslint-disable-next-line no-unused-expressions + verifyCodeTextFieldProps?.onBlur && verifyCodeTextFieldProps.onBlur(e); + setShouldValidateCode(true); + }} + onChange={(evt): void => { + // eslint-disable-next-line no-unused-expressions + verifyCodeTextFieldProps?.onChange && verifyCodeTextFieldProps.onChange(evt); + handleVerifyCodeInputChange(evt.target.value); + }} + onKeyUp={(e): void => { + if (e.key === 'Enter' && ((verifyCode.length > 0 && isCodeValid) || actionsProps.canGoNext)) + handleOnNext(); + }} + /> + + + {resendInstructions} + onResend?.()} + color="primary" + variant={'button'} + > + {' '} + {resendLabel} + + + + + + 0 && isCodeValid && actionsProps.canGoNext) as any} + onNext={handleOnNext} + onPrevious={handleOnPrevious} + /> + + ); +}; diff --git a/login-workflow/src/screens/VerifyCodeScreen/index.ts b/login-workflow/src/screens/VerifyCodeScreen/index.ts new file mode 100644 index 00000000..56be9d2e --- /dev/null +++ b/login-workflow/src/screens/VerifyCodeScreen/index.ts @@ -0,0 +1,3 @@ +export * from './VerifyCodeScreenBase'; +export * from './VerifyCodeScreen'; +export * from './types'; diff --git a/login-workflow/src/screens/VerifyCodeScreen/types.ts b/login-workflow/src/screens/VerifyCodeScreen/types.ts new file mode 100644 index 00000000..c27f9154 --- /dev/null +++ b/login-workflow/src/screens/VerifyCodeScreen/types.ts @@ -0,0 +1,49 @@ +import { TextFieldProps } from '@mui/material'; +import { ErrorManagerProps } from '../../components/Error'; +import { WorkflowCardProps } from '../../components/WorkflowCard/WorkflowCard.types'; + +export type VerifyCodeScreenProps = WorkflowCardProps & { + /** + * The function that validates the code text field + * @param {string} code - validates code input length + * @returns boolean | string + */ + codeValidator?: (code: string) => boolean | string; + + /** + * The function that is called when the resend link/button is clicked + * @returns void + */ + onResend?: () => void; + + /** + * The text to display ahead of the resend link/button + */ + resendInstructions?: string; + + /** + * The text to display for the resend link/button + */ + resendLabel?: string; + + /** + * The initial value for the code text field + */ + initialValue?: string; + + /** + * The label for the code text field + */ + verifyCodeInputLabel?: string; + + /** + * The configuration for customizing how errors are displayed + */ + errorDisplayConfig?: ErrorManagerProps; + + /** + * The props to pass to the verify code field. + * See [MUI's TextFieldProps API](https://mui.com/material-ui/api/text-field/) for more details. + */ + verifyCodeTextFieldProps?: TextFieldProps; +}; diff --git a/login-workflow/src/screens/index.ts b/login-workflow/src/screens/index.ts new file mode 100644 index 00000000..f4457800 --- /dev/null +++ b/login-workflow/src/screens/index.ts @@ -0,0 +1,15 @@ +export * from './LoginScreen'; +export * from './VerifyCodeScreen'; +export * from './SuccessScreen'; +export * from './EulaScreen'; +export * from './CreatePasswordScreen'; +export * from './AccountDetailsScreen'; +export * from './CreateAccountScreen'; +export * from './LoginScreen'; +export * from './ResetPasswordScreen'; +export * from './SuccessScreen'; +export * from './VerifyCodeScreen'; +export * from './ForgotPasswordScreen'; +export * from './ContactScreen'; +export * from './RegistrationSuccessScreen'; +export * from './ExistingAccountSuccessScreen'; diff --git a/login-workflow/src/screens/subScreens/AcceptEula.tsx b/login-workflow/src/screens/subScreens/AcceptEula.tsx deleted file mode 100644 index 6318f642..00000000 --- a/login-workflow/src/screens/subScreens/AcceptEula.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import React, { useEffect } from 'react'; -import { useLanguageLocale } from '@brightlayer-ui/react-auth-shared'; -import Typography from '@mui/material/Typography'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import Checkbox from '@mui/material/Checkbox'; -import DOMPurify from 'dompurify'; -import Box from '@mui/material/Box'; - -export type AcceptEulaProps = { - eulaAccepted: boolean; - eulaContent?: string; - onEulaChanged: (accepted: boolean) => void; - loadEula: () => Promise | void; - htmlEula?: boolean; - eulaError?: string; -}; - -/** - * Component that renders a screen displaying the EULA and requests acceptance via a checkbox. - * - * @param eulaAccepted true if the checkbox should be checked - * @param eulaContent the content to render for the EULA. Can be a plain string or HTML - * @param onEulaChanged function to call when the state of the checkbox is changed - * @param loadEula function to call to retrieve the eulaContent - * @param htmlEula true if the EULA should be rendered as HTML - * @param eulaError error message if the EULA fails to load - * - * @category Component - */ -export const AcceptEula: React.FC>> = (props) => { - const { eulaAccepted, eulaContent, onEulaChanged, loadEula, htmlEula, eulaError } = props; - const { t } = useLanguageLocale(); - - const eulaContentInternals = eulaContent ?? eulaError ?? t('blui:REGISTRATION.EULA.LOADING'); - - useEffect(() => { - void loadEula(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - return ( - <> - {!htmlEula && {eulaContentInternals}} - {htmlEula && ( - - )} - ): void => - onEulaChanged(event.target.checked) - } - /> - } - label={t('blui:REGISTRATION.EULA.AGREE_TERMS')} - sx={{ flex: '0 0 auto', mr: 0, mt: 2 }} - /> - - ); -}; diff --git a/login-workflow/src/screens/subScreens/AccountDetails.tsx b/login-workflow/src/screens/subScreens/AccountDetails.tsx deleted file mode 100644 index c058b499..00000000 --- a/login-workflow/src/screens/subScreens/AccountDetails.tsx +++ /dev/null @@ -1,105 +0,0 @@ -import React, { useEffect, useRef } from 'react'; -import Typography from '@mui/material/Typography'; -import TextField from '@mui/material/TextField'; -import Divider from '@mui/material/Divider'; -import { useLanguageLocale, AccountDetailInformation, useInjectedUIContext } from '@brightlayer-ui/react-auth-shared'; -import { useTheme } from '@mui/material/styles'; -import { FullDividerStyles, TextFieldStyles } from '../../styles'; - -export type AccountDetailsWrapperProps = { - description?: string; -}; -export type AccountDetailsProps = { - onDetailsChanged: (details: (AccountDetailInformation & { valid: boolean }) | null) => void; - initialDetails?: AccountDetailInformation; - onSubmit?: () => void; -}; - -/** - * Component that wraps a form field with an optional description text. - * - * @param description an object specifying any details to pre-fill - * @category Component - */ -export const AccountDetailsWrapper: React.FC< - React.PropsWithChildren> -> = (props) => { - const { t } = useLanguageLocale(); - const { description = t('blui:REGISTRATION.INSTRUCTIONS.ACCOUNT_DETAILS') } = props; - const theme = useTheme(); - - return ( - <> - {description} - - {props.children} - - ); -}; - -/** - * Component that renders a screen requesting user first and last name. - * - * @param initialDetails an object specifying any details to pre-fill - * @param onDetailsChanged a function to call when any of the detail fields values change - * @param onSubmit function to call when the user submits the mini form - * @category Component - */ -export const AccountDetails: React.FC>> = ( - props -) => { - const { onDetailsChanged, initialDetails, onSubmit } = props; - const { t } = useLanguageLocale(); - const theme = useTheme(); - - const firstRef = useRef(null); - const lastRef = useRef(null); - - const [firstNameInput, setFirstNameInput] = React.useState(initialDetails ? initialDetails.firstName : ''); - const [lastNameInput, setLastNameInput] = React.useState(initialDetails ? initialDetails.lastName : ''); - - const firstNameLengthLimit = useInjectedUIContext()?.registrationConfig?.firstName?.maxLength || null; - const lastNameLengthLimit = useInjectedUIContext()?.registrationConfig?.lastName?.maxLength || null; - - useEffect((): void => { - // validation checks - const valid = firstNameInput !== '' && lastNameInput !== ''; - onDetailsChanged({ firstName: firstNameInput, lastName: lastNameInput, valid }); - }, [onDetailsChanged, firstNameInput, lastNameInput]); - - return ( - <> - { - setFirstNameInput(evt.target.value); - }} - onKeyPress={(e): void => { - if (e.key === 'Enter' && lastRef.current) lastRef.current.focus(); - }} - variant="filled" - inputProps={{ maxLength: firstNameLengthLimit }} - /> - { - setLastNameInput(evt.target.value); - }} - onKeyPress={(e): void => { - if (e.key === 'Enter' && onSubmit) onSubmit(); - }} - variant="filled" - sx={TextFieldStyles(theme)} - inputProps={{ maxLength: lastNameLengthLimit }} - /> - - ); -}; diff --git a/login-workflow/src/screens/subScreens/CreateAccount.tsx b/login-workflow/src/screens/subScreens/CreateAccount.tsx deleted file mode 100644 index aa237d7d..00000000 --- a/login-workflow/src/screens/subScreens/CreateAccount.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import React, { useState } from 'react'; -import { EMAIL_REGEX, useLanguageLocale } from '@brightlayer-ui/react-auth-shared'; -import Typography from '@mui/material/Typography'; -import TextField from '@mui/material/TextField'; -import Divider from '@mui/material/Divider'; -import { FullDividerStyles } from '../../styles'; -import { useTheme } from '@mui/material/styles'; - -const isValidEmail = (text: string): boolean => new RegExp(EMAIL_REGEX).test(text); - -export type CreateAccountProps = { - initialEmail?: string; - onEmailChanged: (email: string) => void; - onSubmit?: () => void; -}; - -/** - * Component that renders a screen for the user to enter their email address to start the - * account creation process. - * - * @param initialEmail email address used to pre-fill the text field - * @param onEmailChanged function to call when the value of the email input changes - * @param onSubmit function to call when the user submits the mini form - * - * @category Component - */ -export const CreateAccount: React.FC>> = ( - props -) => { - const { initialEmail, onEmailChanged, onSubmit } = props; - const { t } = useLanguageLocale(); - const theme = useTheme(); - - const [emailInput, setEmailInput] = useState(initialEmail ?? ''); - - const showEmailError = emailInput.length !== 0 && !isValidEmail(emailInput); - - return ( - <> - {t('blui:SELF_REGISTRATION.INSTRUCTIONS')} - - { - setEmailInput(evt.target.value); - const validEmailOrEmpty = isValidEmail(evt.target.value) ? evt.target.value : ''; - onEmailChanged(validEmailOrEmpty); - }} - onKeyPress={(e): void => { - if (e.key === 'Enter' && onSubmit) onSubmit(); - }} - variant="filled" - error={showEmailError} - helperText={showEmailError ? t('blui:MESSAGES.EMAIL_ENTRY_ERROR') : ''} - /> - - ); -}; diff --git a/login-workflow/src/screens/subScreens/CreatePassword.tsx b/login-workflow/src/screens/subScreens/CreatePassword.tsx deleted file mode 100644 index 9da3b731..00000000 --- a/login-workflow/src/screens/subScreens/CreatePassword.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import React, { useState, useCallback, useEffect, useRef } from 'react'; -import { useLanguageLocale, useInjectedUIContext } from '@brightlayer-ui/react-auth-shared'; -import { ChangePasswordForm } from '../../components'; -import { defaultPasswordRequirements } from '../../constants'; - -export type CreatePasswordProps = { - onPasswordChanged: (password: string) => void; - initialPassword?: string; - onSubmit?: () => void; -}; - -/** - * Component that renders a screen displaying a form for creating a password. - * - * @param initialPassword value to pre-populate the password and confirmation fields - * @param onPasswordChanged function to call when the password or confirm fields change - * @param onSubmit function to call when the mini form is submitted - * - * @category Component - */ -export const CreatePassword: React.FC>> = ( - props -) => { - const { onPasswordChanged, initialPassword = '', onSubmit } = props; - const { t } = useLanguageLocale(); - - const passwordRef = useRef(null); - const confirmRef = useRef(null); - - const [passwordInput, setPasswordInput] = useState(initialPassword); - const [confirmInput, setConfirmInput] = useState(initialPassword); - - const { passwordRequirements = defaultPasswordRequirements(t) } = useInjectedUIContext(); - const areValidMatchingPasswords = useCallback((): boolean => { - for (let i = 0; i < passwordRequirements.length; i++) { - if (!new RegExp(passwordRequirements[i].regex).test(passwordInput)) return false; - } - return confirmInput === passwordInput; - }, [passwordRequirements, passwordInput, confirmInput]); - - const updateFields = useCallback( - (fields: { password: string; confirm: string }) => { - setPasswordInput(fields.password); - setConfirmInput(fields.confirm); - }, - [setPasswordInput, setConfirmInput] - ); - - useEffect(() => { - onPasswordChanged(areValidMatchingPasswords() ? passwordInput : ''); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [onPasswordChanged, passwordInput, confirmInput, areValidMatchingPasswords]); - - return ( - - ); -}; diff --git a/login-workflow/src/screens/subScreens/ExistingAccountComplete.tsx b/login-workflow/src/screens/subScreens/ExistingAccountComplete.tsx deleted file mode 100644 index 00f41bc4..00000000 --- a/login-workflow/src/screens/subScreens/ExistingAccountComplete.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; -import { useLanguageLocale } from '@brightlayer-ui/react-auth-shared'; -import { FinishState } from '../../components'; -import Person from '@mui/icons-material/Person'; - -/** - * Component that renders a screen displaying success for creating an account for - * a user that already exists. - * - * @category Component - */ -export const ExistingAccountComplete: React.FC> = () => { - const { t } = useLanguageLocale(); - - return ( - } - title={t('blui:MESSAGES.WELCOME')} - description={t('blui:REGISTRATION.SUCCESS_EXISTING')} - /> - ); -}; diff --git a/login-workflow/src/screens/subScreens/RegistrationComplete.tsx b/login-workflow/src/screens/subScreens/RegistrationComplete.tsx deleted file mode 100644 index ed4f6962..00000000 --- a/login-workflow/src/screens/subScreens/RegistrationComplete.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import React from 'react'; -import { useLanguageLocale } from '@brightlayer-ui/react-auth-shared'; -import { Trans } from 'react-i18next'; -import { FinishState } from '../../components'; -import CheckCircle from '@mui/icons-material/CheckCircle'; -import Typography from '@mui/material/Typography'; - -export type RegistrationCompleteProps = { - firstName: string; - lastName: string; - email: string; - organization: string; -}; - -/** - * Component that renders a screen displaying success for creating an account for - * a new user. - * - * @param firstName first name for the new user - * @param lastName last name for the new user - * @param email email address for the new user - * @param organization organization that the user has joined - * - * @category Component - */ -export const RegistrationComplete: React.FC< - React.PropsWithChildren> -> = (props) => { - const { firstName, lastName, email, organization } = props; - const { t } = useLanguageLocale(); - - return ( - } - title={`${t('blui:MESSAGES.WELCOME')}, ${firstName} ${lastName}!`} - description={ - - - Your account has successfully been created with the email {email} belonging to the - {` ${organization}`} org. - - - } - /> - ); -}; diff --git a/login-workflow/src/screens/subScreens/VerifyEmail.tsx b/login-workflow/src/screens/subScreens/VerifyEmail.tsx deleted file mode 100644 index ca2591fd..00000000 --- a/login-workflow/src/screens/subScreens/VerifyEmail.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import React, { useEffect } from 'react'; -import { useLanguageLocale } from '@brightlayer-ui/react-auth-shared'; -import Button from '@mui/material/Button'; -import Typography from '@mui/material/Typography'; -import TextField from '@mui/material/TextField'; -import Divider from '@mui/material/Divider'; -import { useTheme } from '@mui/material/styles'; -import { FullDividerStyles } from '../../styles'; - -export type VerifyEmailProps = { - initialCode?: string; - onVerifyCodeChanged: (code: string) => void; - onResendVerificationEmail: () => void; - onSubmit?: () => void; -}; - -/** - * Component that renders a screen that prompts a user to enter the confirmation code - * that was sent to the email address that they used to register. - * - * @param initialCode code used to pre-populate the field - * @param onVerifyCodeChanged function to call when the code input value changes - * @param onResendVerificationEmail function to call when the user clicks the 'resend code' button - * @param onSubmit function to call when the user submits the mini form - * - * @category Component - */ -export const VerifyEmail: React.FC>> = (props) => { - const { initialCode, onVerifyCodeChanged, onResendVerificationEmail, onSubmit } = props; - const theme = useTheme(); - const { t } = useLanguageLocale(); - - const [verifyCode, setVerifyCode] = React.useState(initialCode ?? ''); - - useEffect(() => { - setVerifyCode(initialCode ?? ''); - }, [initialCode]); - - useEffect(() => { - onVerifyCodeChanged(verifyCode); - }, [verifyCode, onVerifyCodeChanged]); - - return ( - <> - {t('blui:SELF_REGISTRATION.VERIFY_EMAIL.MESSAGE')} - - { - setVerifyCode(evt.target.value); - }} - onKeyPress={(e): void => { - if (e.key === 'Enter' && onSubmit) onSubmit(); - }} - variant="filled" - /> - - - ); -}; diff --git a/login-workflow/src/styles/index.tsx b/login-workflow/src/styles/index.tsx index 9bb38091..aa2a98f0 100644 --- a/login-workflow/src/styles/index.tsx +++ b/login-workflow/src/styles/index.tsx @@ -1,55 +1,12 @@ -import { SxProps, Theme } from '@mui/material/styles'; - -export const DialogTitleStyles = (theme: Theme): SxProps => ({ - p: `${theme.spacing(4)} ${theme.spacing(3)} 0 ${theme.spacing(3)}`, - [theme.breakpoints.down('sm')]: { - p: `${theme.spacing(2)} ${theme.spacing(2)} 0 ${theme.spacing(2)}`, +export const LinkStyles = { + fontWeight: 600, + textTransform: 'none', + textDecoration: 'none', + color: 'primary.main', + '&:visited': { + color: 'inherit', }, -}); - -export const DialogContentStyles = (theme: Theme): SxProps => ({ - flex: '1 1 0px', - overflow: 'auto', - display: 'flex', - flexDirection: 'column', - p: `${theme.spacing(2)} ${theme.spacing(3)}`, - [theme.breakpoints.down('sm')]: { - p: `${theme.spacing(2)} ${theme.spacing(2)} ${theme.spacing(3)} ${theme.spacing(2)}`, + '&:hover': { + cursor: 'pointer', }, -}); - -export const DialogActionsStyles = (theme: Theme): SxProps => ({ - p: 3, - justifyContent: 'flex-end', - [theme.breakpoints.down('sm')]: { - p: 2, - }, -}); - -export const DialogButtonStyles = (fullWidth = false): SxProps => ({ - width: fullWidth ? '100%' : 100, -}); - -export const FullDividerStyles = (theme: Theme): SxProps => ({ - m: `${theme.spacing(5)} -${theme.spacing(3)} ${theme.spacing(4)}`, - [theme.breakpoints.down('sm')]: { - m: `${theme.spacing(5)} -${theme.spacing(2)} ${theme.spacing(4)}`, - }, -}); - -export const StepperStyles = { - background: 'transparent', - width: '100%', - p: 0, }; - -export const StepperDotStyles = (theme: Theme): any => ({ - m: `0px ${theme.spacing(0.5)}`, -}); - -export const TextFieldStyles = (theme: Theme): SxProps => ({ - mt: 4, - [theme.breakpoints.down('sm')]: { - mt: 3, - }, -}); diff --git a/login-workflow/src/testUtils/index.ts b/login-workflow/src/testUtils/index.ts new file mode 100644 index 00000000..1a8fe662 --- /dev/null +++ b/login-workflow/src/testUtils/index.ts @@ -0,0 +1,57 @@ +import { + AuthContextProviderProps, + RegistrationContextProviderProps, + RegistrationWorkflowContextProps, +} from '../contexts'; +import { i18nAuthInstance } from '../contexts/AuthContext/i18nAuthInstance'; +import { i18nRegistrationInstance } from '../contexts/RegistrationContext/i18nRegistrationInstance'; + +export const authContextProviderProps: AuthContextProviderProps = { + language: 'en', + i18n: i18nAuthInstance, + navigate: (): void => {}, + routeConfig: {}, + actions: { + initiateSecurity: jest.fn(), + logIn: jest.fn(), + forgotPassword: jest.fn(), + verifyResetCode: jest.fn(), + setPassword: jest.fn(), + changePassword: jest.fn(), + }, +}; + +export const registrationContextProviderProps: RegistrationContextProviderProps = { + language: 'en', + i18n: i18nRegistrationInstance, + navigate: (): void => {}, + routeConfig: {}, + actions: { + loadEula: jest.fn(), + acceptEula: jest.fn(), + requestRegistrationCode: jest.fn(), + validateUserRegistrationRequest: jest.fn(), + createPassword: jest.fn(), + setAccountDetails: jest.fn(), + completeRegistration: jest.fn().mockImplementation(() => Promise.resolve()), + }, +}; + +export const registrationWorkflowContextProps: RegistrationWorkflowContextProps = { + currentScreen: 0, + totalScreens: 2, + previousScreen: () => {}, + screenData: { + Eula: { accepted: true }, + CreateAccount: { emailAddress: 'emailAddress@emailAddress.emailAddress' }, + VerifyCode: { code: '12345' }, + CreatePassword: { password: 'password', confirmPassword: 'confirmPassword' }, + AccountDetails: { firstName: 'firstName', lastName: 'lastName' }, + }, + nextScreen: function (): Promise { + throw new Error('Function not implemented.'); + }, + updateScreenData: function (): void { + throw new Error('Function not implemented.'); + }, +}; diff --git a/login-workflow/src/translations/i18n.ts b/login-workflow/src/translations/i18n.ts deleted file mode 100644 index 9fbc5f70..00000000 --- a/login-workflow/src/translations/i18n.ts +++ /dev/null @@ -1,48 +0,0 @@ -import i18n from 'i18next'; -import { initReactI18next } from 'react-i18next'; -import LanguageDetector from 'i18next-browser-languagedetector'; -import { translations } from '@brightlayer-ui/react-auth-shared'; - -void i18n - .use(initReactI18next) // passes i18n down to react-i18next - .use(LanguageDetector) // allows us to infer the language from browser language selection - .init({ - load: 'languageOnly', - detection: { - order: ['querystring', 'localStorage', 'navigator'], - caches: ['localStorage'], - lookupLocalStorage: 'blui-auth-i18nextLng', - }, - whitelist: ['en', 'fr', 'es', 'zh', 'pt'], - ns: ['app', 'blui'], - defaultNS: 'app', - fallbackNS: 'blui', - resources: { - en: { - blui: translations.english.translation, - app: {}, - }, - fr: { - blui: translations.french.translation, - app: {}, - }, - es: { - blui: translations.spanish.translation, - app: {}, - }, - zh: { - blui: translations.chinese.translation, - app: {}, - }, - pt: { - blui: translations.portuguese.translation, - app: {}, - }, - }, - fallbackLng: 'en', - interpolation: { - escapeValue: false, - }, - }); - -export default i18n; diff --git a/login-workflow/src/types/index.ts b/login-workflow/src/types/index.ts index ec5462d5..053c6822 100644 --- a/login-workflow/src/types/index.ts +++ b/login-workflow/src/types/index.ts @@ -1,16 +1,12 @@ -export type RegistrationPage = { - name: string; - pageTitle: string; - pageBody: JSX.Element; - canGoForward: boolean; - canGoBack: boolean; -}; +import { TextFieldProps } from '@mui/material/TextField'; + +export type MinifiedTextFieldProps = Omit; -export type CustomRegistrationDetailsGroup = { - [key: number]: { - values: { - [key: string]: string | number | boolean; - }; - valid: boolean; - }; +export type RouteConfig = { + LOGIN?: string; + FORGOT_PASSWORD?: string; + RESET_PASSWORD?: string; + REGISTER_INVITE?: string; + REGISTER_SELF?: string; + SUPPORT?: string; }; diff --git a/login-workflow/src/utils/constants.ts b/login-workflow/src/utils/constants.ts new file mode 100644 index 00000000..b3288057 --- /dev/null +++ b/login-workflow/src/utils/constants.ts @@ -0,0 +1 @@ +export const HELPER_TEXT_HEIGHT = 22.4; diff --git a/login-workflow/src/utils/i18nUtils.ts b/login-workflow/src/utils/i18nUtils.ts new file mode 100644 index 00000000..1fb7d8bb --- /dev/null +++ b/login-workflow/src/utils/i18nUtils.ts @@ -0,0 +1,31 @@ +import i18n from 'i18next'; +import { fr, enUS, es, zhCN, ptBR } from 'date-fns/locale'; + +// for getting the device's language locale +// 'en' is default deviceLocale + +const getDateLocale = (): Locale => { + switch (i18n.language) { + case 'fr': + case 'fr_US': + case 'fr_FR': + case 'fr_CA': + return fr; + case 'es': + case 'es_US': + case 'es_MX': + case 'es_ES': + return es; + case 'zh': + case 'zh_CN': + case 'zh_TW': + return zhCN; + case 'pt': + case 'pt_BR': + return ptBR; + default: + return enUS; + } +}; + +export const dateLocale = getDateLocale(); diff --git a/login-workflow/src/utils/index.ts b/login-workflow/src/utils/index.ts new file mode 100644 index 00000000..88e11cb0 --- /dev/null +++ b/login-workflow/src/utils/index.ts @@ -0,0 +1,2 @@ +export * from './i18nUtils'; +export * from './parseQueryString'; diff --git a/login-workflow/src/utils/parseQueryString.tsx b/login-workflow/src/utils/parseQueryString.tsx new file mode 100644 index 00000000..3b201196 --- /dev/null +++ b/login-workflow/src/utils/parseQueryString.tsx @@ -0,0 +1,19 @@ +type SearchParams = { + [key: string]: string; +}; + +export const parseQueryString = (search: string): SearchParams => { + let searchQuery = search; + if (searchQuery.startsWith('?')) searchQuery = searchQuery.substr(1); + + const params = searchQuery.split('&'); + const ret: SearchParams = {}; + + params.forEach((param) => { + const keyVal = param.split('=', 2); + if (keyVal.length > 1) { + ret[keyVal[0]] = decodeURI(keyVal[1]); + } + }); + return ret; +}; diff --git a/login-workflow/tsconfig.json b/login-workflow/tsconfig.json index 29d737b6..350bca30 100644 --- a/login-workflow/tsconfig.json +++ b/login-workflow/tsconfig.json @@ -10,7 +10,7 @@ "jsx": "react", "strict": true, "allowSyntheticDefaultImports": true, - "strictNullChecks": false + "strictNullChecks": true }, "include": ["src", "images.d.ts"] } diff --git a/login-workflow/tsconfig.lib.json b/login-workflow/tsconfig.lib.json index 2a28c0cc..d33c828e 100644 --- a/login-workflow/tsconfig.lib.json +++ b/login-workflow/tsconfig.lib.json @@ -5,5 +5,5 @@ "types": ["node"], "declaration": true }, - "exclude": ["src/**/*.test.tsx"] + "exclude": ["src/**/*.test.tsx", "src/testUtils/*"] } diff --git a/login-workflow/yarn.lock b/login-workflow/yarn.lock index f545460c..1b39533a 100644 --- a/login-workflow/yarn.lock +++ b/login-workflow/yarn.lock @@ -2,430 +2,301 @@ # yarn lockfile v1 +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + "@adobe/css-tools@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.0.1.tgz#b38b444ad3aa5fedbb15f2f746dcd934226a12dd" - integrity sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g== + version "4.3.1" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.1.tgz#abfccb8ca78075a2b6187345c26243c1a0842f28" + integrity sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg== -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== dependencies: - "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" "@apidevtools/json-schema-ref-parser@^9.0.3": - version "9.0.9" - resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz#d720f9256e3609621280584f2b47ae165359268b" - integrity sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w== + version "9.1.2" + resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.2.tgz#8ff5386b365d4c9faa7c8b566ff16a46a577d9b8" + integrity sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg== dependencies: "@jsdevtools/ono" "^7.1.3" "@types/json-schema" "^7.0.6" call-me-maybe "^1.0.1" js-yaml "^4.1.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== dependencies: - "@babel/highlight" "^7.18.6" + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.0", "@babel/compat-data@^7.20.1": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.1.tgz#f2e6ef7790d8c8dbf03d379502dcc246dcce0b30" - integrity sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ== +"@babel/compat-data@^7.22.20", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.20.tgz#8df6e96661209623f1975d66c35ffca66f3306d0" + integrity sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw== "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.14.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.5.tgz#45e2114dc6cd4ab167f81daf7820e8fa1250d113" - integrity sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-module-transforms" "^7.20.2" - "@babel/helpers" "^7.20.5" - "@babel/parser" "^7.20.5" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.20.tgz#e3d0eed84c049e2a2ae0a64d27b6a37edec385b7" + integrity sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.22.15" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.22.20" + "@babel/helpers" "^7.22.15" + "@babel/parser" "^7.22.16" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.22.20" + "@babel/types" "^7.22.19" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" + json5 "^2.2.3" + semver "^6.3.1" -"@babel/generator@^7.20.5", "@babel/generator@^7.7.2": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.5.tgz#cb25abee3178adf58d6814b68517c62bdbfdda95" - integrity sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA== +"@babel/generator@^7.22.15", "@babel/generator@^7.7.2": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.15.tgz#1564189c7ec94cb8f77b5e8a90c4d200d21b2339" + integrity sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA== dependencies: - "@babel/types" "^7.20.5" + "@babel/types" "^7.22.15" "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== dependencies: - "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/types" "^7.22.5" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" - integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== dependencies: - "@babel/compat-data" "^7.20.0" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - semver "^6.3.0" + "@babel/types" "^7.22.15" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz#3c08a5b5417c7f07b5cf3dfb6dc79cbec682e8c2" - integrity sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-member-expression-to-functions" "^7.18.9" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.19.1" - "@babel/helper-split-export-declaration" "^7.18.6" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz#7976aca61c0984202baca73d84e2337a5424a41b" - integrity sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.1.0" - -"@babel/helper-define-polyfill-provider@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" - integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== +"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" + integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.15" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" + integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" + integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" - semver "^6.1.2" -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== +"@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== dependencies: - "@babel/types" "^7.18.6" + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" + "@babel/types" "^7.22.5" -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-member-expression-to-functions@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" - integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== - dependencies: - "@babel/types" "^7.18.9" - -"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" - integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.1" - "@babel/types" "^7.20.2" - -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== - -"@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz#e1592a9b4b368aa6bdb8784a711e0bcbf0612b78" - integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.18.9" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/traverse" "^7.19.1" - "@babel/types" "^7.19.0" - -"@babel/helper-simple-access@^7.19.4", "@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== +"@babel/helper-member-expression-to-functions@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz#b95a144896f6d491ca7863576f820f3628818621" + integrity sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA== dependencies: - "@babel/types" "^7.20.2" + "@babel/types" "^7.22.15" + +"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" -"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== +"@babel/helper-module-transforms@^7.22.15", "@babel/helper-module-transforms@^7.22.20", "@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz#da9edc14794babbe7386df438f3768067132f59e" + integrity sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" + +"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.19", "@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.22.5": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-option@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== + +"@babel/helper-wrap-function@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.19" + +"@babel/helpers@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.15.tgz#f09c3df31e86e3ea0b7ff7556d85cdebd47ea6f1" + integrity sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw== dependencies: - "@babel/types" "^7.20.0" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== - -"@babel/helper-wrap-function@^7.18.9": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz#89f18335cff1152373222f76a4b37799636ae8b1" - integrity sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg== - dependencies: - "@babel/helper-function-name" "^7.19.0" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" - -"@babel/helpers@^7.20.5": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.6.tgz#e64778046b70e04779dfbdf924e7ebb45992c763" - integrity sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w== - dependencies: - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.20.5", "@babel/parser@^7.9.4": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8" - integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50" - integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" - -"@babel/plugin-proposal-async-generator-functions@^7.20.1": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz#352f02baa5d69f4e7529bdac39aaa02d41146af9" - integrity sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020" - integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" - integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.15", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.22.16": + version "7.22.16" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.16.tgz#180aead7f247305cce6551bea2720934e2fa2c95" + integrity sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA== -"@babel/plugin-proposal-export-namespace-from@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" - integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962" + integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-proposal-json-strings@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" - integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f" + integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.15" -"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23" - integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" - integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz#a556f59d555f06961df1e572bb5eca864c84022d" - integrity sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ== - dependencies: - "@babel/compat-data" "^7.20.1" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.1" - -"@babel/plugin-proposal-optional-catch-binding@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" - integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993" - integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" - integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz#a64137b232f0aca3733a67eb1a144c192389c503" - integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" - integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -469,14 +340,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== +"@babel/plugin-syntax-import-assertions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" + integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" + integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -490,12 +368,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.17.12", "@babel/plugin-syntax-jsx@^7.18.6", "@babel/plugin-syntax-jsx@^7.7.2": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" - integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== +"@babel/plugin-syntax-jsx@^7.22.5", "@babel/plugin-syntax-jsx@^7.7.2": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" @@ -553,349 +431,484 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.20.0", "@babel/plugin-syntax-typescript@^7.7.2": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" - integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== +"@babel/plugin-syntax-typescript@^7.22.5", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" + integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-arrow-functions@^7.18.6": +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe" - integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-async-to-generator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615" - integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== +"@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" + integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-remap-async-to-generator" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== +"@babel/plugin-transform-async-generator-functions@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz#3b153af4a6b779f340d5b80d3f634f55820aefa3" + integrity sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-block-scoping@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz#f59b1767e6385c663fd0bce655db6ca9c8b236ed" - integrity sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ== +"@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" -"@babel/plugin-transform-classes@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz#c0033cf1916ccf78202d04be4281d161f6709bb2" - integrity sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.19.1" - "@babel/helper-split-export-declaration" "^7.18.6" +"@babel/plugin-transform-block-scoped-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" + integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.15.tgz#494eb82b87b5f8b1d8f6f28ea74078ec0a10a841" + integrity sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" + integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974" + integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b" + integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e" - integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== +"@babel/plugin-transform-computed-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" + integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" -"@babel/plugin-transform-destructuring@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz#c23741cfa44ddd35f5e53896e88c75331b8b2792" - integrity sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw== +"@babel/plugin-transform-destructuring@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz#e7404ea5bb3387073b9754be654eecb578324694" + integrity sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== +"@babel/plugin-transform-dotall-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" + integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== +"@babel/plugin-transform-duplicate-keys@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" + integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== +"@babel/plugin-transform-dynamic-import@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa" + integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-for-of@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" - integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" + integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== +"@babel/plugin-transform-export-namespace-from@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c" + integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== +"@babel/plugin-transform-for-of@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29" + integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== +"@babel/plugin-transform-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" + integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-amd@^7.19.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz#aca391801ae55d19c4d8d2ebfeaa33df5f2a2cbd" - integrity sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg== +"@babel/plugin-transform-json-strings@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835" + integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== dependencies: - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-modules-commonjs@^7.19.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz#25b32feef24df8038fc1ec56038917eacb0b730c" - integrity sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ== +"@babel/plugin-transform-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" + integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== dependencies: - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-simple-access" "^7.19.4" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.19.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz#59e2a84064b5736a4471b1aa7b13d4431d327e0d" - integrity sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ== +"@babel/plugin-transform-logical-assignment-operators@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c" + integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== +"@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" + integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz#ec7455bab6cd8fb05c525a94876f435a48128888" - integrity sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw== +"@babel/plugin-transform-modules-amd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz#4e045f55dcf98afd00f85691a68fc0780704f526" + integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.19.0" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-new-target@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" - integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== +"@babel/plugin-transform-modules-commonjs@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.15.tgz#b11810117ed4ee7691b29bd29fd9f3f98276034f" + integrity sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-module-transforms" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== +"@babel/plugin-transform-modules-systemjs@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz#3386be5875d316493b517207e8f1931d93154bb1" + integrity sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" -"@babel/plugin-transform-parameters@^7.20.1": - version "7.20.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz#7b3468d70c3c5b62e46be0a47b6045d8590fb748" - integrity sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA== +"@babel/plugin-transform-modules-umd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" + integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-display-name@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" - integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== +"@babel/plugin-transform-new-target@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" + integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-jsx-development@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" - integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc" + integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== dependencies: - "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-react-jsx@^7.18.6": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz#b3cbb7c3a00b92ec8ae1027910e331ba5c500eb9" - integrity sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg== +"@babel/plugin-transform-numeric-separator@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd" + integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.19.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-react-pure-annotations@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" - integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== +"@babel/plugin-transform-object-rest-spread@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f" + integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.15" -"@babel/plugin-transform-regenerator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz#585c66cb84d4b4bf72519a34cfce761b8676ca73" - integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ== +"@babel/plugin-transform-object-super@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" + integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - regenerator-transform "^0.15.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" -"@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== +"@babel/plugin-transform-optional-catch-binding@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0" + integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz#d7a5996c2f7ca4ad2ad16dbb74444e5c4385b1ba" + integrity sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114" + integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" + integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1" + integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" + integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-display-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" + integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-jsx-development@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" + integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.22.5" + +"@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz#7e6266d88705d7c49f11c98db8b9464531289cd6" + integrity sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/types" "^7.22.15" + +"@babel/plugin-transform-react-pure-annotations@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz#1f58363eef6626d6fa517b95ac66fe94685e32c0" + integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" + integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" + integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-runtime@^7.17.0": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz#9d2a9dbf4e12644d6f46e5e75bfbf02b5d6e9194" - integrity sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.19.0" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - semver "^6.3.0" + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz#3a625c4c05a39e932d7d34f5d4895cdd0172fdc9" + integrity sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g== + dependencies: + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" + semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== +"@babel/plugin-transform-shorthand-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" + integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-spread@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz#dd60b4620c2fec806d60cfaae364ec2188d593b6" - integrity sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w== +"@babel/plugin-transform-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" + integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== +"@babel/plugin-transform-sticky-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" + integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== +"@babel/plugin-transform-template-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" + integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== +"@babel/plugin-transform-typeof-symbol@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" + integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typescript@^7.18.6": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz#91515527b376fc122ba83b13d70b01af8fe98f3f" - integrity sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag== +"@babel/plugin-transform-typescript@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz#15adef906451d86349eb4b8764865c960eb54127" + integrity sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.2" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-typescript" "^7.20.0" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.22.5" -"@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== +"@babel/plugin-transform-unicode-escapes@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9" + integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" + integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" + integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" + integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/preset-env@^7.14.5": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" - integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== - dependencies: - "@babel/compat-data" "^7.20.1" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.20.1" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.18.6" - "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.2" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.18.6" - "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.20.tgz#de9e9b57e1127ce0a2f580831717f7fb677ceedb" + integrity sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg== + dependencies: + "@babel/compat-data" "^7.22.20" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.15" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.15" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-import-assertions" "^7.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -905,117 +918,139 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.18.6" - "@babel/plugin-transform-async-to-generator" "^7.18.6" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.20.2" - "@babel/plugin-transform-classes" "^7.20.2" - "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.20.2" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.18.8" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.19.6" - "@babel/plugin-transform-modules-commonjs" "^7.19.6" - "@babel/plugin-transform-modules-systemjs" "^7.19.6" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" - "@babel/plugin-transform-new-target" "^7.18.6" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.20.1" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.18.6" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.19.0" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.10" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.20.2" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - core-js-compat "^3.25.1" - semver "^6.3.0" - -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.15" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.15" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.11" + "@babel/plugin-transform-classes" "^7.22.15" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.15" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.11" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.11" + "@babel/plugin-transform-for-of" "^7.22.15" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.11" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.11" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.15" + "@babel/plugin-transform-modules-systemjs" "^7.22.11" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.11" + "@babel/plugin-transform-numeric-separator" "^7.22.11" + "@babel/plugin-transform-object-rest-spread" "^7.22.15" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.11" + "@babel/plugin-transform-optional-chaining" "^7.22.15" + "@babel/plugin-transform-parameters" "^7.22.15" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.11" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.10" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.10" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/preset-modules" "0.1.6-no-external-plugins" + "@babel/types" "^7.22.19" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" + core-js-compat "^3.31.0" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" "@babel/types" "^7.4.4" esutils "^2.0.2" "@babel/preset-react@^7.14.5": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" - integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.15.tgz#9a776892b648e13cc8ca2edf5ed1264eea6b6afc" + integrity sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-react-display-name" "^7.18.6" - "@babel/plugin-transform-react-jsx" "^7.18.6" - "@babel/plugin-transform-react-jsx-development" "^7.18.6" - "@babel/plugin-transform-react-pure-annotations" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-transform-react-display-name" "^7.22.5" + "@babel/plugin-transform-react-jsx" "^7.22.15" + "@babel/plugin-transform-react-jsx-development" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.22.5" "@babel/preset-typescript@^7.14.5": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" - integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.22.15.tgz#43db30516fae1d417d748105a0bc95f637239d48" + integrity sha512-HblhNmh6yM+cU4VwbBRpxFhxsTdfS1zsvH9W+gEjD0ARV9+8B4sNfpI6GuhePti84nuvhiwKS539jKPFHskA9A== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-typescript" "^7.18.6" - -"@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.19.0", "@babel/runtime@^7.20.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.1.tgz#1148bb33ab252b165a06698fde7576092a78b4a9" - integrity sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg== - dependencies: - regenerator-runtime "^0.13.10" - -"@babel/template@^7.18.10", "@babel/template@^7.3.3": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" - integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.10" - "@babel/types" "^7.18.10" - -"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5", "@babel/traverse@^7.7.2": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.5.tgz#78eb244bea8270fdda1ef9af22a5d5e5b7e57133" - integrity sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.5" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.5" - "@babel/types" "^7.20.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.15" + "@babel/plugin-transform-typescript" "^7.22.15" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.19.0", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.15", "@babel/runtime@^7.22.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.15.tgz#38f46494ccf6cf020bd4eed7124b425e83e523b8" + integrity sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.3.3": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.22.15", "@babel/traverse@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.20.tgz#db572d9cb5c79e02d83e5618b82f6991c07584c9" + integrity sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.16" + "@babel/types" "^7.22.19" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.5.tgz#e206ae370b5393d94dfd1d04cd687cace53efa84" - integrity sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.22.19" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.19.tgz#7425343253556916e440e662bb221a93ddb75684" + integrity sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg== dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.19" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1045,15 +1080,10 @@ resolved "https://registry.yarnpkg.com/@brightlayer-ui/prettier-config/-/prettier-config-1.0.3.tgz#e40a7ae7435c6fd5118acbf249080e0aa81e93af" integrity sha512-EYm3+V7Qd+oYEF+8FadsXAZqXryEHHbGnrV1BMp9selhABjceqUqXPVE4Sn3SKWQdBNJ3En2A3EzgrzRbvRTaw== -"@brightlayer-ui/react-auth-shared@^3.7.4": - version "3.7.4" - resolved "https://registry.yarnpkg.com/@brightlayer-ui/react-auth-shared/-/react-auth-shared-3.7.4.tgz#f0d0b931867bf90e42994c2dfff313b7a8a2b996" - integrity sha512-ef9i4PHfvkjbvSkKDrUIBSWbrsRVpHSPesxkRfd+rEimIpXdW+dLRVT6j3x4Ht1QRGvJa9m6IsNuvA4zzNE9JQ== - "@brightlayer-ui/react-components@^6.1.2-alpha.0": - version "6.1.2-alpha.0" - resolved "https://registry.yarnpkg.com/@brightlayer-ui/react-components/-/react-components-6.1.2-alpha.0.tgz#6fe48c2d300e1618f3ef8fdb409504a8c5637082" - integrity sha512-Rpv5Zx8OlzKSjDNEvXL7uhjeLBuaLWMTKT2rqzrL7wY3Y14Vc8NkVfIQ0EWqGMLg5wVpH8fL9KDhQSl62C4fwg== + version "6.3.0" + resolved "https://registry.yarnpkg.com/@brightlayer-ui/react-components/-/react-components-6.3.0.tgz#59d03ac9f0dbbb9b56f3e639068d6463c8c70738" + integrity sha512-EQc2PfQ/jxMUzppA4Wykxp1jfN6VCvJveAGvGluCbuXf6tPrFeeAGsUfunA/IcqUnD9whidPw+E7iGaI1+dhTQ== dependencies: "@brightlayer-ui/colors" "^3.1.1" "@emotion/css" "^11.10.5" @@ -1061,9 +1091,9 @@ color "^4.2.3" "@brightlayer-ui/react-themes@^7.1.0-alpha.0": - version "7.1.0-alpha.0" - resolved "https://registry.yarnpkg.com/@brightlayer-ui/react-themes/-/react-themes-7.1.0-alpha.0.tgz#745079123cd321eaad689fe92b53c6fd2a7d0c4a" - integrity sha512-j9RS3puo4AttidbTPtLtGxpszr1TrVq3M+iNh2gT4Lk5LGyMwE0+jcSVZrlTqZZ8rIqZUG6vGg0ElD0CsGfI4w== + version "7.1.0" + resolved "https://registry.yarnpkg.com/@brightlayer-ui/react-themes/-/react-themes-7.1.0.tgz#09519522ab192cdb16c47c2d15ccd238d0fc8c5e" + integrity sha512-zAESyIZJmGAcRDHwX2nB26gsloQ53Kx9FGb4I4bPdDf3Ragbaio/Is03/3CRCim5qCVwjcDqq/iy4iDqg1Q9BQ== dependencies: "@brightlayer-ui/colors" "^3.0.0" "@fontsource/open-sans" "^4.2.2" @@ -1088,159 +1118,192 @@ enabled "2.0.x" kuler "^2.0.0" -"@emotion/babel-plugin@^11.10.5": - version "11.10.5" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.5.tgz#65fa6e1790ddc9e23cc22658a4c5dea423c55c3c" - integrity sha512-xE7/hyLHJac7D2Ve9dKroBBZqBT7WuPQmWcq7HSGb84sUuP4mlOWoB8dvVfD9yk5DHkU1m6RW7xSoDtnQHNQeA== +"@emotion/babel-plugin@^11.11.0": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c" + integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== dependencies: "@babel/helper-module-imports" "^7.16.7" - "@babel/plugin-syntax-jsx" "^7.17.12" "@babel/runtime" "^7.18.3" - "@emotion/hash" "^0.9.0" - "@emotion/memoize" "^0.8.0" - "@emotion/serialize" "^1.1.1" + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/serialize" "^1.1.2" babel-plugin-macros "^3.1.0" convert-source-map "^1.5.0" escape-string-regexp "^4.0.0" find-root "^1.1.0" source-map "^0.5.7" - stylis "4.1.3" + stylis "4.2.0" -"@emotion/cache@^11.10.5": - version "11.10.5" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.5.tgz#c142da9351f94e47527ed458f7bbbbe40bb13c12" - integrity sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA== +"@emotion/cache@^11.11.0": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff" + integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== dependencies: - "@emotion/memoize" "^0.8.0" - "@emotion/sheet" "^1.2.1" - "@emotion/utils" "^1.2.0" - "@emotion/weak-memoize" "^0.3.0" - stylis "4.1.3" + "@emotion/memoize" "^0.8.1" + "@emotion/sheet" "^1.2.2" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + stylis "4.2.0" "@emotion/css@^11.10.5", "@emotion/css@^11.9.0": - version "11.10.5" - resolved "https://registry.yarnpkg.com/@emotion/css/-/css-11.10.5.tgz#ca01bb83ce60517bc3a5c01d27ccf552fed84d9d" - integrity sha512-maJy0wG82hWsiwfJpc3WrYsyVwUbdu+sdIseKUB+/OLjB8zgc3tqkT6eO0Yt0AhIkJwGGnmMY/xmQwEAgQ4JHA== + version "11.11.2" + resolved "https://registry.yarnpkg.com/@emotion/css/-/css-11.11.2.tgz#e5fa081d0c6e335352e1bc2b05953b61832dca5a" + integrity sha512-VJxe1ucoMYMS7DkiMdC2T7PWNbrEI0a39YRiyDvK2qq4lXwjRbVP/z4lpG+odCsRzadlR+1ywwrTzhdm5HNdew== dependencies: - "@emotion/babel-plugin" "^11.10.5" - "@emotion/cache" "^11.10.5" - "@emotion/serialize" "^1.1.1" - "@emotion/sheet" "^1.2.1" - "@emotion/utils" "^1.2.0" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/cache" "^11.11.0" + "@emotion/serialize" "^1.1.2" + "@emotion/sheet" "^1.2.2" + "@emotion/utils" "^1.2.1" -"@emotion/hash@^0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7" - integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== +"@emotion/hash@^0.9.1": + version "0.9.1" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43" + integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== -"@emotion/is-prop-valid@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz#7f2d35c97891669f7e276eb71c83376a5dc44c83" - integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== +"@emotion/is-prop-valid@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" + integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== dependencies: - "@emotion/memoize" "^0.8.0" + "@emotion/memoize" "^0.8.1" -"@emotion/memoize@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" - integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== +"@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== "@emotion/react@^11.7.1": - version "11.10.5" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.5.tgz#95fff612a5de1efa9c0d535384d3cfa115fe175d" - integrity sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A== + version "11.11.1" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.1.tgz#b2c36afac95b184f73b08da8c214fdf861fa4157" + integrity sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA== dependencies: "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.10.5" - "@emotion/cache" "^11.10.5" - "@emotion/serialize" "^1.1.1" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" - "@emotion/utils" "^1.2.0" - "@emotion/weak-memoize" "^0.3.0" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/cache" "^11.11.0" + "@emotion/serialize" "^1.1.2" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" hoist-non-react-statics "^3.3.1" -"@emotion/serialize@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.1.tgz#0595701b1902feded8a96d293b26be3f5c1a5cf0" - integrity sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA== +"@emotion/serialize@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.2.tgz#017a6e4c9b8a803bd576ff3d52a0ea6fa5a62b51" + integrity sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA== dependencies: - "@emotion/hash" "^0.9.0" - "@emotion/memoize" "^0.8.0" - "@emotion/unitless" "^0.8.0" - "@emotion/utils" "^1.2.0" + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/unitless" "^0.8.1" + "@emotion/utils" "^1.2.1" csstype "^3.0.2" -"@emotion/sheet@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.1.tgz#0767e0305230e894897cadb6c8df2c51e61a6c2c" - integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA== +"@emotion/sheet@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec" + integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== "@emotion/styled@^11.6.0": - version "11.10.5" - resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.10.5.tgz#1fe7bf941b0909802cb826457e362444e7e96a79" - integrity sha512-8EP6dD7dMkdku2foLoruPCNkRevzdcBaY6q0l0OsbyJK+x8D9HWjX27ARiSIKNF634hY9Zdoedh8bJCiva8yZw== + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.11.0.tgz#26b75e1b5a1b7a629d7c0a8b708fbf5a9cdce346" + integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng== dependencies: "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.10.5" - "@emotion/is-prop-valid" "^1.2.0" - "@emotion/serialize" "^1.1.1" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" - "@emotion/utils" "^1.2.0" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/is-prop-valid" "^1.2.1" + "@emotion/serialize" "^1.1.2" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" -"@emotion/unitless@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" - integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== +"@emotion/unitless@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" + integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== -"@emotion/use-insertion-effect-with-fallbacks@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz#ffadaec35dbb7885bd54de3fa267ab2f860294df" - integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A== +"@emotion/use-insertion-effect-with-fallbacks@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963" + integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== -"@emotion/utils@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.0.tgz#9716eaccbc6b5ded2ea5a90d65562609aab0f561" - integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw== +"@emotion/utils@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4" + integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== -"@emotion/weak-memoize@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb" - integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== +"@emotion/weak-memoize@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6" + integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" -"@esbuild/android-arm@0.15.15": - version "0.15.15" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.15.tgz#35b3cc0f9e69cb53932d44f60b99dd440335d2f0" - integrity sha512-JJjZjJi2eBL01QJuWjfCdZxcIgot+VoK6Fq7eKF9w4YHm9hwl7nhBR1o2Wnt/WcANk5l9SkpvrldW1PLuXxcbw== +"@eslint-community/regexpp@^4.5.1": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.9.0.tgz#7ccb5f58703fa61ffdcbf39e2c604a109e781162" + integrity sha512-zJmuCWj2VLBt4c25CfBIbMZLGLyhkvs7LznyVX5HfpzeocThgIj5XQK4L+g3U36mMcx8bPMhGyPpwCATamC4jQ== -"@esbuild/linux-loong64@0.15.15": - version "0.15.15" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.15.tgz#32c65517a09320b62530867345222fde7794fbe1" - integrity sha512-lhz6UNPMDXUhtXSulw8XlFAtSYO26WmHQnCi2Lg2p+/TMiJKNLtZCYUxV4wG6rZMzXmr8InGpNwk+DLT2Hm0PA== +"@eslint-community/regexpp@^4.6.1": + version "4.8.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.1.tgz#8c4bb756cc2aa7eaf13cfa5e69c83afb3260c20c" + integrity sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ== -"@eslint/eslintrc@^1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.3.tgz#2b044ab39fdfa75b4688184f9e573ce3c5b0ff95" - integrity sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg== +"@eslint/eslintrc@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" + integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.4.0" - globals "^13.15.0" + espree "^9.6.0" + globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" js-yaml "^4.1.0" minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@fontsource/open-sans@^4.2.2": - version "4.5.13" - resolved "https://registry.yarnpkg.com/@fontsource/open-sans/-/open-sans-4.5.13.tgz#2c99e4c055d129a75f14c11b77d040282e0388b8" - integrity sha512-/UzqP7ZFk145XAq8KG4pvFPP7UQhtreDGXgqXZjagCDreKxcrhwn/x7DYz9rPcycWkLUVApIybcoczGZiM0cRg== +"@eslint/js@8.50.0": + version "8.50.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.50.0.tgz#9e93b850f0f3fa35f5fa59adfd03adae8488e484" + integrity sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ== -"@gar/promisify@^1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" - integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== +"@floating-ui/core@^1.4.2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.5.0.tgz#5c05c60d5ae2d05101c3021c1a2a350ddc027f8c" + integrity sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg== + dependencies: + "@floating-ui/utils" "^0.1.3" + +"@floating-ui/dom@^1.5.1": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.3.tgz#54e50efcb432c06c23cd33de2b575102005436fa" + integrity sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA== + dependencies: + "@floating-ui/core" "^1.4.2" + "@floating-ui/utils" "^0.1.3" + +"@floating-ui/react-dom@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.2.tgz#fab244d64db08e6bed7be4b5fcce65315ef44d20" + integrity sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ== + dependencies: + "@floating-ui/dom" "^1.5.1" + +"@floating-ui/utils@^0.1.3": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.4.tgz#19654d1026cc410975d46445180e70a5089b3e7d" + integrity sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA== + +"@fontsource/open-sans@^4.2.2": + version "4.5.14" + resolved "https://registry.yarnpkg.com/@fontsource/open-sans/-/open-sans-4.5.14.tgz#b3e1665c0b3fdfc1f030ded2843749e3cf3a5900" + integrity sha512-mBXIIETBlW8q/ocuUN0hyGow2iuf75hQEHQt8R/RJ/HcphVbLg8KB7pHYGbFGDqs75W+SWvTC7JkVeAjT65BuQ== "@google-cloud/paginator@^4.0.0": version "4.0.1" @@ -1266,50 +1329,49 @@ integrity sha512-j8yRSSqswWi1QqUGKVEKOG03Q7qOoZP6/h2zN2YO+F5h2+DHU0bSrHCK9Y7lo2DI9fBd8qGAw795sf+3Jva4yA== "@google-cloud/pubsub@^3.0.1": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@google-cloud/pubsub/-/pubsub-3.2.1.tgz#0f3a77e553ff905cb5f4c22e017334b4db5e1501" - integrity sha512-TcGPqNkCYNwM3LTWBYjdryv1WQX2a4H52gaL9IAMZCp1i28r90syWjZoFhcUObowb3v3StTCL6a9YlPef4LY3g== + version "3.7.5" + resolved "https://registry.yarnpkg.com/@google-cloud/pubsub/-/pubsub-3.7.5.tgz#3fed656b7e7ea3a4618d5590004f08321a1389b9" + integrity sha512-4Qrry4vIToth5mqduVslltWVsyb7DR8OhnkBA3F7XiE0jgQsiuUfwp/RB2F559aXnRbwcfmjvP4jSuEaGcjrCQ== dependencies: "@google-cloud/paginator" "^4.0.0" "@google-cloud/precise-date" "^3.0.0" "@google-cloud/projectify" "^3.0.0" "@google-cloud/promisify" "^2.0.0" - "@opentelemetry/api" "^1.0.0" + "@opentelemetry/api" "^1.6.0" "@opentelemetry/semantic-conventions" "~1.3.0" "@types/duplexify" "^3.6.0" "@types/long" "^4.0.0" arrify "^2.0.0" extend "^3.0.2" google-auth-library "^8.0.2" - google-gax "^3.5.2" + google-gax "^3.6.1" heap-js "^2.2.0" is-stream-ended "^0.1.4" lodash.snakecase "^4.1.1" p-defer "^3.0.0" -"@grpc/grpc-js@~1.7.0": - version "1.7.3" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.7.3.tgz#f2ea79f65e31622d7f86d4b4c9ae38f13ccab99a" - integrity sha512-H9l79u4kJ2PVSxUNA08HMYAnUBLj9v6KjYQ7SQ71hOZcEXhShE/y5iQCesP8+6/Ik/7i2O0a10bPquIcYfufog== +"@grpc/grpc-js@~1.8.0": + version "1.8.21" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.8.21.tgz#d282b122c71227859bf6c5866f4c40f4a2696513" + integrity sha512-KeyQeZpxeEBSqFVTi3q2K7PiPXmgBfECc4updA1ejCLjYmoAlvvM3ZMp5ztTDUCUQmoY3CpDxvchjO1+rFkoHg== dependencies: "@grpc/proto-loader" "^0.7.0" "@types/node" ">=12.12.47" "@grpc/proto-loader@^0.7.0": - version "0.7.3" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.3.tgz#75a6f95b51b85c5078ac7394da93850c32d36bb8" - integrity sha512-5dAvoZwna2Py3Ef96Ux9jIkp3iZ62TUsV00p3wVBPNX5K178UbNi8Q7gQVqwXT1Yq9RejIGG9G2IPEo93T6RcA== + version "0.7.10" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.10.tgz#6bf26742b1b54d0a473067743da5d3189d06d720" + integrity sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ== dependencies: - "@types/long" "^4.0.1" lodash.camelcase "^4.3.0" - long "^4.0.0" - protobufjs "^7.0.0" - yargs "^16.2.0" + long "^5.0.0" + protobufjs "^7.2.4" + yargs "^17.7.2" -"@humanwhocodes/config-array@^0.11.6": - version "0.11.7" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.7.tgz#38aec044c6c828f6ed51d5d7ae3d9b9faf6dbb0f" - integrity sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw== +"@humanwhocodes/config-array@^0.11.11": + version "0.11.11" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" + integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" @@ -1325,6 +1387,18 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -1341,110 +1415,110 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.3.1.tgz#3e3f876e4e47616ea3b1464b9fbda981872e9583" - integrity sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg== +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^29.3.1" - jest-util "^29.3.1" + jest-message-util "^29.7.0" + jest-util "^29.7.0" slash "^3.0.0" -"@jest/core@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.3.1.tgz#bff00f413ff0128f4debec1099ba7dcd649774a1" - integrity sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw== +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== dependencies: - "@jest/console" "^29.3.1" - "@jest/reporters" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^29.2.0" - jest-config "^29.3.1" - jest-haste-map "^29.3.1" - jest-message-util "^29.3.1" - jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-resolve-dependencies "^29.3.1" - jest-runner "^29.3.1" - jest-runtime "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" - jest-watcher "^29.3.1" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" micromatch "^4.0.4" - pretty-format "^29.3.1" + pretty-format "^29.7.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.3.1.tgz#eb039f726d5fcd14698acd072ac6576d41cfcaa6" - integrity sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag== +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== dependencies: - "@jest/fake-timers" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-mock "^29.3.1" + jest-mock "^29.7.0" -"@jest/expect-utils@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.3.1.tgz#531f737039e9b9e27c42449798acb5bba01935b6" - integrity sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g== +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== dependencies: - jest-get-type "^29.2.0" + jest-get-type "^29.6.3" -"@jest/expect@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.3.1.tgz#456385b62894349c1d196f2d183e3716d4c6a6cd" - integrity sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg== +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== dependencies: - expect "^29.3.1" - jest-snapshot "^29.3.1" + expect "^29.7.0" + jest-snapshot "^29.7.0" -"@jest/fake-timers@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.3.1.tgz#b140625095b60a44de820876d4c14da1aa963f67" - integrity sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A== +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== dependencies: - "@jest/types" "^29.3.1" - "@sinonjs/fake-timers" "^9.1.2" + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^29.3.1" - jest-mock "^29.3.1" - jest-util "^29.3.1" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" -"@jest/globals@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.3.1.tgz#92be078228e82d629df40c3656d45328f134a0c6" - integrity sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q== +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== dependencies: - "@jest/environment" "^29.3.1" - "@jest/expect" "^29.3.1" - "@jest/types" "^29.3.1" - jest-mock "^29.3.1" + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" -"@jest/reporters@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.3.1.tgz#9a6d78c109608e677c25ddb34f907b90e07b4310" - integrity sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA== +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" - "@jridgewell/trace-mapping" "^0.3.15" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" @@ -1452,13 +1526,13 @@ glob "^7.1.3" graceful-fs "^4.2.9" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" + istanbul-lib-instrument "^6.0.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^29.3.1" - jest-util "^29.3.1" - jest-worker "^29.3.1" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" @@ -1471,40 +1545,40 @@ dependencies: "@sinclair/typebox" "^0.24.1" -"@jest/schemas@^29.0.0": - version "29.0.0" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a" - integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA== +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: - "@sinclair/typebox" "^0.24.1" + "@sinclair/typebox" "^0.27.8" -"@jest/source-map@^29.2.0": - version "29.2.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.2.0.tgz#ab3420c46d42508dcc3dc1c6deee0b613c235744" - integrity sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ== +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== dependencies: - "@jridgewell/trace-mapping" "^0.3.15" + "@jridgewell/trace-mapping" "^0.3.18" callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.3.1.tgz#92cd5099aa94be947560a24610aa76606de78f50" - integrity sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw== +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== dependencies: - "@jest/console" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz#fa24b3b050f7a59d48f7ef9e0b782ab65123090d" - integrity sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA== +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== dependencies: - "@jest/test-result" "^29.3.1" + "@jest/test-result" "^29.7.0" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" + jest-haste-map "^29.7.0" slash "^3.0.0" "@jest/transform@^28.1.3": @@ -1528,26 +1602,26 @@ slash "^3.0.0" write-file-atomic "^4.0.1" -"@jest/transform@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.3.1.tgz#1e6bd3da4af50b5c82a539b7b1f3770568d6e36d" - integrity sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug== +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== dependencies: "@babel/core" "^7.11.6" - "@jest/types" "^29.3.1" - "@jridgewell/trace-mapping" "^0.3.15" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^2.0.0" fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" - jest-regex-util "^29.2.0" - jest-util "^29.3.1" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" - write-file-atomic "^4.0.1" + write-file-atomic "^4.0.2" "@jest/types@^28.1.3": version "28.1.3" @@ -1561,153 +1635,150 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jest/types@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.3.1.tgz#7c5a80777cb13e703aeec6788d044150341147e3" - integrity sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA== +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: - "@jest/schemas" "^29.0.0" + "@jest/schemas" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": +"@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.19" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" "@jsdevtools/ono@^7.1.3": version "7.1.3" resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== -"@mui/base@5.0.0-alpha.107": - version "5.0.0-alpha.107" - resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-alpha.107.tgz#5547bf3aaea148b58456e6898f74bc183bdcffa9" - integrity sha512-HX/BD8CSe+Y/dpbZ5aKJScJhKQ/Hw6du2yd68Upv2cO67bwixyZ64h3aNcdDu7RQzI7nrZQm0JykffP1Orgq0g== - dependencies: - "@babel/runtime" "^7.20.1" - "@emotion/is-prop-valid" "^1.2.0" - "@mui/types" "^7.2.1" - "@mui/utils" "^5.10.15" - "@popperjs/core" "^2.11.6" - clsx "^1.2.1" +"@jsdoc/salty@^0.2.1": + version "0.2.5" + resolved "https://registry.yarnpkg.com/@jsdoc/salty/-/salty-0.2.5.tgz#1b2fa5bb8c66485b536d86eee877c263d322f692" + integrity sha512-TfRP53RqunNe2HBobVBJ0VLhK1HbfvBYeTC1ahnN64PWvyYyGebmMiPkuwvD9fpw2ZbkoPb8Q7mwy0aR8Z9rvw== + dependencies: + lodash "^4.17.21" + +"@mui/base@5.0.0-beta.16": + version "5.0.0-beta.16" + resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.16.tgz#5869b8cc83ea5da0083bb11790bda007c2384564" + integrity sha512-OYxhC81c9bO0wobGcM8rrY5bRwpCXAI21BL0P2wz/2vTv4ek7ALz9+U5M8wgdmtRNUhmCmAB4L2WRwFRf5Cd8Q== + dependencies: + "@babel/runtime" "^7.22.15" + "@floating-ui/react-dom" "^2.0.2" + "@mui/types" "^7.2.4" + "@mui/utils" "^5.14.10" + "@popperjs/core" "^2.11.8" + clsx "^2.0.0" prop-types "^15.8.1" - react-is "^18.2.0" -"@mui/core-downloads-tracker@^5.10.15": - version "5.10.15" - resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.10.15.tgz#490f3dea5327c892f063496a0219c48301da0fa0" - integrity sha512-xFcS0LpdF0Q1qJrrNsYUv9PU+ovvhCEPTOMw2jcpEFtl3CA87dLpvztORR5oE2UBFjWF7qLQLOwboQU1+xC7Cw== +"@mui/core-downloads-tracker@^5.14.10": + version "5.14.10" + resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.10.tgz#32a8581be98344bbda5ed31fc7b41788bd2e3bc5" + integrity sha512-kPHu/NhZq1k+vSZR5wq3AyUfD4bnfWAeuKpps0+8PS7ZHQ2Lyv1cXJh+PlFdCIOa0PK98rk3JPwMzS8BMhdHwQ== "@mui/icons-material@^5.3.1": - version "5.10.15" - resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.10.15.tgz#c93f1ba8d2b55fe0a16f559a568304df172cbbcb" - integrity sha512-fXkz7CtYTt4AH4YYT67VFhM/A3YCUqZGGLp/3BlzRPQRNEfFKknw3MgG1S5UYrY5weti8jxMx3mwwfhVP8OMhQ== + version "5.14.9" + resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.14.9.tgz#433cf03c214ce38e1b7a6f684769491fd99c5ef5" + integrity sha512-xTRQbDsogsJo7tY5Og8R9zbuG2q+KIPVIM6JQoKxtJlz9DPOw1u0T2fGrvwD+XAOVifQf6epNMcGCDLfJAz4Nw== dependencies: - "@babel/runtime" "^7.20.1" + "@babel/runtime" "^7.22.15" "@mui/material@^5.4.1": - version "5.10.15" - resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.10.15.tgz#37345f5a3d71c662703af7b5be0cca229b2a1416" - integrity sha512-OqoHfUtVMppFHgk2M95j+pR8MWfLKhzSdz4aKEfIpFrHIHbYang+oY7Iy/exX+vqpZSEGHgHQ0cGX0hGTGx9cg== - dependencies: - "@babel/runtime" "^7.20.1" - "@mui/base" "5.0.0-alpha.107" - "@mui/core-downloads-tracker" "^5.10.15" - "@mui/system" "^5.10.15" - "@mui/types" "^7.2.1" - "@mui/utils" "^5.10.15" - "@types/react-transition-group" "^4.4.5" - clsx "^1.2.1" - csstype "^3.1.1" + version "5.14.10" + resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.14.10.tgz#b8c6ba17c25c0df54053cb0f1bb35083bc91dace" + integrity sha512-ejFMppnO+lzBXpzju+N4SSz0Mhmi5sihXUGcr5FxpgB6bfUP0Lpe32O0Sw/3s8xlmLEvG1fqVT0rRyAVMlCA+A== + dependencies: + "@babel/runtime" "^7.22.15" + "@mui/base" "5.0.0-beta.16" + "@mui/core-downloads-tracker" "^5.14.10" + "@mui/system" "^5.14.10" + "@mui/types" "^7.2.4" + "@mui/utils" "^5.14.10" + "@types/react-transition-group" "^4.4.6" + clsx "^2.0.0" + csstype "^3.1.2" prop-types "^15.8.1" react-is "^18.2.0" react-transition-group "^4.4.5" -"@mui/private-theming@^5.10.15": - version "5.10.15" - resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.10.15.tgz#f039181e197d04d100630829c58b5c33ede209bc" - integrity sha512-l7CsUj5kYdYz118/JHSvZZTYE9WnIWwln0td5jYATnYw9cNX4ygD6AkKOUYZ1Jitp1YLJqcO8jCP9E5/Nql9IQ== +"@mui/private-theming@^5.14.10": + version "5.14.10" + resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.14.10.tgz#42b176b27435931aff40d50833413d10150ac007" + integrity sha512-f67xOj3H06wWDT9xBg7hVL/HSKNF+HG1Kx0Pm23skkbEqD2Ef2Lif64e5nPdmWVv+7cISCYtSuE2aeuzrZe78w== dependencies: - "@babel/runtime" "^7.20.1" - "@mui/utils" "^5.10.15" + "@babel/runtime" "^7.22.15" + "@mui/utils" "^5.14.10" prop-types "^15.8.1" -"@mui/styled-engine@^5.10.14": - version "5.10.14" - resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.10.14.tgz#4395198a1919254a3edabf6e8fc8d43c9c59b5c3" - integrity sha512-bgKdM57ExogWpIfhL/ngSlzF4FhbH00vYF+Y5VALTob4uslFqje0xzoWmbfcCn4cZt2NXxZJIwhsq4vzo5itlw== +"@mui/styled-engine@^5.14.10": + version "5.14.10" + resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.14.10.tgz#2ec443031e48425cd6fda63be498cfa262c1d3a0" + integrity sha512-EJckxmQHrsBvDbFu1trJkvjNw/1R7jfNarnqPSnL+jEQawCkQIqVELWLrlOa611TFtxSJGkdUfCFXeJC203HVg== dependencies: - "@babel/runtime" "^7.20.1" - "@emotion/cache" "^11.10.5" - csstype "^3.1.1" + "@babel/runtime" "^7.22.15" + "@emotion/cache" "^11.11.0" + csstype "^3.1.2" prop-types "^15.8.1" -"@mui/system@^5.10.15": - version "5.10.15" - resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.10.15.tgz#4bb58d1d1a531137559b775038a18d6050d9ee57" - integrity sha512-WZmgmpYTMXAaD++QetaaM/miwhNh1JJY1dH7MJH/3Fuv3r3gnhfzE6A55lDqWxkQmlWUO2DCn/cnNZ0FkSdZUg== - dependencies: - "@babel/runtime" "^7.20.1" - "@mui/private-theming" "^5.10.15" - "@mui/styled-engine" "^5.10.14" - "@mui/types" "^7.2.1" - "@mui/utils" "^5.10.15" - clsx "^1.2.1" - csstype "^3.1.1" +"@mui/system@^5.14.10": + version "5.14.10" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.14.10.tgz#b125f8370c1c92af04f1839c40e034d4edc4ad29" + integrity sha512-QQmtTG/R4gjmLiL5ECQ7kRxLKDm8aKKD7seGZfbINtRVJDyFhKChA1a+K2bfqIAaBo1EMDv+6FWNT1Q5cRKjFA== + dependencies: + "@babel/runtime" "^7.22.15" + "@mui/private-theming" "^5.14.10" + "@mui/styled-engine" "^5.14.10" + "@mui/types" "^7.2.4" + "@mui/utils" "^5.14.10" + clsx "^2.0.0" + csstype "^3.1.2" prop-types "^15.8.1" -"@mui/types@^7.2.1": - version "7.2.1" - resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.1.tgz#1eb2bc182c595029884047f2525ad4dbefea318e" - integrity sha512-c5mSM7ivD8EsqK6HUi9hQPr5V7TJ/IRThUQ9nWNYPdhCGriTSQV4vL6DflT99LkM+wLiIS1rVjphpEWxERep7A== +"@mui/types@^7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.4.tgz#b6fade19323b754c5c6de679a38f068fd50b9328" + integrity sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA== -"@mui/utils@^5.10.15": - version "5.10.15" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.10.15.tgz#54fc1b373508d20dd5568070b2dcc0818e6bebba" - integrity sha512-6AW4MLBUijJi31hxx+6utTJM2q/4hbO+QiMdtwM+f4Iy+BfFnh/elhb08apxNYLfuugPnXXpkDmzEjg+8uDU9g== +"@mui/utils@^5.14.10": + version "5.14.10" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.14.10.tgz#4b0a2a26f1ee12323010daa9d7aecf3384acfc3c" + integrity sha512-Rn+vYQX7FxkcW0riDX/clNUwKuOJFH45HiULxwmpgnzQoQr3A0lb+QYwaZ+FAkZrR7qLoHKmLQlcItu6LT0y/Q== dependencies: - "@babel/runtime" "^7.20.1" + "@babel/runtime" "^7.22.15" "@types/prop-types" "^15.7.5" - "@types/react-is" "^16.7.1 || ^17.0.0" prop-types "^15.8.1" react-is "^18.2.0" @@ -1732,36 +1803,53 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@npmcli/fs@^2.1.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" - integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== +"@npmcli/fs@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" + integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== dependencies: - "@gar/promisify" "^1.1.3" semver "^7.3.5" -"@npmcli/move-file@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" - integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== - dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" - -"@opentelemetry/api@^1.0.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.3.0.tgz#27c6f776ac3c1c616651e506a89f438a0ed6a055" - integrity sha512-YveTnGNsFFixTKJz09Oi4zYkiLT5af3WpZDu4aIUM7xX+2bHAkOJayFTVQd6zB8kkWPpbua4Ha6Ql00grdLlJQ== +"@opentelemetry/api@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.6.0.tgz#de2c6823203d6f319511898bb5de7e70f5267e19" + integrity sha512-OWlrQAnWn9577PhVgqjUvMr1pg57Bc4jv0iL4w0PRuOSRvq67rvHW9Ie/dZVMvCzhSCB+UxhcY/PmCmFj33Q+g== "@opentelemetry/semantic-conventions@~1.3.0": version "1.3.1" resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.3.1.tgz#ba07b864a3c955f061aa30ea3ef7f4ae4449794a" integrity sha512-wU5J8rUoo32oSef/rFpOT1HIjLjAv3qIDHkw1QIhODV3OpAVHi5oVzlouozg9obUmZKtbZ0qUe/m7FP0y0yBzA== -"@popperjs/core@^2.11.6": - version "2.11.6" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" - integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@pnpm/config.env-replace@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" + integrity sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w== + +"@pnpm/network.ca-file@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz#2ab05e09c1af0cdf2fcf5035bea1484e222f7983" + integrity sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA== + dependencies: + graceful-fs "4.2.10" + +"@pnpm/npm-conf@^2.1.0": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz#0058baf1c26cbb63a828f0193795401684ac86f0" + integrity sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA== + dependencies: + "@pnpm/config.env-replace" "^1.1.0" + "@pnpm/network.ca-file" "^1.0.1" + config-chain "^1.1.11" + +"@popperjs/core@^2.11.8": + version "2.11.8" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" @@ -1816,10 +1904,10 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== -"@remix-run/router@1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.0.3.tgz#953b88c20ea00d0eddaffdc1b115c08474aa295d" - integrity sha512-ceuyTSs7PZ/tQqi19YZNBc5X7kj1f8p+4DIyrcIYFY9h+hd1OKm4RqtiWldR9eGEvIiJfsqwM4BsuCtRIuEw6Q== +"@remix-run/router@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.9.0.tgz#9033238b41c4cbe1e961eccb3f79e2c588328cf6" + integrity sha512-bV63itrKBC0zdT27qYm6SDZHlkXwFL1xMBuhkn+X7l0+IIhNaH5wuuvZKp6eKhCD4KFhujhfhCT1YxXW6esUIA== "@seznam/compose-react-refs@^1.0.6": version "1.0.6" @@ -1831,50 +1919,43 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== -"@sinonjs/commons@^1.7.0": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.5.tgz#e280c94c95f206dcfd5aca00a43f2156b758c764" - integrity sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA== +"@sinonjs/commons@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== dependencies: - defer-to-connect "^1.0.1" + "@sinonjs/commons" "^3.0.0" "@testing-library/dom@^8.5.0": - version "8.19.0" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.19.0.tgz#bd3f83c217ebac16694329e413d9ad5fdcfd785f" - integrity sha512-6YWYPPpxG3e/xOo6HIWwB/58HukkwIVTOaZ0VwdMVjhRUX/01E4FtQbck9GazOOj7MXHc5RBzMrU86iBJHbI+A== + version "8.20.1" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.1.tgz#2e52a32e46fc88369eef7eef634ac2a192decd9f" + integrity sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g== dependencies: "@babel/code-frame" "^7.10.4" "@babel/runtime" "^7.12.5" - "@types/aria-query" "^4.2.0" - aria-query "^5.0.0" + "@types/aria-query" "^5.0.1" + aria-query "5.1.3" chalk "^4.1.0" dom-accessibility-api "^0.5.9" - lz-string "^1.4.4" + lz-string "^1.5.0" pretty-format "^27.0.2" -"@testing-library/jest-dom@^5.16.4": - version "5.16.5" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz#3912846af19a29b2dbf32a6ae9c31ef52580074e" - integrity sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA== +"@testing-library/jest-dom@^5.16.5": + version "5.17.0" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz#5e97c8f9a15ccf4656da00fecab505728de81e0c" + integrity sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg== dependencies: "@adobe/css-tools" "^4.0.1" "@babel/runtime" "^7.9.2" @@ -1895,6 +1976,11 @@ "@testing-library/dom" "^8.5.0" "@types/react-dom" "^18.0.0" +"@testing-library/user-event@^14.4.3": + version "14.5.1" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.5.1.tgz#27337d72046d5236b32fd977edee3f74c71d332f" + integrity sha512-UCcUKrUYGj7ClomOo2SpNVvx4/fkd/2BbIHDCle8A0ax+P3bU7yJwDBDrS6ZwdTMARWTGODX1hEsCcO+7beJjg== + "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" @@ -1905,48 +1991,48 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== -"@types/aria-query@^4.2.0": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" - integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== +"@types/aria-query@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc" + integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== "@types/babel__core@^7.1.14": - version "7.1.20" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.20.tgz#e168cdd612c92a2d335029ed62ac94c95b362359" - integrity sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.2.tgz#215db4f4a35d710256579784a548907237728756" + integrity sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA== dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" "@types/babel__generator" "*" "@types/babel__template" "*" "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + version "7.6.5" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.5.tgz#281f4764bcbbbc51fdded0f25aa587b4ce14da95" + integrity sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + version "7.4.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.2.tgz#843e9f1f47c957553b0c374481dc4772921d6a6b" + integrity sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.2.tgz#235bf339d17185bdec25e024ca19cce257cc7309" - integrity sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.2.tgz#4ddf99d95cfdd946ff35d2b65c978d9c9bf2645d" + integrity sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw== dependencies: - "@babel/types" "^7.3.0" + "@babel/types" "^7.20.7" "@types/color-convert@*": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/color-convert/-/color-convert-2.0.0.tgz#8f5ee6b9e863dcbee5703f5a517ffb13d3ea4e22" - integrity sha512-m7GG7IKKGuJUXvkZ1qqG3ChccdIM/qBBo913z+Xft0nKCX4hAU/IxKwZBU4cpRZ7GS5kV4vOblUkILtSShCPXQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/color-convert/-/color-convert-2.0.1.tgz#45216f0d8289c6ae32d139ed08c205a9c55bb5d0" + integrity sha512-GwXanrvq/tBHJtudbl1lSy9Ybt7KS9+rA+YY3bcuIIM+d6jSHUr+5yjO83gtiRpuaPiBccwFjSnAK2qSrIPA7w== dependencies: "@types/color-name" "*" @@ -1956,9 +2042,9 @@ integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== "@types/color@^3.0.1": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/color/-/color-3.0.3.tgz#e6d8d72b7aaef4bb9fe80847c26c7c786191016d" - integrity sha512-X//qzJ3d3Zj82J9sC/C18ZY5f43utPbAJ6PhYt/M7uG6etcF6MRpKdN880KBy43B0BMzSfeT96MzrsNjFI3GbA== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/color/-/color-3.0.4.tgz#53ceca0946660c7779442948878172c6ace13777" + integrity sha512-OpisS4bqJJwbkkQRrMvURf3DOxBoAg9mysHYI7WgrWpSYHqHGKYBULHdz4ih77SILcLDo/zyHGFyfIl9yb8NZQ== dependencies: "@types/color-convert" "*" @@ -1976,10 +2062,18 @@ dependencies: "@types/node" "*" +"@types/glob@*": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.1.0.tgz#b63e70155391b0584dce44e7ea25190bbc38f2fc" + integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w== + dependencies: + "@types/minimatch" "^5.1.2" + "@types/node" "*" + "@types/graceful-fs@^4.1.3": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.7.tgz#30443a2e64fd51113bc3e2ba0914d47109695e2a" + integrity sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw== dependencies: "@types/node" "*" @@ -2008,9 +2102,9 @@ "@types/istanbul-lib-report" "*" "@types/jest@*": - version "29.2.3" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.3.tgz#f5fd88e43e5a9e4221ca361e23790d48fcf0a211" - integrity sha512-6XwoEbmatfyoCjWRX7z0fKMmgYKe9+/HrviJ5k0X/tjJWHGAezZOfYaxqQKuzG/TvQyr+ktjm4jgbk0s4/oF2w== + version "29.5.5" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.5.tgz#727204e06228fe24373df9bae76b90f3e8236a2a" + integrity sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -2032,17 +2126,17 @@ "@types/tough-cookie" "*" parse5 "^7.0.0" -"@types/json-schema@^7.0.6", "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== +"@types/json-schema@^7.0.12", "@types/json-schema@^7.0.6": + version "7.0.13" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.13.tgz#02c24f4363176d2d18fc8b70b9f3c54aba178a85" + integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== "@types/linkify-it@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.2.tgz#fd2cd2edbaa7eaac7e7f3c1748b52a19143846c9" - integrity sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.3.tgz#15a0712296c5041733c79efe233ba17ae5a7587b" + integrity sha512-pTjcqY9E4nOI55Wgpz7eiI8+LzdYnw3qxXCfHyBDdPbYvbyLgWLJGh8EdPvqawwMK1Uo1794AUkkR38Fr0g+2g== -"@types/long@^4.0.0", "@types/long@^4.0.1": +"@types/long@^4.0.0": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== @@ -2060,37 +2154,30 @@ resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9" integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA== +"@types/minimatch@^5.1.2": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + "@types/node@*", "@types/node@>=12.12.47", "@types/node@>=13.7.0": - version "18.11.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" - integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== + version "20.6.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.6.3.tgz#5b763b321cd3b80f6b8dde7a37e1a77ff9358dd9" + integrity sha512-HksnYH4Ljr4VQgEy2lTStbCKv/P590tmPe5HqOnv9Gprffgv5WXAY+Y5Gqniu0GGqeTCUdBnzC3QSrzPkBkAMA== "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== -"@types/prettier@^2.1.5": - version "2.7.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" - integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== - "@types/prop-types@*", "@types/prop-types@^15.7.5": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + version "15.7.6" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.6.tgz#bbf819813d6be21011b8f5801058498bec555572" + integrity sha512-RK/kBbYOQQHLYj9Z95eh7S6t7gq4Ojt/NT8HTk8bWVhA5DaF+5SMnxHKkP4gPNN3wAZkKP+VjAf0ebtYzf+fxg== "@types/react-dom@^18.0.0": - version "18.0.9" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.9.tgz#ffee5e4bfc2a2f8774b15496474f8e7fe8d0b504" - integrity sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg== - dependencies: - "@types/react" "*" - -"@types/react-is@^16.7.1 || ^17.0.0": - version "17.0.3" - resolved "https://registry.yarnpkg.com/@types/react-is/-/react-is-17.0.3.tgz#2d855ba575f2fc8d17ef9861f084acc4b90a137a" - integrity sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw== + version "18.2.7" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.7.tgz#67222a08c0a6ae0a0da33c3532348277c70abb63" + integrity sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA== dependencies: "@types/react" "*" @@ -2104,38 +2191,46 @@ "@types/react-router" "*" "@types/react-router@*": - version "5.1.19" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.19.tgz#9b404246fba7f91474d7008a3d48c17b6e075ad6" - integrity sha512-Fv/5kb2STAEMT3wHzdKQK2z8xKq38EDIGVrutYLmQVVLe+4orDFquU52hQrULnEHinMKv9FSA6lf9+uNT1ITtA== + version "5.1.20" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.20.tgz#88eccaa122a82405ef3efbcaaa5dcdd9f021387c" + integrity sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q== dependencies: "@types/history" "^4.7.11" "@types/react" "*" -"@types/react-transition-group@^4.4.5": - version "4.4.5" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416" - integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA== +"@types/react-transition-group@^4.4.6": + version "4.4.6" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.6.tgz#18187bcda5281f8e10dfc48f0943e2fdf4f75e2e" + integrity sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew== dependencies: "@types/react" "*" "@types/react@*", "@types/react@^18.0.0": - version "18.0.25" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.25.tgz#8b1dcd7e56fe7315535a4af25435e0bb55c8ae44" - integrity sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g== + version "18.2.22" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.22.tgz#abe778a1c95a07fa70df40a52d7300a40b949ccb" + integrity sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" +"@types/rimraf@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-3.0.2.tgz#a63d175b331748e5220ad48c901d7bbf1f44eef8" + integrity sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ== + dependencies: + "@types/glob" "*" + "@types/node" "*" + "@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + version "0.16.3" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" + integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== -"@types/semver@^7.3.12": - version "7.3.13" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" - integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== +"@types/semver@^7.5.0": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.3.tgz#9a726e116beb26c24f1ccd6850201e1246122e04" + integrity sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw== "@types/stack-utils@^2.0.0": version "2.0.1" @@ -2143,21 +2238,26 @@ integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== "@types/testing-library__jest-dom@^5.9.1": - version "5.14.5" - resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz#d113709c90b3c75fdb127ec338dad7d5f86c974f" - integrity sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ== + version "5.14.9" + resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz#0fb1e6a0278d87b6737db55af5967570b67cb466" + integrity sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw== dependencies: "@types/jest" "*" "@types/tough-cookie@*": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" - integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.3.tgz#3d06b6769518450871fbc40770b7586334bdfd90" + integrity sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg== + +"@types/triple-beam@^1.3.2": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.3.tgz#726ae98a5f6418c8f24f9b0f2a9f81a8664876ae" + integrity sha512-6tOUG+nVHn0cJbVp25JFayS5UE6+xlbcNF9Lo9mU7U0zk3zeUShZied4YEQZjy1JBF043FSkdXw8YkUJuVtB5g== "@types/trusted-types@*": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756" - integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.4.tgz#2b38784cd16957d3782e8e2b31c03bc1d13b4d65" + integrity sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ== "@types/yargs-parser@*": version "21.0.0" @@ -2165,128 +2265,140 @@ integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@types/yargs@^17.0.8": - version "17.0.14" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.14.tgz#0943473052c24bd8cf2d1de25f1a710259327237" - integrity sha512-9Pj7abXoW1RSTcZaL2Hk6G2XyLMlp5ECdVC/Zf2p/KBjC3srijLGgRAXOBjtFrJoIrvxdTKyKDA14bEcbxBaWw== + version "17.0.24" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" + integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^5.17.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.44.0.tgz#105788f299050c917eb85c4d9fd04b089e3740de" - integrity sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw== +"@typescript-eslint/eslint-plugin@^6.7.3": + version "6.7.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.3.tgz#d98046e9f7102d49a93d944d413c6055c47fafd7" + integrity sha512-vntq452UHNltxsaaN+L9WyuMch8bMd9CqJ3zhzTPXXidwbf5mqqKCVXEuvRZUqLJSTLeWE65lQwyXsRGnXkCTA== dependencies: - "@typescript-eslint/scope-manager" "5.44.0" - "@typescript-eslint/type-utils" "5.44.0" - "@typescript-eslint/utils" "5.44.0" + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.7.3" + "@typescript-eslint/type-utils" "6.7.3" + "@typescript-eslint/utils" "6.7.3" + "@typescript-eslint/visitor-keys" "6.7.3" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@^5.9.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== + dependencies: + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" debug "^4.3.4" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - regexpp "^3.2.0" - semver "^7.3.7" - tsutils "^3.21.0" -"@typescript-eslint/parser@^5.17.0", "@typescript-eslint/parser@^5.9.0": - version "5.45.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.45.1.tgz#6440ec283fa1373a12652d4e2fef4cb6e7b7e8c6" - integrity sha512-JQ3Ep8bEOXu16q0ztsatp/iQfDCtvap7sp/DKo7DWltUquj5AfCOpX2zSzJ8YkAVnrQNqQ5R62PBz2UtrfmCkA== +"@typescript-eslint/parser@^6.7.3": + version "6.7.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.7.3.tgz#aaf40092a32877439e5957e18f2d6a91c82cc2fd" + integrity sha512-TlutE+iep2o7R8Lf+yoer3zU6/0EAUc8QIBB3GYBc1KGz4c4TRm83xwXUZVPlZ6YCLss4r77jbu6j3sendJoiQ== dependencies: - "@typescript-eslint/scope-manager" "5.45.1" - "@typescript-eslint/types" "5.45.1" - "@typescript-eslint/typescript-estree" "5.45.1" + "@typescript-eslint/scope-manager" "6.7.3" + "@typescript-eslint/types" "6.7.3" + "@typescript-eslint/typescript-estree" "6.7.3" + "@typescript-eslint/visitor-keys" "6.7.3" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.44.0.tgz#988c3f34b45b3474eb9ff0674c18309dedfc3e04" - integrity sha512-2pKml57KusI0LAhgLKae9kwWeITZ7IsZs77YxyNyIVOwQ1kToyXRaJLl+uDEXzMN5hnobKUOo2gKntK9H1YL8g== +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== dependencies: - "@typescript-eslint/types" "5.44.0" - "@typescript-eslint/visitor-keys" "5.44.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/scope-manager@5.45.1": - version "5.45.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.45.1.tgz#5b87d025eec7035d879b99c260f03be5c247883c" - integrity sha512-D6fCileR6Iai7E35Eb4Kp+k0iW7F1wxXYrOhX/3dywsOJpJAQ20Fwgcf+P/TDtvQ7zcsWsrJaglaQWDhOMsspQ== +"@typescript-eslint/scope-manager@6.7.3": + version "6.7.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.7.3.tgz#07e5709c9bdae3eaf216947433ef97b3b8b7d755" + integrity sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ== dependencies: - "@typescript-eslint/types" "5.45.1" - "@typescript-eslint/visitor-keys" "5.45.1" + "@typescript-eslint/types" "6.7.3" + "@typescript-eslint/visitor-keys" "6.7.3" -"@typescript-eslint/type-utils@5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.44.0.tgz#bc5a6e8a0269850714a870c9268c038150dfb3c7" - integrity sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w== +"@typescript-eslint/type-utils@6.7.3": + version "6.7.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.7.3.tgz#c2c165c135dda68a5e70074ade183f5ad68f3400" + integrity sha512-Fc68K0aTDrKIBvLnKTZ5Pf3MXK495YErrbHb1R6aTpfK5OdSFj0rVN7ib6Tx6ePrZ2gsjLqr0s98NG7l96KSQw== dependencies: - "@typescript-eslint/typescript-estree" "5.44.0" - "@typescript-eslint/utils" "5.44.0" + "@typescript-eslint/typescript-estree" "6.7.3" + "@typescript-eslint/utils" "6.7.3" debug "^4.3.4" - tsutils "^3.21.0" + ts-api-utils "^1.0.1" -"@typescript-eslint/types@5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.44.0.tgz#f3f0b89aaff78f097a2927fe5688c07e786a0241" - integrity sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ== +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/types@5.45.1": - version "5.45.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.45.1.tgz#8e1883041cee23f1bb7e1343b0139f97f6a17c14" - integrity sha512-HEW3U0E5dLjUT+nk7b4lLbOherS1U4ap+b9pfu2oGsW3oPu7genRaY9dDv3nMczC1rbnRY2W/D7SN05wYoGImg== +"@typescript-eslint/types@6.7.3": + version "6.7.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.7.3.tgz#0402b5628a63f24f2dc9d4a678e9a92cc50ea3e9" + integrity sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw== -"@typescript-eslint/typescript-estree@5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.44.0.tgz#0461b386203e8d383bb1268b1ed1da9bc905b045" - integrity sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw== +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== dependencies: - "@typescript-eslint/types" "5.44.0" - "@typescript-eslint/visitor-keys" "5.44.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@5.45.1": - version "5.45.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.45.1.tgz#b3dc37f0c4f0fe73e09917fc735e6f96eabf9ba4" - integrity sha512-76NZpmpCzWVrrb0XmYEpbwOz/FENBi+5W7ipVXAsG3OoFrQKJMiaqsBMbvGRyLtPotGqUfcY7Ur8j0dksDJDng== +"@typescript-eslint/typescript-estree@6.7.3": + version "6.7.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.3.tgz#ec5bb7ab4d3566818abaf0e4a8fa1958561b7279" + integrity sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g== dependencies: - "@typescript-eslint/types" "5.45.1" - "@typescript-eslint/visitor-keys" "5.45.1" + "@typescript-eslint/types" "6.7.3" + "@typescript-eslint/visitor-keys" "6.7.3" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.44.0.tgz#d733da4d79d6c30f1a68b531cdda1e0c1f00d52d" - integrity sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw== - dependencies: - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.44.0" - "@typescript-eslint/types" "5.44.0" - "@typescript-eslint/typescript-estree" "5.44.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - semver "^7.3.7" - -"@typescript-eslint/visitor-keys@5.44.0": - version "5.44.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.44.0.tgz#10740dc28902bb903d12ee3a005cc3a70207d433" - integrity sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ== - dependencies: - "@typescript-eslint/types" "5.44.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@6.7.3": + version "6.7.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.7.3.tgz#96c655816c373135b07282d67407cb577f62e143" + integrity sha512-vzLkVder21GpWRrmSR9JxGZ5+ibIUSudXlW52qeKpzUEQhRSmyZiVDDj3crAth7+5tmN1ulvgKaCU2f/bPRCzg== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.7.3" + "@typescript-eslint/types" "6.7.3" + "@typescript-eslint/typescript-estree" "6.7.3" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@5.45.1": - version "5.45.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.1.tgz#204428430ad6a830d24c5ac87c71366a1cfe1948" - integrity sha512-cy9ln+6rmthYWjH9fmx+5FU/JDpjQb586++x2FZlveq7GdGuLLW9a2Jcst2TGekH82bXpfmRNSwP9tyEs6RjvQ== +"@typescript-eslint/visitor-keys@6.7.3": + version "6.7.3" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.3.tgz#83809631ca12909bd2083558d2f93f5747deebb2" + integrity sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg== dependencies: - "@typescript-eslint/types" "5.45.1" - eslint-visitor-keys "^3.3.0" + "@typescript-eslint/types" "6.7.3" + eslint-visitor-keys "^3.4.1" abab@^2.0.6: version "2.0.6" @@ -2331,10 +2443,10 @@ acorn-walk@^8.0.2, acorn-walk@^8.2.0: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8.1.0, acorn@^8.7.0, acorn@^8.8.0, acorn@^8.8.1: - version "8.8.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" - integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== +acorn@^8.1.0, acorn@^8.7.0, acorn@^8.8.1, acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== agent-base@6, agent-base@^6.0.0, agent-base@^6.0.2: version "6.0.2" @@ -2344,12 +2456,10 @@ agent-base@6, agent-base@^6.0.0, agent-base@^6.0.2: debug "4" agentkeepalive@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" - integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== + version "4.5.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== dependencies: - debug "^4.1.0" - depd "^1.1.2" humanize-ms "^1.2.1" aggregate-error@^3.0.0: @@ -2367,7 +2477,7 @@ ajv-formats@^2.1.0: dependencies: ajv "^8.0.0" -ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.6: +ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.6: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2378,9 +2488,9 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.6: uri-js "^4.2.2" ajv@^8.0.0, ajv@^8.3.0: - version "8.11.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.2.tgz#aecb20b50607acf2569b6382167b65a96008bb78" - integrity sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg== + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -2401,38 +2511,33 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.21.3" -ansi-escapes@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-5.0.0.tgz#b6a0caf0eef0c41af190e9a749e0c00ec04bb2a6" - integrity sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA== +ansi-escapes@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-6.2.0.tgz#8a13ce75286f417f1963487d86ba9f90dccf9947" + integrity sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw== dependencies: - type-fest "^1.0.2" + type-fest "^3.0.0" ansi-regex@^0.2.0, ansi-regex@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" integrity sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA== -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + ansi-styles@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" integrity sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA== -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== - ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -2452,6 +2557,11 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + ansicolors@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" @@ -2486,16 +2596,32 @@ archiver-utils@^2.1.0: normalize-path "^3.0.0" readable-stream "^2.0.0" +archiver-utils@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-3.0.4.tgz#a0d201f1cf8fce7af3b5a05aea0a337329e96ec7" + integrity sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw== + dependencies: + glob "^7.2.3" + graceful-fs "^4.2.0" + lazystream "^1.0.0" + lodash.defaults "^4.2.0" + lodash.difference "^4.5.0" + lodash.flatten "^4.4.0" + lodash.isplainobject "^4.0.6" + lodash.union "^4.6.0" + normalize-path "^3.0.0" + readable-stream "^3.6.0" + archiver@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/archiver/-/archiver-5.3.1.tgz#21e92811d6f09ecfce649fbefefe8c79e57cbbb6" - integrity sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w== + version "5.3.2" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-5.3.2.tgz#99991d5957e53bd0303a392979276ac4ddccf3b0" + integrity sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw== dependencies: archiver-utils "^2.1.0" - async "^3.2.3" + async "^3.2.4" buffer-crc32 "^0.2.1" readable-stream "^3.6.0" - readdir-glob "^1.0.0" + readdir-glob "^1.1.2" tar-stream "^2.2.0" zip-stream "^4.1.0" @@ -2519,13 +2645,28 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^5.0.0: +aria-query@5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== dependencies: deep-equal "^2.0.5" +aria-query@^5.0.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -2536,15 +2677,15 @@ array-flatten@3.0.0: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-3.0.0.tgz#6428ca2ee52c7b823192ec600fa3ed2f157cd541" integrity sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA== -array-includes@^3.1.5, array-includes@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" - integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== +array-includes@^3.1.6: + version "3.1.7" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" + integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" is-string "^1.0.7" array-union@^2.1.0: @@ -2552,26 +2693,49 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array.prototype.flat@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + array.prototype.flatmap@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" - integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" array.prototype.tosorted@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" - integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" + integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.1" + +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" arrify@^2.0.0: version "2.0.1" @@ -2619,11 +2783,18 @@ async@^2.6.1, async@^2.6.4: dependencies: lodash "^4.17.14" -async@^3.2.3: +async@^3.2.3, async@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== +asynciterator.prototype@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" + integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== + dependencies: + has-symbols "^1.0.3" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -2640,9 +2811,9 @@ aws-sign2@~0.7.0: integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== babel-jest@^28.1.3: version "28.1.3" @@ -2657,15 +2828,15 @@ babel-jest@^28.1.3: graceful-fs "^4.2.9" slash "^3.0.0" -babel-jest@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.3.1.tgz#05c83e0d128cd48c453eea851482a38782249f44" - integrity sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA== +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== dependencies: - "@jest/transform" "^29.3.1" + "@jest/transform" "^29.7.0" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.2.0" + babel-preset-jest "^29.6.3" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" @@ -2691,10 +2862,10 @@ babel-plugin-jest-hoist@^28.1.3: "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" -babel-plugin-jest-hoist@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz#23ee99c37390a98cfddf3ef4a78674180d823094" - integrity sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA== +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -2710,29 +2881,29 @@ babel-plugin-macros@^3.1.0: cosmiconfig "^7.0.0" resolve "^1.19.0" -babel-plugin-polyfill-corejs2@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" - integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== +babel-plugin-polyfill-corejs2@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" + integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.3" - semver "^6.1.1" + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.2" + semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" - integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== +babel-plugin-polyfill-corejs3@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52" + integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - core-js-compat "^3.25.1" + "@babel/helper-define-polyfill-provider" "^0.4.2" + core-js-compat "^3.31.0" -babel-plugin-polyfill-regenerator@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" - integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== +babel-plugin-polyfill-regenerator@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" + integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" + "@babel/helper-define-polyfill-provider" "^0.4.2" babel-preset-current-node-syntax@^1.0.0: version "1.0.1" @@ -2760,12 +2931,12 @@ babel-preset-jest@^28.1.3: babel-plugin-jest-hoist "^28.1.3" babel-preset-current-node-syntax "^1.0.0" -babel-preset-jest@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz#3048bea3a1af222e3505e4a767a974c95a7620dc" - integrity sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA== +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== dependencies: - babel-plugin-jest-hoist "^29.2.0" + babel-plugin-jest-hoist "^29.6.3" babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: @@ -2797,29 +2968,16 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -big-integer@^1.6.17: - version "1.6.51" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" - integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== - bignumber.js@^9.0.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.0.tgz#8d340146107fe3a6cb8d40699643c302e8773b62" - integrity sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A== + version "9.1.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -binary@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" - integrity sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg== - dependencies: - buffers "~0.1.1" - chainsaw "~0.1.0" - bl@^4.0.3, bl@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" @@ -2834,12 +2992,7 @@ bluebird@^3.7.2: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bluebird@~3.4.1: - version "3.4.7" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" - integrity sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA== - -body-parser@1.20.1, body-parser@^1.18.3, body-parser@^1.19.0: +body-parser@1.20.1: version "1.20.1" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== @@ -2857,19 +3010,23 @@ body-parser@1.20.1, body-parser@^1.18.3, body-parser@^1.19.0: type-is "~1.6.18" unpipe "1.0.0" -boxen@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" - integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== +body-parser@^1.18.3, body-parser@^1.19.0: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== dependencies: - ansi-align "^3.0.0" - camelcase "^5.3.1" - chalk "^3.0.0" - cli-boxes "^2.2.0" - string-width "^4.1.0" - term-size "^2.1.0" - type-fest "^0.8.1" - widest-line "^3.1.0" + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" boxen@^5.0.0: version "5.1.2" @@ -2907,15 +3064,15 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.21.3, browserslist@^4.21.4: - version "4.21.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== +browserslist@^4.21.10, browserslist@^4.21.9: + version "4.21.10" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" + integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== dependencies: - caniuse-lite "^1.0.30001400" - electron-to-chromium "^1.4.251" - node-releases "^2.0.6" - update-browserslist-db "^1.0.9" + caniuse-lite "^1.0.30001517" + electron-to-chromium "^1.4.477" + node-releases "^2.0.13" + update-browserslist-db "^1.0.11" bs-logger@0.x: version "0.2.6" @@ -2946,11 +3103,6 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer-indexof-polyfill@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz#d2732135c5999c64b277fcf9b1abe3498254729c" - integrity sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A== - buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" @@ -2959,11 +3111,6 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -buffers@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" - integrity sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ== - bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -2974,42 +3121,23 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -cacache@^16.1.0: - version "16.1.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" - integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== +cacache@^17.0.0: + version "17.1.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.4.tgz#b3ff381580b47e85c6e64f801101508e26604b35" + integrity sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A== dependencies: - "@npmcli/fs" "^2.1.0" - "@npmcli/move-file" "^2.0.0" - chownr "^2.0.0" - fs-minipass "^2.1.0" - glob "^8.0.1" - infer-owner "^1.0.4" + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" lru-cache "^7.7.1" - minipass "^3.1.6" + minipass "^7.0.3" minipass-collect "^1.0.2" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" - mkdirp "^1.0.4" p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^9.0.0" + ssri "^10.0.0" tar "^6.1.11" - unique-filename "^2.0.0" - -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" + unique-filename "^3.0.0" call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" @@ -3039,10 +3167,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001400: - version "1.0.30001434" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz#ec1ec1cfb0a93a34a0600d37903853030520a4e5" - integrity sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA== +caniuse-lite@^1.0.30001517: + version "1.0.30001538" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz#9dbc6b9af1ff06b5eb12350c2012b3af56744f3f" + integrity sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw== cardinal@^2.1.1: version "2.1.1" @@ -3064,25 +3192,7 @@ catharsis@^0.9.0: dependencies: lodash "^4.17.15" -chainsaw@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" - integrity sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ== - dependencies: - traverse ">=0.3.0 <0.4" - -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.0.0, chalk@^2.4.2: +chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3107,10 +3217,10 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.1.2.tgz#d957f370038b75ac572471e83be4c5ca9f8e8c45" - integrity sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ== +chalk@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== chalk@~0.5.1: version "0.5.1" @@ -3159,14 +3269,14 @@ ci-info@^2.0.0: integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.2.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.6.2.tgz#362ea15378f1c39378ba786affbc1c9ef015ecfd" - integrity sha512-lVZdhvbEudris15CLytp2u6Y0p5EKfztae9Fqa189MfNmln9F33XuH69v5fvNfiRN5/0eAUz2yJL3mo+nhaRKg== + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + version "1.2.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== cjson@^0.3.1: version "0.3.3" @@ -3180,7 +3290,7 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cli-boxes@^2.2.0, cli-boxes@^2.2.1: +cli-boxes@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== @@ -3193,11 +3303,11 @@ cli-cursor@^3.1.0: restore-cursor "^3.1.0" cli-spinners@^2.5.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" - integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== + version "2.9.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.1.tgz#9c0b9dad69a6d47cbb4333c14319b060ed395a35" + integrity sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ== -cli-table3@^0.6.1: +cli-table3@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== @@ -3218,15 +3328,6 @@ cli-width@^3.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -3236,32 +3337,30 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" -clone-response@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" - integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== - dependencies: - mimic-response "^1.0.0" - clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== -clsx@^1.1.1, clsx@^1.2.1: +clsx@^1.1.1: version "1.2.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== +clsx@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" + integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" @@ -3317,9 +3416,9 @@ color@^4.2.3: color-string "^1.9.0" colorette@^2.0.19: - version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== colors@1.0.3: version "1.0.3" @@ -3341,27 +3440,20 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + commander@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== -commander@^9.2.0: - version "9.4.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.1.tgz#d1dd8f2ce6faf93147295c0df13c7c21141cfbdd" - integrity sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw== - -compare-semver@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/compare-semver/-/compare-semver-1.1.0.tgz#7c0a79a27bb80b6c6994445f82958259d3d02153" - integrity sha512-AENcdfhxsMCzzl+QRdOwMQeA8tZBEEacAmA4pGPoyco27G9sIaM98WNYkcToC9O0wIx1vE+1ErmaM4t0/fXhMw== - dependencies: - semver "^5.0.1" - -compress-commons@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.1.1.tgz#df2a09a7ed17447642bad10a85cc9a19e5c42a7d" - integrity sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ== +compress-commons@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.1.2.tgz#6542e59cb63e1f46a8b21b0e06f9a32e4c8b06df" + integrity sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg== dependencies: buffer-crc32 "^0.2.13" crc32-stream "^4.0.2" @@ -3393,6 +3485,14 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +config-chain@^1.1.11: + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + configstore@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" @@ -3405,7 +3505,7 @@ configstore@^5.0.1: write-file-atomic "^3.0.0" xdg-basedir "^4.0.0" -connect@^3.6.2: +connect@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== @@ -3427,10 +3527,10 @@ content-disposition@0.5.4: dependencies: safe-buffer "5.2.1" -content-type@^1.0.4, content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== +content-type@^1.0.4, content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.9.0" @@ -3452,12 +3552,12 @@ cookie@0.5.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -core-js-compat@^3.25.1: - version "3.26.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.26.1.tgz#0e710b09ebf689d719545ac36e49041850f943df" - integrity sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A== +core-js-compat@^3.31.0: + version "3.32.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.32.2.tgz#8047d1a8b3ac4e639f0d4f66d4431aa3b16e004c" + integrity sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ== dependencies: - browserslist "^4.21.4" + browserslist "^4.21.10" core-util-is@1.0.2: version "1.0.2" @@ -3494,13 +3594,26 @@ crc-32@^1.2.0: integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== crc32-stream@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.2.tgz#c922ad22b38395abe9d3870f02fa8134ed709007" - integrity sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w== + version "4.0.3" + resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.3.tgz#85dd677eb78fa7cad1ba17cc506a597d41fc6f33" + integrity sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw== dependencies: crc-32 "^1.2.0" readable-stream "^3.4.0" +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + cross-env@^5.1.3: version "5.2.1" resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.1.tgz#b2c76c1ca7add66dc874d11798466094f551b34d" @@ -3519,7 +3632,7 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -3555,15 +3668,15 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -csstype@^3.0.2, csstype@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" - integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== +csstype@^3.0.2, csstype@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== csv-parse@^5.0.4: - version "5.3.2" - resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.3.2.tgz#a8ce2f8dec1b9c1013c9e73c6102fe0d2d436dbb" - integrity sha512-3jQ/JMs+voKxr4vwpmElS1d37J0o6rQdQyEKoPyA9HG8fYczpLaBJnmp5ykvkXL8ZeEGVP0qwLU645BZVykXKw== + version "5.5.0" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.5.0.tgz#2313421e69b650dae32a79ac884b20b21ca1d9da" + integrity sha512-RxruSK3M4XgzcD7Trm2wEN+SJ26ChIb903+IWxNOcB5q4jT2Cs+hFr6QP39J05EohshRFEvyzEBoZ/466S2sbw== dashdash@^1.12.0: version "1.14.1" @@ -3587,9 +3700,11 @@ data-urls@^3.0.2: whatwg-url "^11.0.0" date-fns@^2.22.1: - version "2.29.3" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" - integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== + version "2.30.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== + dependencies: + "@babel/runtime" "^7.21.0" debug@2.6.9: version "2.6.9" @@ -3625,42 +3740,38 @@ debuglog@^1.0.1: integrity sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw== decimal.js@^10.4.2: - version "10.4.2" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.2.tgz#0341651d1d997d86065a2ce3a441fbd0d8e8b98e" - integrity sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA== - -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== - dependencies: - mimic-response "^1.0.0" + version "10.4.3" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +dedent@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" + integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== deep-equal@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.1.0.tgz#5ba60402cf44ab92c2c07f3f3312c3d857a0e1dd" - integrity sha512-2pxgvWu3Alv1PoWEyVg7HS8YhGlUFUV7N5oOvfL6d+7xAmLSemMwv/c8Zv/i9KFzxV5Kt5CAvQc70fLwVuf4UA== + version "2.2.2" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.2.tgz#9b2635da569a13ba8e1cc159c2f744071b115daa" + integrity sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA== dependencies: + array-buffer-byte-length "^1.0.0" call-bind "^1.0.2" - es-get-iterator "^1.1.2" - get-intrinsic "^1.1.3" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.1" is-arguments "^1.1.1" + is-array-buffer "^3.0.2" is-date-object "^1.0.5" is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" isarray "^2.0.5" object-is "^1.1.5" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" + regexp.prototype.flags "^1.5.0" side-channel "^1.0.4" which-boxed-primitive "^1.0.2" which-collection "^1.0.1" - which-typed-array "^1.1.8" + which-typed-array "^1.1.9" deep-extend@^0.6.0: version "0.6.0" @@ -3678,9 +3789,9 @@ deep-is@^0.1.3, deep-is@~0.1.3: integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== defaults@^1.0.3: version "1.0.4" @@ -3689,28 +3800,33 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== +define-data-property@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.0.tgz#0db13540704e1d8d479a0656cf781267531b9451" + integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" -define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: + define-data-property "^1.0.1" has-property-descriptors "^1.0.0" object-keys "^1.1.1" degenerator@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-3.0.2.tgz#6a61fcc42a702d6e50ff6023fe17bff435f68235" - integrity sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ== + version "3.0.4" + resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-3.0.4.tgz#07ccf95bc11044a37a6efc2f66029fb636e31f24" + integrity sha512-Z66uPeBfHZAHVmue3HPfyKu2Q0rC2cRxbTOsvmU/po5fvvcx27W4mIu9n0PUlQih4oUYvcG1BsbtVv8x7KDOSw== dependencies: ast-types "^0.13.2" escodegen "^1.8.1" esprima "^4.0.0" - vm2 "^3.9.8" + vm2 "^3.9.17" delayed-stream@~1.0.0: version "1.0.0" @@ -3727,10 +3843,10 @@ depd@2.0.0, depd@~2.0.0: resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -depd@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== destroy@1.2.0, destroy@^1.0.4: version "1.2.0" @@ -3755,10 +3871,10 @@ diff-sequences@^27.5.1: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== -diff-sequences@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.3.1.tgz#104b5b95fe725932421a9c6e5b4bef84c3f2249e" - integrity sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ== +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== dir-glob@^3.0.1: version "3.0.1" @@ -3782,9 +3898,9 @@ doctrine@^3.0.0: esutils "^2.0.2" dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: - version "0.5.14" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz#56082f71b1dc7aac69d83c4285eef39c15d93f56" - integrity sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg== + version "0.5.16" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== dom-helpers@^5.0.1: version "5.2.1" @@ -3802,9 +3918,9 @@ domexception@^4.0.0: webidl-conversions "^7.0.0" dompurify@^2.2.9: - version "2.4.1" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.1.tgz#f9cb1a275fde9af6f2d0a2644ef648dd6847b631" - integrity sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA== + version "2.4.7" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.7.tgz#277adeb40a2c84be2d42a8bcd45f582bfa4d0cfc" + integrity sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ== dot-prop@^5.2.0: version "5.3.0" @@ -3813,18 +3929,6 @@ dot-prop@^5.2.0: dependencies: is-obj "^2.0.0" -duplexer2@~0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - integrity sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA== - dependencies: - readable-stream "^2.0.2" - -duplexer3@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" - integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== - duplexify@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.2.tgz#18b4f8d28289132fa0b9573c898d9f903f81c7b0" @@ -3835,6 +3939,11 @@ duplexify@^4.0.0: readable-stream "^3.1.1" stream-shift "^1.0.0" +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -3855,10 +3964,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.251: - version "1.4.284" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" - integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== +electron-to-chromium@^1.4.477: + version "1.4.526" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.526.tgz#1bcda5f2b8238e497c20fcdb41af5da907a770e2" + integrity sha512-tjjTMjmZAx1g6COrintLTa2/jcafYKxKoiEkdQOrVdbLaHh2wCt2nsAF8ZHweezkrP+dl/VG9T5nabcYoo0U5Q== emittery@^0.13.1: version "0.13.1" @@ -3870,6 +3979,11 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + enabled@2.0.x: version "2.0.0" resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" @@ -3895,9 +4009,9 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: once "^1.4.0" entities@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" - integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== entities@~2.1.0: version "2.1.0" @@ -3921,49 +4035,94 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.20.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" - integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== +es-abstract@^1.22.1: + version "1.22.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.2.tgz#90f7282d91d0ad577f505e423e52d4c1d93c1b8a" + integrity sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA== dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.2" + available-typed-arrays "^1.0.5" call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.3" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.1" get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" has "^1.0.3" has-property-descriptors "^1.0.0" + has-proto "^1.0.1" has-symbols "^1.0.3" - internal-slot "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" is-string "^1.0.7" + is-typed-array "^1.1.12" is-weakref "^1.0.2" - object-inspect "^1.12.2" + object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" safe-regex-test "^1.0.0" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" unbox-primitive "^1.0.2" + which-typed-array "^1.1.11" -es-get-iterator@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" - integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.1.0" - has-symbols "^1.0.1" - is-arguments "^1.1.0" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" is-map "^2.0.2" is-set "^2.0.2" - is-string "^1.0.5" + is-string "^1.0.7" isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +es-iterator-helpers@^1.0.12: + version "1.0.15" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" + integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== + dependencies: + asynciterator.prototype "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.1" + es-abstract "^1.22.1" + es-set-tostringtag "^2.0.1" + function-bind "^1.1.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + iterator.prototype "^1.1.2" + safe-array-concat "^1.0.1" + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" es-shim-unscopables@^1.0.0: version "1.0.0" @@ -3981,134 +4140,6 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -esbuild-android-64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.15.tgz#fd959b034dd761d14e13dda6214b6948841ff4ff" - integrity sha512-F+WjjQxO+JQOva3tJWNdVjouFMLK6R6i5gjDvgUthLYJnIZJsp1HlF523k73hELY20WPyEO8xcz7aaYBVkeg5Q== - -esbuild-android-arm64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.15.tgz#9733b71cf0229b4356f106a455b2cfdf7884aa59" - integrity sha512-attlyhD6Y22jNyQ0fIIQ7mnPvDWKw7k6FKnsXlBvQE6s3z6s6cuEHcSgoirquQc7TmZgVCK5fD/2uxmRN+ZpcQ== - -esbuild-darwin-64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.15.tgz#fc3482fdf5e798dbc0b8b2fe13287d257a45efc6" - integrity sha512-ohZtF8W1SHJ4JWldsPVdk8st0r9ExbAOSrBOh5L+Mq47i696GVwv1ab/KlmbUoikSTNoXEhDzVpxUR/WIO19FQ== - -esbuild-darwin-arm64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.15.tgz#e922ec387c00fa84d664e14b5722fe13613f4adc" - integrity sha512-P8jOZ5zshCNIuGn+9KehKs/cq5uIniC+BeCykvdVhx/rBXSxmtj3CUIKZz4sDCuESMbitK54drf/2QX9QHG5Ag== - -esbuild-freebsd-64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.15.tgz#69a42d79137d7d3ea718414c432bc10e8bb97c68" - integrity sha512-KkTg+AmDXz1IvA9S1gt8dE24C8Thx0X5oM0KGF322DuP+P3evwTL9YyusHAWNsh4qLsR80nvBr/EIYs29VSwuA== - -esbuild-freebsd-arm64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.15.tgz#63b6d0dd492f7394f8d07a0e2b931151eb9d60c4" - integrity sha512-FUcML0DRsuyqCMfAC+HoeAqvWxMeq0qXvclZZ/lt2kLU6XBnDA5uKTLUd379WYEyVD4KKFctqWd9tTuk8C/96g== - -esbuild-linux-32@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.15.tgz#7f295795fd7e61ea57d1135f717424a6771a7472" - integrity sha512-q28Qn5pZgHNqug02aTkzw5sW9OklSo96b5nm17Mq0pDXrdTBcQ+M6Q9A1B+dalFeynunwh/pvfrNucjzwDXj+Q== - -esbuild-linux-64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.15.tgz#11a430a86403b0411ca0a355b891f1cb8c4c4ec6" - integrity sha512-217KPmWMirkf8liO+fj2qrPwbIbhNTGNVtvqI1TnOWJgcMjUWvd677Gq3fTzXEjilkx2yWypVnTswM2KbXgoAg== - -esbuild-linux-arm64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.15.tgz#b65f9a2c60e8e5b62f6cfd392cd0410f22e8c390" - integrity sha512-/ltmNFs0FivZkYsTzAsXIfLQX38lFnwJTWCJts0IbCqWZQe+jjj0vYBNbI0kmXLb3y5NljiM5USVAO1NVkdh2g== - -esbuild-linux-arm@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.15.tgz#c8e13e45a0a6f0cb145ce13ae26ce1d2551d9bcc" - integrity sha512-RYVW9o2yN8yM7SB1yaWr378CwrjvGCyGybX3SdzPHpikUHkME2AP55Ma20uNwkNyY2eSYFX9D55kDrfQmQBR4w== - -esbuild-linux-mips64le@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.15.tgz#d4c24d47e43966fcac748c90621be7edd53456c0" - integrity sha512-PksEPb321/28GFFxtvL33yVPfnMZihxkEv5zME2zapXGp7fA1X2jYeiTUK+9tJ/EGgcNWuwvtawPxJG7Mmn86A== - -esbuild-linux-ppc64le@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.15.tgz#2eba53fe2282438ceca5471bdb57ba2e00216ed6" - integrity sha512-ek8gJBEIhcpGI327eAZigBOHl58QqrJrYYIZBWQCnH3UnXoeWMrMZLeeZL8BI2XMBhP+sQ6ERctD5X+ajL/AIA== - -esbuild-linux-riscv64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.15.tgz#1afa8dfe55a6c312f1904ee608b81417205f5027" - integrity sha512-H5ilTZb33/GnUBrZMNJtBk7/OXzDHDXjIzoLXHSutwwsLxSNaLxzAaMoDGDd/keZoS+GDBqNVxdCkpuiRW4OSw== - -esbuild-linux-s390x@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.15.tgz#1f7b3c4429c8ca99920ba6bf356ccc5b38fabd34" - integrity sha512-jKaLUg78mua3rrtrkpv4Or2dNTJU7bgHN4bEjT4OX4GR7nLBSA9dfJezQouTxMmIW7opwEC5/iR9mpC18utnxQ== - -esbuild-netbsd-64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.15.tgz#d72c7155686c938c1aff126209b689c22823347c" - integrity sha512-aOvmF/UkjFuW6F36HbIlImJTTx45KUCHJndtKo+KdP8Dhq3mgLRKW9+6Ircpm8bX/RcS3zZMMmaBLkvGY06Gvw== - -esbuild-openbsd-64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.15.tgz#761bd87ecab97386948eaf667a065cb0ecaa0f76" - integrity sha512-HFFX+WYedx1w2yJ1VyR1Dfo8zyYGQZf1cA69bLdrHzu9svj6KH6ZLK0k3A1/LFPhcEY9idSOhsB2UyU0tHPxgQ== - -esbuild-sunos-64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.15.tgz#07e04cbf9747f281a967d09230a158a1be5b530c" - integrity sha512-jOPBudffG4HN8yJXcK9rib/ZTFoTA5pvIKbRrt3IKAGMq1EpBi4xoVoSRrq/0d4OgZLaQbmkHp8RO9eZIn5atA== - -esbuild-windows-32@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.15.tgz#130d1982cc41fb67461e9f8a65c6ebd13a1f35bb" - integrity sha512-MDkJ3QkjnCetKF0fKxCyYNBnOq6dmidcwstBVeMtXSgGYTy8XSwBeIE4+HuKiSsG6I/mXEb++px3IGSmTN0XiA== - -esbuild-windows-64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.15.tgz#638bdf495c109c1882e8b0529cb8e2fea11383fb" - integrity sha512-xaAUIB2qllE888SsMU3j9nrqyLbkqqkpQyWVkfwSil6BBPgcPk3zOFitTTncEKCLTQy3XV9RuH7PDj3aJDljWA== - -esbuild-windows-arm64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.15.tgz#5a277ce10de999d2a6465fc92a8c2a2d207ebd31" - integrity sha512-ttuoCYCIJAFx4UUKKWYnFdrVpoXa3+3WWkXVI6s09U+YjhnyM5h96ewTq/WgQj9LFSIlABQvadHSOQyAVjW5xQ== - -esbuild@^0.15.7: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.15.tgz#503b70bdc18d72d8fc2962ed3ab9219249e58bbe" - integrity sha512-TEw/lwK4Zzld9x3FedV6jy8onOUHqcEX3ADFk4k+gzPUwrxn8nWV62tH0udo8jOtjFodlEfc4ypsqX3e+WWO6w== - optionalDependencies: - "@esbuild/android-arm" "0.15.15" - "@esbuild/linux-loong64" "0.15.15" - esbuild-android-64 "0.15.15" - esbuild-android-arm64 "0.15.15" - esbuild-darwin-64 "0.15.15" - esbuild-darwin-arm64 "0.15.15" - esbuild-freebsd-64 "0.15.15" - esbuild-freebsd-arm64 "0.15.15" - esbuild-linux-32 "0.15.15" - esbuild-linux-64 "0.15.15" - esbuild-linux-arm "0.15.15" - esbuild-linux-arm64 "0.15.15" - esbuild-linux-mips64le "0.15.15" - esbuild-linux-ppc64le "0.15.15" - esbuild-linux-riscv64 "0.15.15" - esbuild-linux-s390x "0.15.15" - esbuild-netbsd-64 "0.15.15" - esbuild-openbsd-64 "0.15.15" - esbuild-sunos-64 "0.15.15" - esbuild-windows-32 "0.15.15" - esbuild-windows-64 "0.15.15" - esbuild-windows-arm64 "0.15.15" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -4124,7 +4155,7 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== @@ -4152,21 +4183,25 @@ escodegen@^1.13.0, escodegen@^1.8.1: source-map "~0.6.1" escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" estraverse "^5.2.0" esutils "^2.0.2" - optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" -"eslint-config-prettier@>= 8.0.0", eslint-config-prettier@^8.3.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" - integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== +"eslint-config-prettier@>= 8.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz#eb25485946dd0c66cd216a46232dc05451518d1f" + integrity sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw== + +eslint-config-prettier@^8.3.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" + integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== eslint-plugin-react-hooks@^4.4.0: version "4.6.0" @@ -4174,14 +4209,15 @@ eslint-plugin-react-hooks@^4.4.0: integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== eslint-plugin-react@^7.28.0, eslint-plugin-react@^7.29.4: - version "7.31.11" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz#011521d2b16dcf95795df688a4770b4eaab364c8" - integrity sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw== + version "7.33.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" + integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== dependencies: array-includes "^3.1.6" array.prototype.flatmap "^1.3.1" array.prototype.tosorted "^1.1.1" doctrine "^2.1.0" + es-iterator-helpers "^1.0.12" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" @@ -4190,106 +4226,84 @@ eslint-plugin-react@^7.28.0, eslint-plugin-react@^7.29.4: object.hasown "^1.1.2" object.values "^1.1.6" prop-types "^15.8.1" - resolve "^2.0.0-next.3" - semver "^6.3.0" + resolve "^2.0.0-next.4" + semver "^6.3.1" string.prototype.matchall "^4.0.8" -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== - -eslint@^8.12.0: - version "8.28.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.28.0.tgz#81a680732634677cc890134bcdd9fdfea8e63d6e" - integrity sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ== - dependencies: - "@eslint/eslintrc" "^1.3.3" - "@humanwhocodes/config-array" "^0.11.6" +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.50.0: + version "8.50.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.50.0.tgz#2ae6015fee0240fcd3f83e1e25df0287f487d6b2" + integrity sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.2" + "@eslint/js" "8.50.0" + "@humanwhocodes/config-array" "^0.11.11" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" + ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.3.0" - espree "^9.4.0" - esquery "^1.4.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" find-up "^5.0.0" glob-parent "^6.0.2" - globals "^13.15.0" - grapheme-splitter "^1.0.4" + globals "^13.19.0" + graphemer "^1.4.0" ignore "^5.2.0" - import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" - js-sdsl "^4.1.4" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.9.1" - regexpp "^3.2.0" + optionator "^0.9.3" strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" text-table "^0.2.0" -espree@^9.0.0, espree@^9.4.0: - version "9.4.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" - integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== +espree@^9.0.0, espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: - acorn "^8.8.0" + acorn "^8.9.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.1" esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" @@ -4300,7 +4314,7 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -4380,16 +4394,21 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expect@^29.0.0, expect@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.3.1.tgz#92877aad3f7deefc2e3f6430dd195b92295554a6" - integrity sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA== +expect@^29.0.0, expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== dependencies: - "@jest/expect-utils" "^29.3.1" - jest-get-type "^29.2.0" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-util "^29.3.1" + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + +exponential-backoff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" + integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== express@^4.16.4: version "4.18.2" @@ -4458,9 +4477,9 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -4491,9 +4510,9 @@ fast-url-parser@^1.1.3: punycode "^1.3.2" fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" @@ -4588,9 +4607,9 @@ find-up@^5.0.0: path-exists "^4.0.0" firebase-tools@^11.0.1: - version "11.16.1" - resolved "https://registry.yarnpkg.com/firebase-tools/-/firebase-tools-11.16.1.tgz#71e405e6b440fb3beab2bb9748acb9d6caab9976" - integrity sha512-vi8NRUeeBXy7Be+Hk7DK0+ClF+snhjYa5s3fwPRYCGXbCX47E+jreahS6jXJIxeqMbHPmhPZrJXsy7Tdp1Ryug== + version "11.30.0" + resolved "https://registry.yarnpkg.com/firebase-tools/-/firebase-tools-11.30.0.tgz#37caa55f43f6bd2cc1868c4982266dd50db6781c" + integrity sha512-rNMhtsFKy35AZqfy0obY2Kgsfmg8N1duEx2UDT14NsMHB7xt2Z7cUd92bkAoQAfD0jAOd7LhRT/7E6J5yB+kGw== dependencies: "@google-cloud/pubsub" "^3.0.1" abort-controller "^3.0.0" @@ -4618,7 +4637,7 @@ firebase-tools@^11.0.1: google-auth-library "^7.11.0" inquirer "^8.2.0" js-yaml "^3.13.1" - jsonwebtoken "^8.5.1" + jsonwebtoken "^9.0.0" leven "^3.1.0" libsodium-wrappers "^0.7.10" lodash "^4.17.21" @@ -4630,6 +4649,7 @@ firebase-tools@^11.0.1: node-fetch "^2.6.7" open "^6.3.0" ora "^5.4.1" + p-limit "^3.0.1" portfinder "^1.0.32" progress "^2.0.3" proxy-agent "^5.0.0" @@ -4640,33 +4660,31 @@ firebase-tools@^11.0.1: stream-chain "^2.2.4" stream-json "^1.7.3" strip-ansi "^6.0.1" - superstatic "^8.0.0" + superstatic "^9.0.3" tar "^6.1.11" tcp-port-used "^1.0.2" tmp "^0.2.1" triple-beam "^1.3.0" universal-analytics "^0.5.3" - unzipper "^0.10.10" - update-notifier "^5.1.0" + update-notifier-cjs "^5.1.6" uuid "^8.3.2" winston "^3.0.0" winston-transport "^4.4.0" ws "^7.2.3" - optionalDependencies: - esbuild "^0.15.7" flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + version "3.1.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" + integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== dependencies: - flatted "^3.1.0" + flatted "^3.2.7" + keyv "^4.5.3" rimraf "^3.0.2" -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +flatted@^3.2.7: + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== fn.name@1.x.x: version "1.1.0" @@ -4680,6 +4698,14 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -4736,32 +4762,29 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-minipass@^2.0.0, fs-minipass@^2.1.0: +fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== dependencies: minipass "^3.0.0" +fs-minipass@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" + integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== + dependencies: + minipass "^7.0.3" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -fstream@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" - integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== ftp@^0.3.10: version "0.3.10" @@ -4776,17 +4799,17 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" -functions-have-names@^1.2.2: +functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -4817,14 +4840,14 @@ gaxios@^4.0.0: node-fetch "^2.6.7" gaxios@^5.0.0, gaxios@^5.0.1: - version "5.0.2" - resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-5.0.2.tgz#ca3a40e851c728d31d7001c2357062d46bf966d1" - integrity sha512-TjtV2AJOZoMQqRYoy5eM8cCQogYwazWNYLQ72QB0kwa6vHHruYkGmhhyrlzbmgNHK1dNnuP2WSH81urfzyN2Og== + version "5.1.3" + resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-5.1.3.tgz#f7fa92da0fe197c846441e5ead2573d4979e9013" + integrity sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA== dependencies: extend "^3.0.2" https-proxy-agent "^5.0.0" is-stream "^2.0.0" - node-fetch "^2.6.7" + node-fetch "^2.6.9" gcp-metadata@^4.2.0: version "4.3.1" @@ -4834,10 +4857,10 @@ gcp-metadata@^4.2.0: gaxios "^4.0.0" json-bigint "^1.0.0" -gcp-metadata@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-5.0.1.tgz#8d1e785ee7fad554bc2a80c1f930c9a9518d2b00" - integrity sha512-jiRJ+Fk7e8FH68Z6TLaqwea307OktJpDjmYnU7/li6ziwvVvU2RlrCyQo5vkdeP94chm0kcSCOOszvmuaioq3g== +gcp-metadata@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-5.3.0.tgz#6f45eb473d0cb47d15001476b48b663744d25408" + integrity sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w== dependencies: gaxios "^5.0.0" json-bigint "^1.0.0" @@ -4852,13 +4875,14 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== dependencies: function-bind "^1.1.1" has "^1.0.3" + has-proto "^1.0.1" has-symbols "^1.0.3" get-package-type@^0.1.0: @@ -4866,20 +4890,6 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - get-stream@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" @@ -4950,6 +4960,17 @@ glob-slasher@^1.0.1: lodash.isobject "^2.4.1" toxic "^1.0.0" +glob@^10.2.2: + version "10.3.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.5.tgz#4c0e46b5bccd78ac42b06a7eaaeb9ee34062968e" + integrity sha512-bYUpUD7XDEHI4Q2O5a7PXGvyw4deKR70kHiDxzQbe925wbZknhOzUt2xBgTkYL6RBcVeXYuD9iNYeqoWbBZQnA== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.0.3" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + glob@^5.0.3: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -4961,7 +4982,7 @@ glob@^5.0.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: +glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.2.3: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -4973,10 +4994,10 @@ glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.0, glob@^8.0.1: - version "8.0.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" - integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== +glob@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -4984,13 +5005,6 @@ glob@^8.0.0, glob@^8.0.1: minimatch "^5.0.1" once "^1.3.0" -global-dirs@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.1.0.tgz#e9046a49c806ff04d6c1825e196c8f0091e8df4d" - integrity sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ== - dependencies: - ini "1.3.7" - global-dirs@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" @@ -5003,13 +5017,20 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.15.0: - version "13.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.18.0.tgz#fb224daeeb2bb7d254cd2c640f003528b8d0c1dc" - integrity sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A== +globals@^13.19.0: + version "13.22.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.22.0.tgz#0c9fcb9c48a2494fbb5edbfee644285543eba9d8" + integrity sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw== dependencies: type-fest "^0.20.2" +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -5038,28 +5059,29 @@ google-auth-library@^7.11.0: lru-cache "^6.0.0" google-auth-library@^8.0.2: - version "8.7.0" - resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-8.7.0.tgz#e36e255baba4755ce38dded4c50f896cf8515e51" - integrity sha512-1M0NG5VDIvJZEnstHbRdckLZESoJwguinwN8Dhae0j2ZKIQFIV63zxm6Fo6nM4xkgqUr2bbMtV5Dgo+Hy6oo0Q== + version "8.9.0" + resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-8.9.0.tgz#15a271eb2ec35d43b81deb72211bd61b1ef14dd0" + integrity sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg== dependencies: arrify "^2.0.0" base64-js "^1.3.0" ecdsa-sig-formatter "^1.0.11" fast-text-encoding "^1.0.0" gaxios "^5.0.0" - gcp-metadata "^5.0.0" + gcp-metadata "^5.3.0" gtoken "^6.1.0" jws "^4.0.0" lru-cache "^6.0.0" -google-gax@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/google-gax/-/google-gax-3.5.2.tgz#7c3ad61dbf366a55527b803caead276668b160d8" - integrity sha512-AyP53w0gHcWlzxm+jSgqCR3Xu4Ld7EpSjhtNBnNhzwwWaIUyphH9kBGNIEH+i4UGkTUXOY29K/Re8EiAvkBRGw== +google-gax@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/google-gax/-/google-gax-3.6.1.tgz#02c78fc496f5adf86f2ca9145545f4b6575f6118" + integrity sha512-g/lcUjGcB6DSw2HxgEmCDOrI/CByOwqRvsuUvNalHUK2iPPPlmAIpbMbl62u0YufGMr8zgE3JL7th6dCb1Ry+w== dependencies: - "@grpc/grpc-js" "~1.7.0" + "@grpc/grpc-js" "~1.8.0" "@grpc/proto-loader" "^0.7.0" "@types/long" "^4.0.0" + "@types/rimraf" "^3.0.2" abort-controller "^3.0.0" duplexify "^4.0.0" fast-text-encoding "^1.0.3" @@ -5068,8 +5090,8 @@ google-gax@^3.5.2: node-fetch "^2.6.1" object-hash "^3.0.0" proto3-json-serializer "^1.0.0" - protobufjs "7.1.2" - protobufjs-cli "1.0.2" + protobufjs "7.2.4" + protobufjs-cli "1.1.1" retry-request "^5.0.0" google-p12-pem@^3.1.3: @@ -5093,23 +5115,6 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -got@^9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - "graceful-fs@2 || 3": version "3.0.12" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.12.tgz#0034947ce9ed695ec8ab0b854bc919e82b1ffaef" @@ -5117,15 +5122,20 @@ got@^9.6.0: dependencies: natives "^1.1.3" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@4.2.10: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== gtoken@^5.0.4: version "5.3.2" @@ -5170,13 +5180,6 @@ has-ansi@^0.1.0: dependencies: ansi-regex "^0.2.0" -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== - dependencies: - ansi-regex "^2.0.0" - has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" @@ -5199,7 +5202,12 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" -has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== @@ -5229,9 +5237,9 @@ has@^1.0.3: function-bind "^1.1.1" heap-js@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/heap-js/-/heap-js-2.2.0.tgz#f4418874cd2aedc2cf3a7492d579afe23b627c5d" - integrity sha512-G3uM72G9F/zo9Hph/T7m4ZZVlVu5bx2f5CiCS78TBHz2mNIXnB5KRdEEYssXZJ7ldLDqID29bZ1D5ezCKQD2Zw== + version "2.3.0" + resolved "https://registry.yarnpkg.com/heap-js/-/heap-js-2.3.0.tgz#8eed2cede31ec312aa696eef1d4df0565841f183" + integrity sha512-E5303mzwQ+4j/n2J0rDvEPBN7GKjhis10oHiYOgjxsmxYgqG++hz9NyLLOXttzH8as/DyiBHYpUrJTZWYaMo8Q== hoist-non-react-statics@^3.3.1: version "3.3.2" @@ -5259,10 +5267,10 @@ html-parse-stringify@^3.0.1: dependencies: void-elements "3.1.0" -http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== +http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http-errors@2.0.0: version "2.0.0" @@ -5329,12 +5337,12 @@ i18next-browser-languagedetector@^6.1.0: dependencies: "@babel/runtime" "^7.19.0" -i18next@^20.3.1: - version "20.6.1" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-20.6.1.tgz#535e5f6e5baeb685c7d25df70db63bf3cc0aa345" - integrity sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A== +i18next@^23.2.6: + version "23.5.1" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.5.1.tgz#7f7c35ffaa907618d9489f106d5006b09fbca3d3" + integrity sha512-JelYzcaCoFDaa+Ysbfz2JsGAKkrHiMG6S61+HLBUEIPaF40WMwW9hCPymlQGrP+wWawKxKPuSuD71WZscCsWHg== dependencies: - "@babel/runtime" "^7.12.0" + "@babel/runtime" "^7.22.5" iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" @@ -5362,12 +5370,12 @@ ieee754@^1.1.13: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== +ignore@^5.2.0, ignore@^5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== -import-fresh@^3.0.0, import-fresh@^3.2.1: +import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -5398,11 +5406,6 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -5411,30 +5414,25 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" - integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== - ini@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== -ini@~1.3.0: +ini@^1.3.4, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== inquirer@^8.2.0: - version "8.2.5" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" - integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== + version "8.2.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" + integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== dependencies: ansi-escapes "^4.2.1" chalk "^4.1.1" @@ -5450,19 +5448,19 @@ inquirer@^8.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" through "^2.3.6" - wrap-ansi "^7.0.0" + wrap-ansi "^6.0.1" -install-artifact-from-github@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/install-artifact-from-github/-/install-artifact-from-github-1.3.1.tgz#eefaad9af35d632e5d912ad1569c1de38c3c2462" - integrity sha512-3l3Bymg2eKDsN5wQuMfgGEj2x6l5MCAv0zPL6rxHESufFVlEAKW/6oY9F1aGgvY/EgWm5+eWGRjINveL4X7Hgg== +install-artifact-from-github@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/install-artifact-from-github/-/install-artifact-from-github-1.3.3.tgz#57d89bacfa0f47d7307fe41b6247cda9f9a8079c" + integrity sha512-x79SL0d8WOi1ZjXSTUqqs0GPQZ92YArJAN9O46wgU9wdH2U9ecyyhB9YGDbPe2OLV4ptmt6AZYRQZ2GydQZosQ== -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== +internal-slot@^1.0.4, internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== dependencies: - get-intrinsic "^1.1.0" + get-intrinsic "^1.2.0" has "^1.0.3" side-channel "^1.0.4" @@ -5486,7 +5484,7 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-arguments@^1.1.0, is-arguments@^1.1.1: +is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== @@ -5494,6 +5492,15 @@ is-arguments@^1.1.0, is-arguments@^1.1.1: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -5504,6 +5511,13 @@ is-arrayish@^0.3.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -5538,10 +5552,10 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== +is-core-module@^2.13.0, is-core-module@^2.9.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== dependencies: has "^1.0.3" @@ -5557,6 +5571,13 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -5567,6 +5588,13 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -5574,14 +5602,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-installed-globally@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" - integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== - dependencies: - global-dirs "^2.0.1" - is-path-inside "^3.0.1" - is-installed-globally@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" @@ -5610,11 +5630,6 @@ is-negative-zero@^2.0.2: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== -is-npm@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" - integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== - is-npm@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" @@ -5637,7 +5652,7 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== -is-path-inside@^3.0.1, is-path-inside@^3.0.2, is-path-inside@^3.0.3: +is-path-inside@^3.0.2, is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== @@ -5691,16 +5706,12 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" + which-typed-array "^1.1.11" is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" @@ -5776,6 +5787,14 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isomorphic-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4" + integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA== + dependencies: + node-fetch "^2.6.1" + whatwg-fetch "^3.4.1" + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -5786,7 +5805,7 @@ istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: +istanbul-lib-instrument@^5.0.4: version "5.2.1" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== @@ -5797,13 +5816,24 @@ istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: istanbul-lib-coverage "^3.2.0" semver "^6.3.0" +istanbul-lib-instrument@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz#7a8af094cbfff1d5bb280f62ce043695ae8dd5b8" + integrity sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" + make-dir "^4.0.0" supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: @@ -5816,89 +5846,110 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + version "3.1.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.2.0.tgz#b6598daa9803ea6a4dce7968e20ab380ddbee289" - integrity sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA== +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + +jackspeak@^2.0.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.3.tgz#95e4cbcc03b3eb357bf6bcce14a903fb3d1151e1" + integrity sha512-R2bUw+kVZFS/h1AZqBKrSgDmdmjApzgY0AlCPumopFiAlbUxE2gf+SCuBzQ0cP5hHmUmFYF5yw55T97Th5Kstg== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== dependencies: execa "^5.0.0" + jest-util "^29.7.0" p-limit "^3.1.0" -jest-circus@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.3.1.tgz#177d07c5c0beae8ef2937a67de68f1e17bbf1b4a" - integrity sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg== +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== dependencies: - "@jest/environment" "^29.3.1" - "@jest/expect" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" - dedent "^0.7.0" + dedent "^1.0.0" is-generator-fn "^2.0.0" - jest-each "^29.3.1" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-runtime "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" p-limit "^3.1.0" - pretty-format "^29.3.1" + pretty-format "^29.7.0" + pure-rand "^6.0.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-cli@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.3.1.tgz#e89dff427db3b1df50cea9a393ebd8640790416d" - integrity sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ== +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== dependencies: - "@jest/core" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" chalk "^4.0.0" + create-jest "^29.7.0" exit "^0.1.2" - graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" - prompts "^2.0.1" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" yargs "^17.3.1" -jest-config@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.3.1.tgz#0bc3dcb0959ff8662957f1259947aedaefb7f3c6" - integrity sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg== +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.3.1" - "@jest/types" "^29.3.1" - babel-jest "^29.3.1" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^29.3.1" - jest-environment-node "^29.3.1" - jest-get-type "^29.2.0" - jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-runner "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^29.3.1" + pretty-format "^29.7.0" slash "^3.0.0" strip-json-comments "^3.1.1" @@ -5912,69 +5963,69 @@ jest-diff@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-diff@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.3.1.tgz#d8215b72fed8f1e647aed2cae6c752a89e757527" - integrity sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw== +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== dependencies: chalk "^4.0.0" - diff-sequences "^29.3.1" - jest-get-type "^29.2.0" - pretty-format "^29.3.1" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" -jest-docblock@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.2.0.tgz#307203e20b637d97cee04809efc1d43afc641e82" - integrity sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A== +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== dependencies: detect-newline "^3.0.0" -jest-each@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.3.1.tgz#bc375c8734f1bb96625d83d1ca03ef508379e132" - integrity sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA== +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.6.3" chalk "^4.0.0" - jest-get-type "^29.2.0" - jest-util "^29.3.1" - pretty-format "^29.3.1" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" jest-environment-jsdom@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.3.1.tgz#14ca63c3e0ef5c63c5bcb46033e50bc649e3b639" - integrity sha512-G46nKgiez2Gy4zvYNhayfMEAFlVHhWfncqvqS6yCd0i+a4NsSUD2WtrKSaYQrYiLQaupHXxCRi8xxVL2M9PbhA== + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz#d206fa3551933c3fd519e5dfdb58a0f5139a837f" + integrity sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA== dependencies: - "@jest/environment" "^29.3.1" - "@jest/fake-timers" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" "@types/jsdom" "^20.0.0" "@types/node" "*" - jest-mock "^29.3.1" - jest-util "^29.3.1" + jest-mock "^29.7.0" + jest-util "^29.7.0" jsdom "^20.0.0" -jest-environment-node@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.3.1.tgz#5023b32472b3fba91db5c799a0d5624ad4803e74" - integrity sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag== +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== dependencies: - "@jest/environment" "^29.3.1" - "@jest/fake-timers" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-mock "^29.3.1" - jest-util "^29.3.1" + jest-mock "^29.7.0" + jest-util "^29.7.0" jest-get-type@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== -jest-get-type@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.2.0.tgz#726646f927ef61d583a3b3adb1ab13f3a5036408" - integrity sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA== +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== jest-haste-map@^28.1.3: version "28.1.3" @@ -5995,32 +6046,32 @@ jest-haste-map@^28.1.3: optionalDependencies: fsevents "^2.3.2" -jest-haste-map@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.3.1.tgz#af83b4347f1dae5ee8c2fb57368dc0bb3e5af843" - integrity sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A== +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.6.3" "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.9" - jest-regex-util "^29.2.0" - jest-util "^29.3.1" - jest-worker "^29.3.1" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" micromatch "^4.0.4" walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" -jest-leak-detector@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz#95336d020170671db0ee166b75cd8ef647265518" - integrity sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA== +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== dependencies: - jest-get-type "^29.2.0" - pretty-format "^29.3.1" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" jest-matcher-utils@^27.0.0: version "27.5.1" @@ -6032,39 +6083,39 @@ jest-matcher-utils@^27.0.0: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-matcher-utils@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz#6e7f53512f80e817dfa148672bd2d5d04914a572" - integrity sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ== +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== dependencies: chalk "^4.0.0" - jest-diff "^29.3.1" - jest-get-type "^29.2.0" - pretty-format "^29.3.1" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" -jest-message-util@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.3.1.tgz#37bc5c468dfe5120712053dd03faf0f053bd6adb" - integrity sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA== +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.3.1" + "@jest/types" "^29.6.3" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.3.1" + pretty-format "^29.7.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.3.1.tgz#60287d92e5010979d01f218c6b215b688e0f313e" - integrity sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA== +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-util "^29.3.1" + jest-util "^29.7.0" jest-pnp-resolver@^1.2.2: version "1.2.3" @@ -6076,118 +6127,114 @@ jest-regex-util@^28.0.2: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== -jest-regex-util@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.2.0.tgz#82ef3b587e8c303357728d0322d48bbfd2971f7b" - integrity sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA== +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== -jest-resolve-dependencies@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz#a6a329708a128e68d67c49f38678a4a4a914c3bf" - integrity sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA== +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== dependencies: - jest-regex-util "^29.2.0" - jest-snapshot "^29.3.1" + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" -jest-resolve@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.3.1.tgz#9a4b6b65387a3141e4a40815535c7f196f1a68a7" - integrity sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw== +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" + jest-haste-map "^29.7.0" jest-pnp-resolver "^1.2.2" - jest-util "^29.3.1" - jest-validate "^29.3.1" + jest-util "^29.7.0" + jest-validate "^29.7.0" resolve "^1.20.0" - resolve.exports "^1.1.0" + resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.3.1.tgz#a92a879a47dd096fea46bb1517b0a99418ee9e2d" - integrity sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA== +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== dependencies: - "@jest/console" "^29.3.1" - "@jest/environment" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" emittery "^0.13.1" graceful-fs "^4.2.9" - jest-docblock "^29.2.0" - jest-environment-node "^29.3.1" - jest-haste-map "^29.3.1" - jest-leak-detector "^29.3.1" - jest-message-util "^29.3.1" - jest-resolve "^29.3.1" - jest-runtime "^29.3.1" - jest-util "^29.3.1" - jest-watcher "^29.3.1" - jest-worker "^29.3.1" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" p-limit "^3.1.0" source-map-support "0.5.13" -jest-runtime@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.3.1.tgz#21efccb1a66911d6d8591276a6182f520b86737a" - integrity sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A== - dependencies: - "@jest/environment" "^29.3.1" - "@jest/fake-timers" "^29.3.1" - "@jest/globals" "^29.3.1" - "@jest/source-map" "^29.2.0" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" glob "^7.1.3" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" - jest-message-util "^29.3.1" - jest-mock "^29.3.1" - jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" slash "^3.0.0" strip-bom "^4.0.0" -jest-snapshot@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.3.1.tgz#17bcef71a453adc059a18a32ccbd594b8cc4e45e" - integrity sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA== +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" "@babel/plugin-syntax-jsx" "^7.7.2" "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" - "@types/babel__traverse" "^7.0.6" - "@types/prettier" "^2.1.5" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^29.3.1" + expect "^29.7.0" graceful-fs "^4.2.9" - jest-diff "^29.3.1" - jest-get-type "^29.2.0" - jest-haste-map "^29.3.1" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-util "^29.3.1" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" natural-compare "^1.4.0" - pretty-format "^29.3.1" - semver "^7.3.5" + pretty-format "^29.7.0" + semver "^7.5.3" jest-util@^28.1.3: version "28.1.3" @@ -6201,42 +6248,42 @@ jest-util@^28.1.3: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-util@^29.0.0, jest-util@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.3.1.tgz#1dda51e378bbcb7e3bc9d8ab651445591ed373e1" - integrity sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ== +jest-util@^29.0.0, jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.3.1.tgz#d56fefaa2e7d1fde3ecdc973c7f7f8f25eea704a" - integrity sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g== +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.6.3" camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^29.2.0" + jest-get-type "^29.6.3" leven "^3.1.0" - pretty-format "^29.3.1" + pretty-format "^29.7.0" -jest-watcher@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.3.1.tgz#3341547e14fe3c0f79f9c3a4c62dbc3fc977fd4a" - integrity sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg== +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== dependencies: - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" emittery "^0.13.1" - jest-util "^29.3.1" + jest-util "^29.7.0" string-length "^4.0.1" jest-worker@^28.1.3: @@ -6248,25 +6295,25 @@ jest-worker@^28.1.3: merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.3.1.tgz#e9462161017a9bb176380d721cab022661da3d6b" - integrity sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw== +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: "@types/node" "*" - jest-util "^29.3.1" + jest-util "^29.7.0" merge-stream "^2.0.0" supports-color "^8.0.0" jest@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.3.1.tgz#c130c0d551ae6b5459b8963747fed392ddbde122" - integrity sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA== + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== dependencies: - "@jest/core" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" import-local "^3.0.2" - jest-cli "^29.3.1" + jest-cli "^29.7.0" jju@^1.1.0: version "1.4.0" @@ -6287,11 +6334,6 @@ jquery-extend@~2.0.3: resolved "https://registry.yarnpkg.com/jquery-extend/-/jquery-extend-2.0.3.tgz#6815cdb01a866ddba30e6f4d0fc5fb6679272735" integrity sha512-ysLU6/m8VLckIjAudiE+s7YAoYwklZy5Ft9kqO7FPkqaQrd3wUMuZ134G3uniysW8VZME/pGa2LcynsM4TjP5Q== -js-sdsl@^4.1.4: - version "4.2.0" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.2.0.tgz#278e98b7bea589b8baaf048c20aeb19eb7ad09d0" - integrity sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -6324,12 +6366,13 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== -jsdoc@^3.6.3: - version "3.6.11" - resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.6.11.tgz#8bbb5747e6f579f141a5238cbad4e95e004458ce" - integrity sha512-8UCU0TYeIYD9KeLzEcAu2q8N/mx9O3phAGl32nmHlE0LpaJL71mMkP4d+QE5zWfNt50qheHtOZ0qoxVrsX5TUg== +jsdoc@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-4.0.2.tgz#a1273beba964cf433ddf7a70c23fd02c3c60296e" + integrity sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg== dependencies: - "@babel/parser" "^7.9.4" + "@babel/parser" "^7.20.15" + "@jsdoc/salty" "^0.2.1" "@types/markdown-it" "^12.2.3" bluebird "^3.7.2" catharsis "^0.9.0" @@ -6342,7 +6385,6 @@ jsdoc@^3.6.3: mkdirp "^1.0.4" requizzle "^0.2.3" strip-json-comments "^3.1.0" - taffydb "2.6.2" underscore "~1.13.2" jsdom@^20.0.0: @@ -6394,10 +6436,10 @@ json-bigint@^1.0.0: dependencies: bignumber.js "^9.0.0" -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-parse-even-better-errors@^2.3.0: version "2.3.1" @@ -6441,10 +6483,10 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^4.0.0: version "4.0.0" @@ -6462,10 +6504,10 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsonwebtoken@^8.5.1: - version "8.5.1" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" - integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== +jsonwebtoken@^9.0.0: + version "9.0.2" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3" + integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== dependencies: jws "^3.2.2" lodash.includes "^4.3.0" @@ -6476,7 +6518,7 @@ jsonwebtoken@^8.5.1: lodash.isstring "^4.0.1" lodash.once "^4.0.0" ms "^2.1.1" - semver "^5.6.0" + semver "^7.5.4" jsprim@^1.2.2: version "1.4.2" @@ -6489,12 +6531,14 @@ jsprim@^1.2.2: verror "1.10.0" "jsx-ast-utils@^2.4.1 || ^3.0.0": - version "3.3.3" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" - integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== dependencies: - array-includes "^3.1.5" - object.assign "^4.1.3" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" jwa@^1.4.1: version "1.4.1" @@ -6530,12 +6574,12 @@ jws@^4.0.0: jwa "^2.0.0" safe-buffer "^5.0.1" -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== +keyv@^4.5.3: + version "4.5.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" + integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== dependencies: - json-buffer "3.0.0" + json-buffer "3.0.1" klaw@^3.0.0: version "3.0.0" @@ -6554,13 +6598,6 @@ kuler@^2.0.0: resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== -latest-version@^5.0.0, latest-version@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" - integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== - dependencies: - package-json "^6.3.0" - lazystream@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638" @@ -6590,16 +6627,16 @@ levn@~0.3.0: type-check "~0.3.2" libsodium-wrappers@^0.7.10: - version "0.7.10" - resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz#13ced44cacb0fc44d6ac9ce67d725956089ce733" - integrity sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg== + version "0.7.13" + resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.13.tgz#83299e06ee1466057ba0e64e532777d2929b90d3" + integrity sha512-kasvDsEi/r1fMzKouIDv7B8I6vNmknXwGiYodErGuESoFTohGSKZplFtVxZqHaoQ217AynyIFgnOVRitpHs0Qw== dependencies: - libsodium "^0.7.0" + libsodium "^0.7.13" -libsodium@^0.7.0: - version "0.7.10" - resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.10.tgz#c2429a7e4c0836f879d701fec2c8a208af024159" - integrity sha512-eY+z7hDrDKxkAK+QKZVNv92A5KYkxfvIshtBJkmg5TSiCnYqZP3i9OO9whE79Pwgm4jGaoHgkM4ao/b9Cyu4zQ== +libsodium@^0.7.13: + version "0.7.13" + resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.13.tgz#230712ec0b7447c57b39489c48a4af01985fb393" + integrity sha512-mK8ju0fnrKXXfleL53vtp9xiPq5hKM0zbDQtcxQIsSmxNgSxqCj6R7Hl9PkrNe2j29T4yoDaF7DJLK9/i5iWUw== "license-checker@git+https://github.com/mwittig/license-checker#d546e3f738e14c62e732346fa355162d46700893": version "1.0.0" @@ -6623,11 +6660,6 @@ linkify-it@^3.0.1: dependencies: uc.micro "^1.0.1" -listenercount@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" - integrity sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ== - locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -6748,25 +6780,21 @@ log-symbols@^4.1.0: is-unicode-supported "^0.1.0" logform@^2.3.2, logform@^2.4.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.4.2.tgz#a617983ac0334d0c3b942c34945380062795b47c" - integrity sha512-W4c9himeAwXEdZ05dQNerhFz2XG80P9Oj0loPUMV23VC2it0orMHQhJm4hdnnor3rd1HsGf6a2lPwBM1zeXHGw== + version "2.5.1" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.5.1.tgz#44c77c34becd71b3a42a3970c77929e52c6ed48b" + integrity sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg== dependencies: "@colors/colors" "1.5.0" + "@types/triple-beam" "^1.3.2" fecha "^4.2.0" ms "^2.1.1" safe-stable-stringify "^2.3.1" triple-beam "^1.3.0" -long@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - long@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.1.tgz#e27595d0083d103d2fa2c20c7699f8e0c92b897f" - integrity sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A== + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" @@ -6775,16 +6803,6 @@ loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -6800,14 +6818,19 @@ lru-cache@^6.0.0: yallist "^4.0.0" lru-cache@^7.7.1: - version "7.14.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.14.1.tgz#8da8d2f5f59827edb388e63e459ac23d6d408fea" - integrity sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA== + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== -lz-string@^1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" - integrity sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ== +"lru-cache@^9.1.1 || ^10.0.0": + version "10.0.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a" + integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g== + +lz-string@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== make-dir@^3.0.0: version "3.1.0" @@ -6816,32 +6839,38 @@ make-dir@^3.0.0: dependencies: semver "^6.0.0" +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + make-error@1.x: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -make-fetch-happen@^10.0.3: - version "10.2.1" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" - integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== +make-fetch-happen@^11.0.3: + version "11.1.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" + integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== dependencies: agentkeepalive "^4.2.1" - cacache "^16.1.0" - http-cache-semantics "^4.1.0" + cacache "^17.0.0" + http-cache-semantics "^4.1.1" http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" is-lambda "^1.0.1" lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" - minipass-fetch "^2.0.3" + minipass "^5.0.0" + minipass-fetch "^3.0.0" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" negotiator "^0.6.3" promise-retry "^2.0.1" socks-proxy-agent "^7.0.0" - ssri "^9.0.0" + ssri "^10.0.0" makeerror@1.0.12: version "1.0.12" @@ -6851,9 +6880,9 @@ makeerror@1.0.12: tmpl "1.0.5" markdown-it-anchor@^8.4.1: - version "8.6.5" - resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.5.tgz#30c4bc5bbff327f15ce3c429010ec7ba75e7b5f8" - integrity sha512-PI1qEHHkTNWT+X6Ip9w+paonfIQ+QZP9sCeMYi47oqhH+EsW8CrJ8J7CzV19QVOj6il8ATGbK2nTECj22ZHGvQ== + version "8.6.7" + resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz#ee6926daf3ad1ed5e4e3968b1740eef1c6399634" + integrity sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA== markdown-it@^12.3.2: version "12.3.2" @@ -6867,21 +6896,21 @@ markdown-it@^12.3.2: uc.micro "^1.0.5" marked-terminal@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-5.1.1.tgz#d2edc2991841d893ee943b44b40b2ee9518b4d9f" - integrity sha512-+cKTOx9P4l7HwINYhzbrBSyzgxO2HaHKGZGuB1orZsMIgXYaJyfidT81VXRdpelW/PcHEWxywscePVgI/oUF6g== + version "5.2.0" + resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-5.2.0.tgz#c5370ec2bae24fb2b34e147b731c94fa933559d3" + integrity sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA== dependencies: - ansi-escapes "^5.0.0" + ansi-escapes "^6.2.0" cardinal "^2.1.1" - chalk "^5.0.0" - cli-table3 "^0.6.1" + chalk "^5.2.0" + cli-table3 "^0.6.3" node-emoji "^1.11.0" - supports-hyperlinks "^2.2.0" + supports-hyperlinks "^2.3.0" marked@^4.0.10, marked@^4.0.14: - version "4.2.3" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.3.tgz#bd76a5eb510ff1d8421bc6c3b2f0b93488c15bea" - integrity sha512-slWRdJkbTZ+PjkyJnE30Uid64eHwbwa1Q25INCAYfZlK4o6ylagBy/Le9eWntqJFoFT93ikUKMv47GZ4gTwHkw== + version "4.3.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" + integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== mdurl@^1.0.1: version "1.0.1" @@ -6926,7 +6955,7 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@^2.1.35, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -6948,11 +6977,6 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-response@^1.0.0, mimic-response@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -6966,16 +6990,30 @@ min-indent@^1.0.0: brace-expansion "^1.1.7" minimatch@^5.0.1, minimatch@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" - integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^6.1.6: + version "6.2.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-6.2.0.tgz#2b70fd13294178c69c04dfc05aebdb97a4e79e42" + integrity sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== dependencies: brace-expansion "^2.0.1" minimist@^1.2.0, minimist@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minipass-collect@^1.0.2: version "1.0.2" @@ -6984,12 +7022,12 @@ minipass-collect@^1.0.2: dependencies: minipass "^3.0.0" -minipass-fetch@^2.0.3: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" - integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== +minipass-fetch@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.4.tgz#4d4d9b9f34053af6c6e597a64be8e66e42bf45b7" + integrity sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg== dependencies: - minipass "^3.1.6" + minipass "^7.0.3" minipass-sized "^1.0.3" minizlib "^2.1.2" optionalDependencies: @@ -7016,13 +7054,23 @@ minipass-sized@^1.0.3: dependencies: minipass "^3.0.0" -minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: - version "3.3.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae" - integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw== +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.3.tgz#05ea638da44e475037ed94d1c7efcc76a25e1974" + integrity sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg== + minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" @@ -7031,18 +7079,18 @@ minizlib@^2.1.1, minizlib@^2.1.2: minipass "^3.0.0" yallist "^4.0.0" -"mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@^0.5.6: +mkdirp@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" + integrity sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg== + +mkdirp@^0.5.1, mkdirp@^0.5.6: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" -mkdirp@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" - integrity sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg== - mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" @@ -7079,21 +7127,16 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -nan@^2.16.0: - version "2.17.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" - integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== +nan@^2.17.0: + version "2.18.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" + integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== natives@^1.1.3: version "1.1.6" resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.6.tgz#a603b4a498ab77173612b9ea1acdec4d980f00bb" integrity sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA== -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -7121,10 +7164,10 @@ node-emoji@^1.11.0: dependencies: lodash "^4.17.21" -node-fetch@^2.6.1, node-fetch@^2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== +node-fetch@^2.6.1, node-fetch@^2.6.7, node-fetch@^2.6.9: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" @@ -7133,15 +7176,16 @@ node-forge@^1.3.1: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== -node-gyp@^9.0.0: - version "9.3.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.3.0.tgz#f8eefe77f0ad8edb3b3b898409b53e697642b319" - integrity sha512-A6rJWfXFz7TQNjpldJ915WFb1LnhO4lIve3ANPbWreuEoLoKlFT3sxIepPBkLhM27crW8YmN+pjlgbasH6cH/Q== +node-gyp@^9.4.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.0.tgz#2a7a91c7cba4eccfd95e949369f27c9ba704f369" + integrity sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg== dependencies: env-paths "^2.2.0" + exponential-backoff "^3.1.1" glob "^7.1.4" graceful-fs "^4.2.6" - make-fetch-happen "^10.0.3" + make-fetch-happen "^11.0.3" nopt "^6.0.0" npmlog "^6.0.0" rimraf "^3.0.2" @@ -7154,10 +7198,10 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== nopt-defaults@^0.0.1: version "0.0.1" @@ -7204,11 +7248,6 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-url@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - npm-license-crawler@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/npm-license-crawler/-/npm-license-crawler-0.2.1.tgz#a76a82e0a0407e2032c03dc5b1d518cf9eac9e1d" @@ -7242,9 +7281,9 @@ npmlog@^6.0.0: set-blocking "^2.0.0" nwsapi@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" - integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== oauth-sign@~0.9.0: version "0.9.0" @@ -7261,10 +7300,10 @@ object-hash@^3.0.0: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== -object-inspect@^1.12.2, object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== object-is@^1.1.5: version "1.1.5" @@ -7279,7 +7318,7 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.3, object.assign@^4.1.4: +object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== @@ -7290,39 +7329,39 @@ object.assign@^4.1.3, object.assign@^4.1.4: object-keys "^1.1.1" object.entries@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" - integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" + integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" object.fromentries@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" - integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== + version "2.0.7" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" object.hasown@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" - integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" + integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== dependencies: - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" object.values@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" on-finished@2.4.1, on-finished@^2.2.0: version "2.4.1" @@ -7372,11 +7411,11 @@ open@^6.3.0: is-wsl "^1.1.0" openapi3-ts@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/openapi3-ts/-/openapi3-ts-3.1.2.tgz#3c8167a5c009d0138fb57205a47013a2c260684f" - integrity sha512-S8fijNOqe/ut0kEDAwHZnI7sVYqb8Q3XnISmSyXmK76jgrcf4ableI75KTY1qdksd9EI/t39Vi5M4VYKrkNKfQ== + version "3.2.0" + resolved "https://registry.yarnpkg.com/openapi3-ts/-/openapi3-ts-3.2.0.tgz#7e30d33c480e938e67e809ab16f419bc9beae3f8" + integrity sha512-/ykNWRV5Qs0Nwq7Pc0nJ78fgILvOT/60OxEmB3v7yQ8a8Bwcm43D4diaYazG/KBn6czA+52XYy931WFLMCUeSg== dependencies: - yaml "^2.1.3" + yaml "^2.2.1" optionator@^0.8.1: version "0.8.3" @@ -7390,17 +7429,17 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" ora@^5.4.1: version "5.4.1" @@ -7422,11 +7461,6 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - p-defer@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" @@ -7439,7 +7473,7 @@ p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.2, p-limit@^3.1.0: +p-limit@^3.0.1, p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -7496,16 +7530,6 @@ pac-resolver@^5.0.0: ip "^1.1.5" netmask "^2.0.2" -package-json@^6.3.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" - integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== - dependencies: - got "^9.6.0" - registry-auth-token "^4.0.0" - registry-url "^5.0.0" - semver "^6.2.0" - parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -7560,6 +7584,14 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -7593,9 +7625,9 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== pkg-dir@^4.2.0: version "4.2.0" @@ -7623,15 +7655,10 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== - prettier@^2.3.1: - version "2.8.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.0.tgz#c7df58393c9ba77d6fba3921ae01faf994fb9dc9" - integrity sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA== + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: version "27.5.1" @@ -7642,12 +7669,12 @@ pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: ansi-styles "^5.0.0" react-is "^17.0.1" -pretty-format@^29.0.0, pretty-format@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.3.1.tgz#1841cac822b02b4da8971dacb03e8a871b4722da" - integrity sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg== +pretty-format@^29.0.0, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: - "@jest/schemas" "^29.0.0" + "@jest/schemas" "^29.6.3" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -7666,11 +7693,6 @@ promise-breaker@^6.0.0: resolved "https://registry.yarnpkg.com/promise-breaker/-/promise-breaker-6.0.0.tgz#107d2b70f161236abdb4ac5a736c7eb8df489d0f" integrity sha512-BthzO9yTPswGf7etOBiHCVuugs2N01/Q/94dIPls48z2zCmrnDptUUZzfIb+41xq0MnYZ/BzmOd6ikDR4ibNZA== -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== - promise-retry@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" @@ -7696,33 +7718,56 @@ prop-types@^15.6.2, prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== + proto3-json-serializer@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proto3-json-serializer/-/proto3-json-serializer-1.1.0.tgz#52d9c73b24d25ff925639e1e5a01ac883460149f" - integrity sha512-SjXwUWe/vANGs/mJJTbw5++7U67nwsymg7qsoPtw6GiXqw3kUy8ByojrlEdVE2efxAdKreX8WkDafxvYW95ZQg== + version "1.1.1" + resolved "https://registry.yarnpkg.com/proto3-json-serializer/-/proto3-json-serializer-1.1.1.tgz#1b5703152b6ce811c5cdcc6468032caf53521331" + integrity sha512-AwAuY4g9nxx0u52DnSMkqqgyLHaW/XaPLtaAo3y/ZCfeaQB/g4YDH4kb8Wc/mWzWvu0YjOznVnfn373MVZZrgw== dependencies: protobufjs "^7.0.0" -protobufjs-cli@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/protobufjs-cli/-/protobufjs-cli-1.0.2.tgz#905fc49007cf4aaf3c45d5f250eb294eedeea062" - integrity sha512-cz9Pq9p/Zs7okc6avH20W7QuyjTclwJPgqXG11jNaulfS3nbVisID8rC+prfgq0gbZE0w9LBFd1OKFF03kgFzg== +protobufjs-cli@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/protobufjs-cli/-/protobufjs-cli-1.1.1.tgz#f531201b1c8c7772066aa822bf9a08318b24a704" + integrity sha512-VPWMgIcRNyQwWUv8OLPyGQ/0lQY/QTQAVN5fh+XzfDwsVw1FZ2L3DM/bcBf8WPiRz2tNpaov9lPZfNcmNo6LXA== dependencies: chalk "^4.0.0" escodegen "^1.13.0" espree "^9.0.0" estraverse "^5.1.0" glob "^8.0.0" - jsdoc "^3.6.3" + jsdoc "^4.0.0" minimist "^1.2.0" semver "^7.1.2" tmp "^0.2.1" uglify-js "^3.7.7" -protobufjs@7.1.2, protobufjs@^7.0.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.1.2.tgz#a0cf6aeaf82f5625bffcf5a38b7cd2a7de05890c" - integrity sha512-4ZPTPkXCdel3+L81yw3dG6+Kq3umdWKh7Dc7GW/CpNk4SX3hK58iPCWeCyhVTDrbkNeKrYNZ7EojM5WDaEWTLQ== +protobufjs@7.2.4: + version "7.2.4" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.4.tgz#3fc1ec0cdc89dd91aef9ba6037ba07408485c3ae" + integrity sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" + +protobufjs@^7.0.0, protobufjs@^7.2.4: + version "7.2.5" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.5.tgz#45d5c57387a6d29a17aab6846dcc283f9b8e7f2d" + integrity sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A== dependencies: "@protobufjs/aspromise" "^1.1.2" "@protobufjs/base64" "^1.1.2" @@ -7783,24 +7828,36 @@ punycode@^1.3.2: integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== -pupa@^2.0.1, pupa@^2.1.1: +pupa@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== dependencies: escape-goat "^2.0.0" -qs@6.11.0, qs@^6.6.0: +pure-rand@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.3.tgz#3c9e6b53c09e52ac3cedffc85ab7c1c7094b38cb" + integrity sha512-KddyFewCsO0j3+np81IQ+SweXLDnDQTs5s67BOnrYmYe/yNmUhttQyGsYzy8yUnoljGAQ9sl38YB4vH8ur7Y+w== + +qs@6.11.0: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" +qs@^6.6.0: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + qs@~6.5.2: version "6.5.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" @@ -7821,7 +7878,7 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.1, raw-body@^2.2.0, raw-body@^2.3.3: +raw-body@2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== @@ -7831,7 +7888,17 @@ raw-body@2.5.1, raw-body@^2.2.0, raw-body@^2.3.3: iconv-lite "0.4.24" unpipe "1.0.0" -rc@1.2.8, rc@^1.2.8: +raw-body@2.5.2, raw-body@^2.2.0, raw-body@^2.3.3: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -7841,14 +7908,14 @@ rc@1.2.8, rc@^1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" -re2@^1.15.8: - version "1.17.7" - resolved "https://registry.yarnpkg.com/re2/-/re2-1.17.7.tgz#e14cab85a177a5534c7215c322d1b043c55aa1e9" - integrity sha512-X8GSuiBoVWwcjuppqSjsIkRxNUKDdjhkO9SBekQbZ2ksqWUReCy7DQPWOVpoTnpdtdz5PIpTTxTFzvJv5UMfjA== +re2@^1.17.7: + version "1.20.3" + resolved "https://registry.yarnpkg.com/re2/-/re2-1.20.3.tgz#7370b05f0a534873a9054fe7704be2f10bfc4c90" + integrity sha512-g5j4YjygwGEccP9SCuDI90uPlgALLEYLotfL0K+kqL3XKB4ht7Nm1JuXfOTG96c7JozpvCUxTz1T7oTNwwMI6w== dependencies: - install-artifact-from-github "^1.3.1" - nan "^2.16.0" - node-gyp "^9.0.0" + install-artifact-from-github "^1.3.3" + nan "^2.17.0" + node-gyp "^9.4.0" react-dom@^18.0.0: version "18.2.0" @@ -7858,12 +7925,12 @@ react-dom@^18.0.0: loose-envify "^1.1.0" scheduler "^0.23.0" -react-i18next@^11.10.0: - version "11.18.6" - resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.18.6.tgz#e159c2960c718c1314f1e8fcaa282d1c8b167887" - integrity sha512-yHb2F9BiT0lqoQDt8loZ5gWP331GwctHz9tYQ8A2EIEUu+CcEdjBLQWli1USG3RdWQt3W+jqQLg/d4rrQR96LA== +react-i18next@^13.2.2: + version "13.2.2" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-13.2.2.tgz#b1e78ed66a54f4bc819616f68b98221e1b1a1936" + integrity sha512-+nFUkbRByFwnrfDcYqvzBuaeZb+nACHx+fAWN/pZMddWOCJH5hoc21+Sa/N/Lqi6ne6/9wC/qRGOoQhJa6IkEQ== dependencies: - "@babel/runtime" "^7.14.5" + "@babel/runtime" "^7.22.5" html-parse-stringify "^3.0.1" react-is@^16.13.1, react-is@^16.7.0: @@ -7881,20 +7948,20 @@ react-is@^18.0.0, react-is@^18.2.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -react-router-dom@^6.0.0: - version "6.4.3" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.4.3.tgz#70093b5f65f85f1df9e5d4182eb7ff3a08299275" - integrity sha512-MiaYQU8CwVCaOfJdYvt84KQNjT78VF0TJrA17SIQgNHRvLnXDJO6qsFqq8F/zzB1BWZjCFIrQpu4QxcshitziQ== +react-router-dom@^6.8.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.16.0.tgz#86f24658da35eb66727e75ecbb1a029e33ee39d9" + integrity sha512-aTfBLv3mk/gaKLxgRDUPbPw+s4Y/O+ma3rEN1u8EgEpLpPe6gNjIsWt9rxushMHHMb7mSwxRGdGlGdvmFsyPIg== dependencies: - "@remix-run/router" "1.0.3" - react-router "6.4.3" + "@remix-run/router" "1.9.0" + react-router "6.16.0" -react-router@6.4.3: - version "6.4.3" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.4.3.tgz#9ed3ee4d6e95889e9b075a5d63e29acc7def0d49" - integrity sha512-BT6DoGn6aV1FVP5yfODMOiieakp3z46P1Fk0RNzJMACzE7C339sFuHebfvWtnB4pzBvXXkHP2vscJzWRuUjTtA== +react-router@6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.16.0.tgz#abbf3d5bdc9c108c9b822a18be10ee004096fb81" + integrity sha512-VT4Mmc4jj5YyjpOi5jOf0I+TYzGpvzERy4ckNSvSh2RArv8LLoCxlsZ2D+tc7zgjxcY34oTz2hZaeX5RVprKqA== dependencies: - "@remix-run/router" "1.0.3" + "@remix-run/router" "1.9.0" react-transition-group@^4.4.5: version "4.4.5" @@ -7948,10 +8015,10 @@ readable-stream@1.1.x: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== +readable-stream@^2.0.0, readable-stream@^2.0.5: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -7962,18 +8029,18 @@ readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable util-deprecate "~1.0.1" readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" -readdir-glob@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.2.tgz#b185789b8e6a43491635b6953295c5c5e3fd224c" - integrity sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA== +readdir-glob@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.3.tgz#c3d831f51f5e7bfa62fa2ffbe4b508c640f09584" + integrity sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA== dependencies: minimatch "^5.1.0" @@ -8009,10 +8076,22 @@ redeyed@~2.1.0: dependencies: esprima "~4.0.0" +reflect.getprototypeof@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" + integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" @@ -8021,63 +8100,58 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.10, regenerator-runtime@^0.13.7: +regenerator-runtime@^0.13.7: version "0.13.11" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-transform@^0.15.0: - version "0.15.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" - integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== +regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + define-properties "^1.2.0" + set-function-name "^2.0.0" -regexpu-core@^5.1.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" - integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: + "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" regenerate-unicode-properties "^10.1.0" - regjsgen "^0.7.1" regjsparser "^0.9.1" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" -registry-auth-token@^4.0.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.2.tgz#f02d49c3668884612ca031419491a13539e21fac" - integrity sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg== +registry-auth-token@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756" + integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ== dependencies: - rc "1.2.8" + "@pnpm/npm-conf" "^2.1.0" -registry-url@^5.0.0: +registry-url@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== dependencies: rc "^1.2.8" -regjsgen@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.7.1.tgz#ee5ef30e18d3f09b7c369b76e7c2373ed25546f6" - integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== - regjsparser@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" @@ -8127,11 +8201,11 @@ requires-port@^1.0.0: integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== requizzle@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.3.tgz#4675c90aacafb2c036bd39ba2daa4a1cb777fded" - integrity sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ== + version "0.2.4" + resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.4.tgz#319eb658b28c370f0c20f968fa8ceab98c13d27c" + integrity sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw== dependencies: - lodash "^4.17.14" + lodash "^4.17.21" resolve-cwd@^3.0.0: version "3.0.0" @@ -8150,21 +8224,21 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + version "1.22.6" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362" + integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.3: +resolve@^2.0.0-next.4: version "2.0.0-next.4" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== @@ -8173,13 +8247,6 @@ resolve@^2.0.0-next.3: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== - dependencies: - lowercase-keys "^1.0.0" - restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -8211,13 +8278,6 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -8226,9 +8286,9 @@ rimraf@^3.0.0, rimraf@^3.0.2: glob "^7.1.3" router@^1.3.1: - version "1.3.7" - resolved "https://registry.yarnpkg.com/router/-/router-1.3.7.tgz#7d68cef5558febfd3438a23de07a0f8b92b873f1" - integrity sha512-bYnD9Vv2287+g3AIll2kHITLtHV5+fldq6hVzaul9RbdGme77mvBY/1cO+ahsgstA2RI6DSg/j4W1TYHm4Lz4g== + version "1.3.8" + resolved "https://registry.yarnpkg.com/router/-/router-1.3.8.tgz#1509614ae1fbc67139a728481c54b057ecfb04bf" + integrity sha512-461UFH44NtSfIlS83PUg2N7OZo86BC/kB3dY77gJdsODsBhhw7+2uE0tzTINxrY9CahCUVk1VhpWCA5i1yoIEg== dependencies: array-flatten "3.0.0" debug "2.6.9" @@ -8251,12 +8311,22 @@ run-parallel@^1.1.9: queue-microtask "^1.2.2" rxjs@^7.5.5: - version "7.5.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39" - integrity sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA== + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" +safe-array-concat@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" + integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + isarray "^2.0.5" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -8277,9 +8347,9 @@ safe-regex-test@^1.0.0: is-regex "^1.1.4" safe-stable-stringify@^2.3.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.1.tgz#34694bd8a30575b7f94792aa51527551bd733d61" - integrity sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA== + version "2.4.3" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" @@ -8312,22 +8382,22 @@ semver-diff@^3.1.1: resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" integrity sha512-IrpJ+yoG4EOH8DFWuVg+8H1kW1Oaof0Wxe7cPcXW3x9BjkN/eVo54F15LyqemnDIUYskQWr9qvl/RihmSy6+xQ== -semver@7.x, semver@^7.0.0, semver@^7.1.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" +semver@^5.5.0, semver@^5.7.1: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^5.0.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.0.0, semver@^7.1.2, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" send@0.18.0: version "0.18.0" @@ -8363,10 +8433,14 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -setimmediate@~1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== +set-function-name@^2.0.0, set-function-name@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" setprototypeof@1.2.0: version "1.2.0" @@ -8411,6 +8485,11 @@ signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -8502,12 +8581,12 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -ssri@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" - integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== +ssri@^10.0.0: + version "10.0.5" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.5.tgz#e49efcd6e36385196cb515d3a2ad6c3f0265ef8c" + integrity sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A== dependencies: - minipass "^3.1.1" + minipass "^7.0.3" stack-trace@0.0.x: version "0.0.10" @@ -8531,15 +8610,22 @@ statuses@~1.5.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + stream-chain@^2.2.4, stream-chain@^2.2.5: version "2.2.5" resolved "https://registry.yarnpkg.com/stream-chain/-/stream-chain-2.2.5.tgz#b30967e8f14ee033c5b9a19bbe8a2cba90ba0d09" integrity sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA== stream-json@^1.7.3: - version "1.7.4" - resolved "https://registry.yarnpkg.com/stream-json/-/stream-json-1.7.4.tgz#e41637f93c5aca7267009ca8a3f6751e62331e69" - integrity sha512-ja2dde1v7dOlx5/vmavn8kLrxvNfs7r2oNc5DYmNJzayDDdudyCSuTB1gFjH4XBVTIwxiMxL4i059HX+ZiouXg== + version "1.8.0" + resolved "https://registry.yarnpkg.com/stream-json/-/stream-json-1.8.0.tgz#53f486b2e3b4496c506131f8d7260ba42def151c" + integrity sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw== dependencies: stream-chain "^2.2.5" @@ -8548,13 +8634,6 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== -string-length@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" - integrity sha512-MNCACnufWUf3pQ57O5WTBMkKhzYIaKEcUioO0XHrTMafrbBaNk4IyDOLHBv5xbXO0jLLdsYWeFjpjG2hVHRDtw== - dependencies: - strip-ansi "^3.0.0" - string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -8563,7 +8642,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -8572,37 +8651,56 @@ string-length@^4.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + string.prototype.matchall@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" - integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== + version "4.0.10" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" + integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" has-symbols "^1.0.3" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.3" + internal-slot "^1.0.5" + regexp.prototype.flags "^1.5.0" + set-function-name "^2.0.0" side-channel "^1.0.4" -string.prototype.trimend@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" -string.prototype.trimstart@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" string_decoder@^1.1.1: version "1.3.0" @@ -8623,6 +8721,13 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" @@ -8630,19 +8735,12 @@ strip-ansi@^0.3.0: dependencies: ansi-regex "^0.2.1" -strip-ansi@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: - ansi-regex "^5.0.1" + ansi-regex "^6.0.1" strip-bom@^4.0.0: version "4.0.0" @@ -8671,50 +8769,42 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -stylis@4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" - integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== +stylis@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== -superstatic@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/superstatic/-/superstatic-8.0.0.tgz#da01d4bb2d3698d9837181d21926fa6c6a050053" - integrity sha512-PqlA2xuEwOlRZsknl58A/rZEmgCUcfWIFec0bn10wYE5/tbMhEbMXGHCYDppiXLXcuhGHyOp1IimM2hLqkLLuw== +superstatic@^9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/superstatic/-/superstatic-9.0.3.tgz#eb271841e971d9c3760f6d4b3adca5db00f29f18" + integrity sha512-e/tmW0bsnQ/33ivK6y3CapJT0Ovy4pk/ohNPGhIAGU2oasoNLRQ1cv6enua09NU9w6Y0H/fBu07cjzuiWvLXxw== dependencies: basic-auth-connect "^1.0.0" - chalk "^1.1.3" - commander "^9.2.0" - compare-semver "^1.0.0" + commander "^10.0.0" compression "^1.7.0" - connect "^3.6.2" + connect "^3.7.0" destroy "^1.0.4" fast-url-parser "^1.1.3" glob-slasher "^1.0.1" is-url "^1.2.2" join-path "^1.1.1" lodash "^4.17.19" - mime-types "^2.1.16" - minimatch "^3.0.4" + mime-types "^2.1.35" + minimatch "^6.1.6" morgan "^1.8.2" on-finished "^2.2.0" on-headers "^1.0.0" path-to-regexp "^1.8.0" router "^1.3.1" - string-length "^1.0.0" - update-notifier "^4.1.1" + update-notifier-cjs "^5.1.6" optionalDependencies: - re2 "^1.15.8" + re2 "^1.17.7" supports-color@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" integrity sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA== -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== - supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -8736,7 +8826,7 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" -supports-hyperlinks@^2.2.0: +supports-hyperlinks@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== @@ -8754,11 +8844,6 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -taffydb@2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.6.2.tgz#7cbcb64b5a141b6a2efc2c5d2c67b4e150b2a268" - integrity sha512-y3JaeRSplks6NYQuCOj3ZFMO3j60rTwbuKCvZxsAraGYH2epusatvZ0baZYA01WsGqJBq/Dl6vOrMUJqyMj8kA== - tar-stream@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" @@ -8771,13 +8856,13 @@ tar-stream@^2.2.0: readable-stream "^3.1.1" tar@^6.1.11, tar@^6.1.2: - version "6.1.12" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.12.tgz#3b742fb05669b55671fb769ab67a7791ea1a62e6" - integrity sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw== + version "6.2.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" + integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" - minipass "^3.0.0" + minipass "^5.0.0" minizlib "^2.1.1" mkdirp "^1.0.3" yallist "^4.0.0" @@ -8790,11 +8875,6 @@ tcp-port-used@^1.0.2: debug "4.3.1" is2 "^2.0.6" -term-size@^2.1.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" - integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== - test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -8843,11 +8923,6 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -8861,9 +8936,9 @@ toidentifier@1.0.1: integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== tough-cookie@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" - integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== dependencies: psl "^1.1.33" punycode "^2.1.1" @@ -8897,33 +8972,33 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -"traverse@>=0.3.0 <0.4": - version "0.3.9" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" - integrity sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ== - treeify@^1.0.1, treeify@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== triple-beam@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" - integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== + version "1.4.1" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" + integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== + +ts-api-utils@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" + integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== ts-jest@^29.0.0-next.1: - version "29.0.0-next.1" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.0.0-next.1.tgz#bfd6c190f1eb30ce2e9408f6c3309784ccf96349" - integrity sha512-bVo2GDuJiV+cWEYB72tdz2Ips4JDKa04bcKikPULxxUHT4fsoY1zB2zvsrJym18qrFpXyVrIdgJFLfEx2YTkbg== + version "29.1.1" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.1.tgz#f58fe62c63caf7bfcc5cc6472082f79180f0815b" + integrity sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA== dependencies: bs-logger "0.x" fast-json-stable-stringify "2.x" jest-util "^29.0.0" - json5 "^2.2.1" + json5 "^2.2.3" lodash.memoize "4.x" make-error "1.x" - semver "7.x" + semver "^7.5.3" yargs-parser "^21.0.1" tslib@^1.8.1: @@ -8932,9 +9007,9 @@ tslib@^1.8.1: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.1, tslib@^2.1.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" - integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== tsutils@^3.21.0: version "3.21.0" @@ -8984,15 +9059,10 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -type-fest@^1.0.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" - integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== +type-fest@^3.0.0: + version "3.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" + integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== type-is@~1.6.18: version "1.6.18" @@ -9002,6 +9072,45 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -9009,10 +9118,10 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@^4.3.2: - version "4.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" - integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== +typescript@^5.0.3: + version "5.2.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" + integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" @@ -9062,17 +9171,17 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== -unique-filename@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" - integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== dependencies: - unique-slug "^3.0.0" + unique-slug "^4.0.0" -unique-slug@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" - integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== dependencies: imurmurhash "^0.1.4" @@ -9111,53 +9220,18 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -unzipper@^0.10.10: - version "0.10.11" - resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.11.tgz#0b4991446472cbdb92ee7403909f26c2419c782e" - integrity sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw== - dependencies: - big-integer "^1.6.17" - binary "~0.3.0" - bluebird "~3.4.1" - buffer-indexof-polyfill "~1.0.0" - duplexer2 "~0.1.4" - fstream "^1.0.12" - graceful-fs "^4.2.2" - listenercount "~1.0.1" - readable-stream "~2.3.6" - setimmediate "~1.0.4" - -update-browserslist-db@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== +update-browserslist-db@^1.0.11: + version "1.0.12" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.12.tgz#868ce670ac09b4a4d4c86b608701c0dee2dc41cd" + integrity sha512-tE1smlR58jxbFMtrMpFNRmsrOXlpNXss965T1CrpwuZUzUAg/TBQc94SpyhDLSzrqrJS9xTRBthnZAGcE1oaxg== dependencies: escalade "^3.1.1" picocolors "^1.0.0" -update-notifier@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.3.tgz#be86ee13e8ce48fb50043ff72057b5bd598e1ea3" - integrity sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A== - dependencies: - boxen "^4.2.0" - chalk "^3.0.0" - configstore "^5.0.1" - has-yarn "^2.1.0" - import-lazy "^2.1.0" - is-ci "^2.0.0" - is-installed-globally "^0.3.1" - is-npm "^4.0.0" - is-yarn-global "^0.3.0" - latest-version "^5.0.0" - pupa "^2.0.1" - semver-diff "^3.1.1" - xdg-basedir "^4.0.0" - -update-notifier@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" - integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== +update-notifier-cjs@^5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/update-notifier-cjs/-/update-notifier-cjs-5.1.6.tgz#6e3aff745d1551b55bb0a0a5939b7e636d95877d" + integrity sha512-wgxdSBWv3x/YpMzsWz5G4p4ec7JWD0HCl8W6bmNB6E5Gwo+1ym5oN4hiXpLf0mPySVEJEIsYlkshnplkg2OP9A== dependencies: boxen "^5.0.0" chalk "^4.1.0" @@ -9168,9 +9242,11 @@ update-notifier@^5.1.0: is-installed-globally "^0.4.0" is-npm "^5.0.0" is-yarn-global "^0.3.0" - latest-version "^5.1.0" + isomorphic-fetch "^3.0.0" pupa "^2.1.1" - semver "^7.3.4" + registry-auth-token "^5.0.1" + registry-url "^5.1.0" + semver "^7.3.7" semver-diff "^3.1.1" xdg-basedir "^4.0.0" @@ -9186,13 +9262,6 @@ url-join@0.0.1: resolved "https://registry.yarnpkg.com/url-join/-/url-join-0.0.1.tgz#1db48ad422d3402469a87f7d97bdebfe4fb1e3c8" integrity sha512-H6dnQ/yPAAVzMQRvEvyz01hhfQL5qRWSEt7BX8t9DqnPw9BjMb64fjIRq76Uvf1hkHp+mTZvEVJ5guXOT0Xqaw== -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== - dependencies: - prepend-http "^2.0.0" - url-parse@^1.5.3: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" @@ -9227,9 +9296,9 @@ uuid@^8.0.0, uuid@^8.3.2: integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== v8-to-istanbul@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" - integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== + version "9.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" + integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" @@ -9254,10 +9323,10 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -vm2@^3.9.8: - version "3.9.11" - resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.11.tgz#a880f510a606481719ec3f9803b940c5805a06fe" - integrity sha512-PFG8iJRSjvvBdisowQ7iVF580DXb1uCIiGaXgm7tynMR1uTBlv7UJlB1zdv5KJ+Tmq1f0Upnj3fayoEOPpCBKg== +vm2@^3.9.17: + version "3.9.19" + resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.19.tgz#be1e1d7a106122c6c492b4d51c2e8b93d3ed6a4a" + integrity sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg== dependencies: acorn "^8.7.0" acorn-walk "^8.2.0" @@ -9305,6 +9374,11 @@ whatwg-encoding@^2.0.0: dependencies: iconv-lite "0.6.3" +whatwg-fetch@^3.4.1: + version "3.6.19" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz#caefd92ae630b91c07345537e67f8354db470973" + integrity sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw== + whatwg-mimetype@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" @@ -9337,6 +9411,24 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + which-collection@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" @@ -9347,17 +9439,16 @@ which-collection@^1.0.1: is-weakmap "^2.0.1" is-weakset "^2.0.1" -which-typed-array@^1.1.8: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== +which-typed-array@^1.1.11, which-typed-array@^1.1.9: + version "1.1.11" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" for-each "^0.3.3" gopd "^1.0.1" has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" which@^1.2.9: version "1.3.1" @@ -9397,9 +9488,9 @@ winston-transport@^4.4.0, winston-transport@^4.5.0: triple-beam "^1.3.0" winston@^3.0.0: - version "3.8.2" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.8.2.tgz#56e16b34022eb4cff2638196d9646d7430fdad50" - integrity sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew== + version "3.10.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.10.0.tgz#d033cb7bd3ced026fed13bf9d92c55b903116803" + integrity sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g== dependencies: "@colors/colors" "1.5.0" "@dabh/diagnostics" "^2.0.2" @@ -9413,12 +9504,12 @@ winston@^3.0.0: triple-beam "^1.3.0" winston-transport "^4.5.0" -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -9427,6 +9518,24 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -9442,7 +9551,7 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write-file-atomic@^4.0.1: +write-file-atomic@^4.0.1, write-file-atomic@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== @@ -9456,9 +9565,9 @@ ws@^7.2.3: integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== ws@^8.11.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" - integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== + version "8.14.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" + integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== xdg-basedir@^4.0.0: version "4.0.0" @@ -9505,38 +9614,20 @@ yaml@^1.10.0: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yaml@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.1.3.tgz#9b3a4c8aff9821b696275c79a8bee8399d945207" - integrity sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yaml@^2.2.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.2.tgz#f522db4313c671a0ca963a75670f1c12ea909144" + integrity sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg== yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.3.1: - version "17.6.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" - integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== +yargs@^17.3.1, yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" escalade "^3.1.1" @@ -9552,10 +9643,10 @@ yocto-queue@^0.1.0: integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== zip-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.1.0.tgz#51dd326571544e36aa3f756430b313576dc8fc79" - integrity sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A== + version "4.1.1" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.1.1.tgz#1337fe974dbaffd2fa9a1ba09662a66932bd7135" + integrity sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ== dependencies: - archiver-utils "^2.1.0" - compress-commons "^4.1.0" + archiver-utils "^3.0.4" + compress-commons "^4.1.2" readable-stream "^3.6.0"