diff --git a/.github/workflows/create-version.yml b/.github/workflows/create-version.yml index 448b7088c..8f5208aab 100644 --- a/.github/workflows/create-version.yml +++ b/.github/workflows/create-version.yml @@ -4,7 +4,7 @@ on: push: branches: - 'main' - - 'beta' + - 'dev' tags-ignore: - '**' paths-ignore: @@ -109,7 +109,7 @@ jobs: # When successful, this job creates a version tag, triggering `publish-version.yml` - name: Semantic Release - uses: cycjimmy/semantic-release-action@v2.5.4 + uses: cycjimmy/semantic-release-action@v2.6.0 id: semantic if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository env: diff --git a/.github/workflows/debug-build.yml b/.github/workflows/debug-build.yml index de6c26722..506457d77 100644 --- a/.github/workflows/debug-build.yml +++ b/.github/workflows/debug-build.yml @@ -8,7 +8,7 @@ jobs: steps: - uses: lucasmotta/pull-request-sticky-header@1.0.0 - if: github.repository == 'blockstack/stacks-wallet' + if: github.repository == 'hirosystems/stacks-wallet' with: header: '> _Building new release, please wait for the latest_  ' GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -20,6 +20,8 @@ jobs: env: STX_NETWORK: ${{ matrix.stx_network }} + SENTRY_DSN: ${{ secrets.SENTRY_DSN }} + SEGMENT_WRITE_KEY: ${{ secrets.SEGMENT_WRITE_KEY }} strategy: matrix: @@ -68,7 +70,7 @@ jobs: id: cache-node-modules with: path: '**/node_modules' - key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('**/package.json') }} + key: ${{ runner.os }}-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('**/package.json') }}-${{ secrets.CACHE_BUSTER }} - name: Variables id: vars @@ -120,6 +122,7 @@ jobs: BRANCH_NAME: ${{ steps.vars.outputs.branch_name }} CSC_LINK: ${{ secrets[matrix.CSC_LINK_SECRET_NAME] }} CSC_KEY_PASSWORD: ${{ secrets[matrix.CSC_KEY_PASSWORD_SECRET_NAME] }} + SENTRY_DSN: ${{ secrets.SENTRY_DSN }} APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_ID_PASS: ${{ secrets.APPLE_ID_PASS }} @@ -128,7 +131,7 @@ jobs: - uses: actions/upload-artifact@v2 name: ${{ matrix.NPM_COMMAND }} ${{ matrix.stx_network }} upload with: - name: stacks-wallet-${{ matrix.stx_network }}-${{ matrix.NPM_COMMAND }} + name: hiro-wallet-${{ matrix.stx_network }}-${{ matrix.NPM_COMMAND }} path: ${{ matrix.UPLOAD_ASSETS }} asset-signatures: @@ -171,13 +174,13 @@ jobs: steps: - uses: lucasmotta/pull-request-sticky-header@1.0.0 - if: (!contains(needs.*.result, 'failure')) && github.repository == 'blockstack/stacks-wallet' + if: (!contains(needs.*.result, 'failure')) && github.repository == 'hirosystems/stacks-wallet' with: header: '> [Download the latest build](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})' GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - uses: lucasmotta/pull-request-sticky-header@1.0.0 - if: (contains(needs.*.result, 'failure')) && github.repository == 'blockstack/stacks-wallet' + if: (contains(needs.*.result, 'failure')) && github.repository == 'hirosystems/stacks-wallet' with: header: '> _Build failed, [see here for details](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})_' GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index 854f05c70..dca7dbf78 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -1,6 +1,13 @@ name: Integration tests -on: [pull_request] +on: + pull_request: + workflow_dispatch: + inputs: + url: + description: 'API URL to test' + required: true + default: https://stacks-node-api.testnet.stacks.co jobs: test-integration: @@ -9,6 +16,7 @@ jobs: env: STX_NETWORK: ${{ matrix.stx_network }} PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1 + DEFAULT_TESTNET_STACKS_NODE_URL: ${{ github.event.inputs.name }} strategy: matrix: diff --git a/.github/workflows/publish-version.yml b/.github/workflows/publish-version.yml index e6080a8df..45b3dfdc5 100644 --- a/.github/workflows/publish-version.yml +++ b/.github/workflows/publish-version.yml @@ -35,9 +35,6 @@ jobs: CSC_LINK_SECRET_NAME: CODE_SIGNING_CERTIFICATE_WINDOWS CSC_KEY_PASSWORD_SECRET_NAME: CODE_SIGNING_PASSWORD_WINDOWS - outputs: - version: ${{ steps.extract_version.outputs.version }} - steps: - name: Cancel Previous Runs uses: styfle/cancel-workflow-action@0.6.0 @@ -49,7 +46,7 @@ jobs: - uses: actions/cache@v2 with: path: '**/node_modules' - key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }} + key: ${{ runner.os }}-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('**/package.json') }}-${{ secrets.CACHE_BUSTER }} - name: Add required Linux dependencies uses: ./.github/actions/linux-deps @@ -73,10 +70,6 @@ jobs: with: node-version: 12 - - name: Extract version - id: extract_version - uses: Saionaro/extract-package-version@v1.0.6 - # # Windows build breaks when using the package.json script to install `app/` packages # using separate run to install those packages separately @@ -100,6 +93,8 @@ jobs: env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} NODE_ENV: production + SENTRY_DSN: ${{ secrets.SENTRY_DSN }} + SEGMENT_WRITE_KEY: ${{ secrets.SEGMENT_WRITE_KEY }} CSC_LINK: ${{ secrets[matrix.CSC_LINK_SECRET_NAME] }} CSC_KEY_PASSWORD: ${{ secrets[matrix.CSC_KEY_PASSWORD_SECRET_NAME] }} APPLE_ID: ${{ secrets.APPLE_ID }} @@ -108,7 +103,7 @@ jobs: - uses: actions/upload-artifact@v2 name: ${{ matrix.os }} upload with: - name: stacks-wallet-${{ matrix.stx_network }}-${{ matrix.NPM_COMMAND }} + name: hiro-wallet-${{ matrix.stx_network }}-${{ matrix.NPM_COMMAND }} path: ${{ matrix.UPLOAD_ASSETS }} create-release: @@ -118,19 +113,24 @@ jobs: outputs: release_upload_url: ${{ steps.create_release.outputs.upload_url }} + new_version: ${{ steps.extract_version.outputs.version }} steps: - uses: actions/checkout@v2 with: token: ${{ secrets.GH_TOKEN || secrets.GITHUB_TOKEN }} + - name: Extract version + id: extract_version + uses: Saionaro/extract-package-version@v1.1.1 + - name: Download binaries uses: actions/download-artifact@v2 with: path: release - name: Move binaries to root directory - run: mv release/*/stacks-wallet* . + run: mv release/*/hiro-wallet* . - name: Download release-notes.txt from create-version workflow uses: dawidd6/action-download-artifact@v2 @@ -149,21 +149,25 @@ jobs: run: | sed -i '1d' release-notes.txt echo "\`\`\`" >> release-notes.txt - shasum -a 256 stacks-wallet* >> shasums.txt - gpg --armor --output shasums.txt.asc --clearsign shasums.txt + shasum -a 256 hiro-wallet* >> shasums.txt + gpg --armor --output shasums.txt.asc --clearsign --digest-algo SHA256 shasums.txt cat release-notes.txt shasums.txt.asc > release-body.txt echo "\`\`\`" >> release-body.txt + - run: echo ${{ steps.extract_version.outputs.version }} + - name: Create Release id: create_release uses: actions/create-release@v1 + # check for case where it hasn't found version number + if: steps.extract_version.outputs.version != '' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - tag_name: v${{ needs.build.outputs.version }} - release_name: Hiro Wallet v${{ needs.build.outputs.version }} + tag_name: v${{ steps.extract_version.outputs.version }} + release_name: Hiro Wallet v${{ steps.extract_version.outputs.version }} draft: false - prerelease: ${{ contains(needs.build.outputs.version, 'beta') }} + prerelease: ${{ contains(steps.extract_version.outputs.version, 'dev') }} body_path: release-body.txt upload-release-assets: @@ -201,23 +205,30 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ needs.create-release.outputs.release_upload_url }} - asset_path: release/stacks-wallet-${{ matrix.stx_network }}-${{ matrix.os }}/stacks-wallet.${{ matrix.stx_network }}.${{ matrix.ext }} - asset_name: stacks-wallet.${{ matrix.stx_network }}.v${{ needs.build.outputs.version }}.${{ matrix.ext }} + asset_path: release/hiro-wallet-${{ matrix.stx_network }}-${{ matrix.os }}/hiro-wallet.${{ matrix.stx_network }}.${{ matrix.ext }} + asset_name: hiro-wallet.${{ matrix.stx_network }}.v${{ needs.create-release.outputs.new_version }}.${{ matrix.ext }} asset_content_type: application/octet-stream announce-release: runs-on: ubuntu-latest + env: + DISCORD_WEBHOOK: ${{ secrets.DISCORD_UX_NOTIFS_WEBHOOK }} needs: - - build + - create-release - upload-release-assets steps: - - name: Discord notification - if: github.ref == 'refs/heads/main' - env: - DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} + - name: Discord Stable Release Notification + if: contains(needs.create-release.outputs.new_version, 'dev') == false + uses: Ilshidur/action-discord@master + with: + args: | + đź”” New Hiro Wallet released: [Download `v${{ needs.create-release.outputs.new_version }}` here](https://github.com/${{ github.repository }}/releases/tag/v${{ needs.create-release.outputs.new_version }}) + + - name: Discord Dev Release Notification + if: contains(needs.create-release.outputs.new_version, 'dev') == true uses: Ilshidur/action-discord@master with: args: | - đź”” New Hiro Wallet released: [Download `v${{ needs.build.outputs.version }}` here](https://github.com/${{ github.repository }}/releases/tag/v${{ needs.build.outputs.version }}) + New Hiro Wallet Preview released: [Download `v${{ needs.create-release.outputs.new_version }}` here](https://github.com/${{ github.repository }}/releases/tag/v${{ needs.create-release.outputs.new_version }}) diff --git a/CHANGELOG.md b/CHANGELOG.md index 451e87aa9..8531a19bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,62 @@ +# [4.6.0-dev.5](https://github.com/blockstack/stacks-wallet/compare/v4.6.0-dev.4...v4.6.0-dev.5) (2021-12-01) + + +### Bug Fixes + +* **send-form:** incorrect fee calc in send max button ([b4c1fee](https://github.com/blockstack/stacks-wallet/commit/b4c1fee7c7f9c83f46d83fd3e20f92d9fd5369b9)) + +# [4.6.0-dev.4](https://github.com/blockstack/stacks-wallet/compare/v4.6.0-dev.3...v4.6.0-dev.4) (2021-11-16) + + +### Features + +* add segment integration ([c1d6f1f](https://github.com/blockstack/stacks-wallet/commit/c1d6f1f1b447aa2ec178a4b0ff019940a4f0ea43)), closes [#928](https://github.com/blockstack/stacks-wallet/issues/928) + +# [4.6.0-dev.3](https://github.com/blockstack/stacks-wallet/compare/v4.6.0-dev.2...v4.6.0-dev.3) (2021-11-02) + + +### Bug Fixes + +* **sentry:** use dsn in debug mode ([eea392c](https://github.com/blockstack/stacks-wallet/commit/eea392cdb10c6347c9324f2ea26049a352e981ef)) + +# [4.6.0-dev.2](https://github.com/blockstack/stacks-wallet/compare/v4.6.0-dev.1...v4.6.0-dev.2) (2021-10-28) + + +### Bug Fixes + +* separate discord notifications, stable/dev ([55114dc](https://github.com/blockstack/stacks-wallet/commit/55114dc26d0dc0afbaee9dc1de13c9fb74d3a512)) + +# [4.6.0-dev.1](https://github.com/blockstack/stacks-wallet/compare/v4.5.3...v4.6.0-dev.1) (2021-10-28) + + +### Bug Fixes + +* lack of warning when you're using the wrong ledger device ([099b03f](https://github.com/blockstack/stacks-wallet/commit/099b03f84c7ed2f6c684a794820504f20d17a8ab)) +* remove 3rd party notification from link to explorer, closes [#937](https://github.com/blockstack/stacks-wallet/issues/937) ([edf6bb3](https://github.com/blockstack/stacks-wallet/commit/edf6bb32ea42f1a4d6b7a7004fb28245f3223486)) +* **stacking:** fee incorrectly applied to stacking contract calls ([cf608d0](https://github.com/blockstack/stacks-wallet/commit/cf608d0af4434e397945fcc0f91f8b751b0f0c91)) +* typo with SENTRY_DSN ([5ba69ed](https://github.com/blockstack/stacks-wallet/commit/5ba69ed617f1e0bc9806ae1a54ee5ccafb2aa5ea)) + + +### Features + +* **sentry:** add opt-in diagnostics with sentry, closes [#899](https://github.com/blockstack/stacks-wallet/issues/899) ([5670b9d](https://github.com/blockstack/stacks-wallet/commit/5670b9d4e5c4fbc0fd92229b23838742b2f9617f)) +* update release flow branches ([ee594d3](https://github.com/blockstack/stacks-wallet/commit/ee594d3da57b0c508034fd104667ecc953918fcf)) + +# [4.6.0-beta.1](https://github.com/blockstack/stacks-wallet/compare/v4.5.3...v4.6.0-beta.1) (2021-10-28) + + +### Bug Fixes + +* lack of warning when you're using the wrong ledger device ([099b03f](https://github.com/blockstack/stacks-wallet/commit/099b03f84c7ed2f6c684a794820504f20d17a8ab)) +* remove 3rd party notification from link to explorer, closes [#937](https://github.com/blockstack/stacks-wallet/issues/937) ([edf6bb3](https://github.com/blockstack/stacks-wallet/commit/edf6bb32ea42f1a4d6b7a7004fb28245f3223486)) +* **stacking:** fee incorrectly applied to stacking contract calls ([cf608d0](https://github.com/blockstack/stacks-wallet/commit/cf608d0af4434e397945fcc0f91f8b751b0f0c91)) +* typo with SENTRY_DSN ([5ba69ed](https://github.com/blockstack/stacks-wallet/commit/5ba69ed617f1e0bc9806ae1a54ee5ccafb2aa5ea)) + + +### Features + +* **sentry:** add opt-in diagnostics with sentry, closes [#899](https://github.com/blockstack/stacks-wallet/issues/899) ([5670b9d](https://github.com/blockstack/stacks-wallet/commit/5670b9d4e5c4fbc0fd92229b23838742b2f9617f)) + ## [4.5.3](https://github.com/blockstack/stacks-wallet/compare/v4.5.2...v4.5.3) (2021-09-15) diff --git a/README.md b/README.md index dec6d5ad4..97cbbb851 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,11 @@ -# Hiro Wallet for Desktop +# Hiro Wallet—Desktop ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/blockstack/stacks-wallet/Build) +[![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/blockstack/stacks-wallet)](https://github.com/blockstack/stacks-wallet/releases/latest) +[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) [![coverage](https://raw.githubusercontent.com/blockstack/stacks-wallet/gh-pages/badge.svg)](https://blockstack.github.io/stacks-wallet/) + [![Open in Visual Studio Code](https://open.vscode.dev/badges/open-in-vscode.svg)](https://open.vscode.dev/blockstack/stacks-wallet) ![Hiro Wallet Hero](/resources/readme.png) diff --git a/app/app.html b/app/app.html index df5511a33..f7917aff1 100644 --- a/app/app.html +++ b/app/app.html @@ -4,7 +4,7 @@ diff --git a/app/components/external-link.tsx b/app/components/external-link.tsx index de3947b8a..485106968 100644 --- a/app/components/external-link.tsx +++ b/app/components/external-link.tsx @@ -10,7 +10,7 @@ interface ExternalLinkProps extends BoxProps { export const ExternalLink: FC = ({ href, children, ...props }) => { const openUrl = () => openExternalLink(href); return ( - + = props => { {address !== null && ( - + View on Explorer - + )} diff --git a/app/components/internal-link.tsx b/app/components/internal-link.tsx new file mode 100644 index 000000000..cc9aba2a1 --- /dev/null +++ b/app/components/internal-link.tsx @@ -0,0 +1,30 @@ +import React, { FC } from 'react'; +import { Box, Text, BoxProps, color } from '@stacks/ui'; +import { openExternalLink } from '@utils/external-links'; + +interface InternalLinkProps extends BoxProps { + href: string; +} + +export const InternalLink: FC<InternalLinkProps> = ({ href, children, ...props }) => { + const openUrl = () => openExternalLink(href); + return ( + <Text + onClick={openUrl} + as="button" + type="button" + cursor="pointer" + display="block" + outline={0} + color={color('brand')} + _hover={{ textDecoration: 'underline' }} + _focus={{ textDecoration: 'underline' }} + {...props} + > + {children} + <Box display="inline-block" ml="extra-tight" mb="1px"> + ↗ + </Box> + </Text> + ); +}; diff --git a/app/components/request-diagnostics.layout.tsx b/app/components/request-diagnostics.layout.tsx new file mode 100644 index 000000000..d9740ca5a --- /dev/null +++ b/app/components/request-diagnostics.layout.tsx @@ -0,0 +1,63 @@ +import React, { FC } from 'react'; +import { FiCheck } from 'react-icons/fi'; +import { Box, Button, Flex, color, Stack, Text, FlexProps } from '@stacks/ui'; + +import { OnboardingSelector } from 'app/tests/features/onboarding.selectors'; + +interface ReasonToAllowDiagnosticsProps extends FlexProps { + text: string; +} +const ReasonToAllowDiagnostics: FC<ReasonToAllowDiagnosticsProps> = ({ text, ...props }) => { + return ( + <Flex color={color('text-caption')} textStyle="body.small" {...props}> + <Box mr="tight" mt="3px"> + <FiCheck /> + </Box> + <Box>{text}</Box> + </Flex> + ); +}; + +interface AllowDiagnosticsLayoutProps { + onUserAllowDiagnostics(): void; + onUserDenyDiagnosticsPermissions(): void; +} +export const AllowDiagnosticsLayout: FC<AllowDiagnosticsLayoutProps> = props => { + const { onUserAllowDiagnostics, onUserDenyDiagnosticsPermissions } = props; + + return ( + <> + <Text maxWidth="520px"> + We would like to gather de-identified usage data to help improve your experience with Hiro + Wallet. + </Text> + <Stack mt="loose" mb="extra-loose" spacing="base-tight" textAlign="left" maxWidth="520px"> + <ReasonToAllowDiagnostics text="Send anonymous data about page views and clicks" /> + <ReasonToAllowDiagnostics text="This data is tied to randomly-generated IDs and not personal data, such as your Stacks addresses, keys, balance, or IP addresses" /> + <ReasonToAllowDiagnostics text="This data is used to generate and send crash reports, help us fix errors, and analyze trends and statistics" /> + </Stack> + <Flex mt="base" fontSize="14px"> + <Button + type="button" + mode="primary" + px="extra-loose" + onClick={() => onUserAllowDiagnostics()} + data-test={OnboardingSelector.BtnAcceptDiagnosticPermission} + mr="base-tight" + > + Allow + </Button> + <Button + type="button" + mode="tertiary" + px="extra-loose" + ml="base" + variant="link" + onClick={() => onUserDenyDiagnosticsPermissions()} + > + Deny + </Button> + </Flex> + </> + ); +}; diff --git a/app/components/tx-signing/sign-transaction-ledger.tsx b/app/components/tx-signing/sign-transaction-ledger.tsx index ca76b286e..74d290072 100644 --- a/app/components/tx-signing/sign-transaction-ledger.tsx +++ b/app/components/tx-signing/sign-transaction-ledger.tsx @@ -1,4 +1,5 @@ -import React, { useCallback, useState } from 'react'; +import React, { useCallback, useMemo, useState } from 'react'; +import { useSelector } from 'react-redux'; import { useCreateLedgerContractCallTx, useCreateLedgerTokenTransferTx, @@ -13,36 +14,56 @@ import { StackingModalFooter as Footer, } from '../../modals/components/stacking-modal-layout'; import { SignTransactionProps } from './sign-transaction'; +import { RootState } from '@store/index'; +import { selectAddress } from '@store/keys'; type SignTransactionLedgerProps = SignTransactionProps; export const SignTransactionLedger = (props: SignTransactionLedgerProps) => { const { action, txOptions, isBroadcasting, onTransactionSigned, onClose } = props; + const [ledgerAddress, setLedgerAddress] = useState<null | string>(null); const { step: ledgerStep, isLocked, isSupportedAppVersion, appVersionErrorText, + publicKeysDoNotMatchError, } = usePrepareLedger(); + const [hasSubmitted, setHasSubmitted] = useState(false); + const { persistedAddress } = useSelector((state: RootState) => ({ + persistedAddress: selectAddress(state), + })); const { createLedgerContractCallTx } = useCreateLedgerContractCallTx(); const { createLedgerTokenTransferTx } = useCreateLedgerTokenTransferTx(); const createLedgerTx = useCallback(async () => { + const data = await main.ledger.showStxAddress(); + if (persistedAddress !== data.address) { + setLedgerAddress(data.address); + } if ('recipient' in txOptions) { return createLedgerTokenTransferTx(txOptions); } return createLedgerContractCallTx(txOptions); - }, [createLedgerContractCallTx, createLedgerTokenTransferTx, txOptions]); + }, [createLedgerContractCallTx, createLedgerTokenTransferTx, persistedAddress, txOptions]); + + const ledgerError = useMemo(() => { + if (!isSupportedAppVersion) return appVersionErrorText; + if (ledgerAddress && persistedAddress !== ledgerAddress) return publicKeysDoNotMatchError; + return null; + }, [ + appVersionErrorText, + isSupportedAppVersion, + ledgerAddress, + persistedAddress, + publicKeysDoNotMatchError, + ]); return ( <> - <SignTxWithLedger - step={ledgerStep} - isLocked={isLocked} - ledgerError={isSupportedAppVersion ? null : appVersionErrorText} - /> + <SignTxWithLedger step={ledgerStep} isLocked={isLocked} ledgerError={ledgerError} /> <Footer> <Button mode="tertiary" onClick={onClose}> Close diff --git a/app/components/wallet-warning.tsx b/app/components/wallet-warning.tsx index 0ec0fd002..0d2823371 100644 --- a/app/components/wallet-warning.tsx +++ b/app/components/wallet-warning.tsx @@ -8,6 +8,8 @@ export const WalletWarning: FC<FlexProps> = props => { <Text textStyle="caption" color={color('text-caption')}> ⚠️ Please check our status page for known issues if you’re experiencing any difficulties. <ExternalLink + display="inline-block" + ml="base" fontSize="12px" mt="extra-tight" href="https://www.hiro.so/questions/what-known-issues-are-currently-affecting-the-stacks-wallet" diff --git a/app/constants/index.ts b/app/constants/index.ts index 5274633a6..c5c7277ed 100644 --- a/app/constants/index.ts +++ b/app/constants/index.ts @@ -26,7 +26,8 @@ export const STATUS_PAGE_URL = 'http://status.test-blockstack.com'; export const DEFAULT_STACKS_NODE_URL = whenNetwork<string>({ mainnet: 'https://stacks-node-api.mainnet.stacks.co', - testnet: 'https://stacks-node-api.testnet.stacks.co', + testnet: + process.env.DEFAULT_TESTNET_STACKS_NODE_URL ?? 'https://stacks-node-api.testnet.stacks.co', }); export const EXPLORER_URL = 'https://explorer.stacks.co'; @@ -60,7 +61,7 @@ export const STX_TRANSFER_TX_SIZE_BYTES = 180; export const REVOKE_DELEGATION_TX_SIZE_BYTES = 165; -export const STACKING_CONTRACT_CALL_FEE = 260; +export const STACKING_CONTRACT_CALL_TX_BYTES = 260; export const POOLED_STACKING_TX_SIZE_BYTES = 216; diff --git a/app/constants/routes.json b/app/constants/routes.json index dfd1589ee..b04525955 100644 --- a/app/constants/routes.json +++ b/app/constants/routes.json @@ -1,6 +1,8 @@ { - "HOME": "/", + "HOME": "/home", + "HOME_REQUEST_DIAGNOSTICS": "/home/request-diagnostics", "TERMS": "/onboard/terms", + "REQUEST_DIAGNOSTICS": "/onboard/terms/request-diagnostics", "WELCOME": "/onboard/welcome", "CREATE": "/onboard/create", "RESTORE": "/onboard/restore", diff --git a/app/hooks/use-analytics.ts b/app/hooks/use-analytics.ts new file mode 100644 index 000000000..3e111e422 --- /dev/null +++ b/app/hooks/use-analytics.ts @@ -0,0 +1,30 @@ +import { EventParams } from '@segment/analytics-next/dist/pkg/core/arguments-resolver'; +import { useHasUserGivenDiagnosticPermissions } from '@store/settings'; +import { getAnalytics } from '@utils/init-segment'; +import packageJson from '../../package.json'; +import { NETWORK } from '@constants/index'; + +export function useAnalytics() { + const diagnosticsEnabled = useHasUserGivenDiagnosticPermissions(); + const analytics = getAnalytics(); + const defaultProperties = { + version: packageJson.version, + network: NETWORK, + }; + + const defaultOptions = { + context: { ip: '0.0.0.0' }, + }; + + return { + track: async (...args: EventParams) => { + if (!analytics || !diagnosticsEnabled) return; + const [eventName, properties, options, ...rest] = args; + + const prop = { ...defaultProperties, ...properties }; + const opts = { ...defaultOptions, ...options }; + + return analytics.track(eventName, prop, opts, ...rest).catch(console.error); + }, + }; +} diff --git a/app/hooks/use-diagnostic-permission-prompt.ts b/app/hooks/use-diagnostic-permission-prompt.ts new file mode 100644 index 000000000..af3deea36 --- /dev/null +++ b/app/hooks/use-diagnostic-permission-prompt.ts @@ -0,0 +1,17 @@ +import { useEffect } from 'react'; +import { useHistory } from 'react-router'; + +import routes from '../constants/routes.json'; +import { useHasUserGivenDiagnosticPermissions } from '@store/settings'; + +export function usePromptUserToSetDiagnosticPermissions() { + const history = useHistory(); + const hasGivenPermission = useHasUserGivenDiagnosticPermissions(); + + useEffect(() => { + if (CONFIG.NODE_ENV === 'test') return; + if (hasGivenPermission === undefined) history.push(routes.HOME_REQUEST_DIAGNOSTICS); + // Only want to run on mount, not every time this value changes + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [history]); +} diff --git a/app/hooks/use-prepare-ledger.ts b/app/hooks/use-prepare-ledger.ts index fccdf963c..9c1cc10a5 100644 --- a/app/hooks/use-prepare-ledger.ts +++ b/app/hooks/use-prepare-ledger.ts @@ -11,6 +11,8 @@ import { useListenLedgerEffect } from './use-listen-ledger-effect'; import { messages$ } from './use-message-events'; import { useCheckForUpdates } from './use-check-for-updates'; +const publicKeysDoNotMatchError = `Public key mismatch. Make sure you're using the same Ledger you created the wallet with.`; + export enum LedgerConnectStep { Disconnected, ConnectedAppClosed, @@ -103,5 +105,12 @@ export function usePrepareLedger() { return () => sub.unsubscribe(); }, []); - return { step, isLocked, appVersion, isSupportedAppVersion, appVersionErrorText }; + return { + step, + isLocked, + appVersion, + isSupportedAppVersion, + appVersionErrorText, + publicKeysDoNotMatchError, + }; } diff --git a/app/main.dev.ts b/app/main.dev.ts index d994bd222..5aa1779f2 100644 --- a/app/main.dev.ts +++ b/app/main.dev.ts @@ -31,6 +31,7 @@ import { registerIpcStoreHandlers } from './main/register-store-handlers'; import { registerIpcContextMenuHandlers } from './main/register-context-menus'; import { addMacOsTouchBarMenu } from './main/macos-touchbar-menu'; import { registerThemeModeHandlers } from './main/register-theme-mode-handlers'; +import { registerSentryStateListener } from './main/register-sentry-state-listener'; // CSP enabled in production mode, don't warn in development delete process.env.ELECTRON_ENABLE_SECURITY_WARNINGS; @@ -157,6 +158,8 @@ const createWindow = async () => { registerIpcContextMenuHandlers(mainWindow); + registerSentryStateListener(); + if (process.platform === 'darwin') addMacOsTouchBarMenu(mainWindow); }; diff --git a/app/main/register-sentry-state-listener.ts b/app/main/register-sentry-state-listener.ts new file mode 100644 index 000000000..c6dcdde4d --- /dev/null +++ b/app/main/register-sentry-state-listener.ts @@ -0,0 +1,22 @@ +import { ipcMain } from 'electron'; +import * as Sentry from '@sentry/electron/dist/main'; + +let diagnosticsEnabled = false; + +if (process.env.SENTRY_DSN) { + Sentry.init({ + dsn: process.env.SENTRY_DSN, + beforeSend(event) { + if (!diagnosticsEnabled) return null; + return event; + }, + }); +} + +Sentry.setContext('network', { network: process.env.STX_NETWORK }); + +export function registerSentryStateListener() { + ipcMain.on('set-diagnostics-permission', (_event, updatedDiagnosticPermission: boolean) => { + diagnosticsEnabled = updatedDiagnosticPermission; + }); +} diff --git a/app/modals/components/modal-header.tsx b/app/modals/components/modal-header.tsx index fac165c20..b7f0b8b54 100644 --- a/app/modals/components/modal-header.tsx +++ b/app/modals/components/modal-header.tsx @@ -1,17 +1,18 @@ import React, { FC } from 'react'; -import { Text, color, Flex, IconButton, CloseIcon } from '@stacks/ui'; +import { Text, color, Flex, IconButton, CloseIcon, FlexProps } from '@stacks/ui'; -interface TxModalHeaderProps { +interface TxModalHeaderProps extends FlexProps { onSelectClose: () => void; } -export const ModalHeader: FC<TxModalHeaderProps> = ({ children, onSelectClose }) => ( +export const ModalHeader: FC<TxModalHeaderProps> = ({ children, onSelectClose, ...props }) => ( <Flex minHeight="84px" px="extra-loose" alignItems="center" borderBottom={`1px solid ${color('border')}`} justifyContent="space-between" + {...props} > <Text as="h2" textStyle="display.small"> {children} diff --git a/app/modals/receive-stx/components/address-displayer.tsx b/app/modals/receive-stx/components/address-displayer.tsx index 9b7a4b397..ae32f6a41 100644 --- a/app/modals/receive-stx/components/address-displayer.tsx +++ b/app/modals/receive-stx/components/address-displayer.tsx @@ -3,6 +3,7 @@ import { Box, Button, color, Flex, Text, useClipboard } from '@stacks/ui'; import { ExchangeWithdrawalWarning } from '@components/testnet/exchange-withdrawal-warning'; import { isTestnet } from '@utils/network-utils'; import { HomeSelectors } from 'app/tests/features/home.selectors'; +import { useAnalytics } from '@hooks/use-analytics'; interface AddressDisplayerProps { address: string; @@ -12,6 +13,11 @@ export const AddressDisplayer: FC<AddressDisplayerProps> = props => { const { address } = props; const { hasCopied, onCopy } = useClipboard(address); + const analytics = useAnalytics(); + const onCopyTracked = () => { + void analytics.track('copy_address_to_clipboard'); + onCopy(); + }; return ( <Box> @@ -43,7 +49,7 @@ export const AddressDisplayer: FC<AddressDisplayerProps> = props => { You do not need a memo to receive STX from elsewhere, such as a cryptocurrency exchange </Text> <Flex justifyContent="center" mt="base-tight" mb="tight"> - <Button variant="link" onClick={onCopy}> + <Button variant="link" onClick={onCopyTracked}> {hasCopied ? 'Copied' : 'Copy address'} </Button> </Flex> diff --git a/app/modals/receive-stx/components/reveal-stx-address-ledger.tsx b/app/modals/receive-stx/components/reveal-stx-address-ledger.tsx index 3f7cba2cd..4c299de8d 100644 --- a/app/modals/receive-stx/components/reveal-stx-address-ledger.tsx +++ b/app/modals/receive-stx/components/reveal-stx-address-ledger.tsx @@ -15,7 +15,8 @@ import { ErrorText } from '@components/error-text'; export const RevealStxAddressLedger: FC = () => { const { step, isLocked, isSupportedAppVersion, appVersionErrorText } = usePrepareLedger(); - const [address, setAddress] = useState<null | string>(null); + + const [ledgerAddress, setLedgerAddress] = useState<null | string>(null); const [success, setSuccess] = useState(false); const [pendingLedgerAction, setPendingLedgerAction] = useState<'idle' | 'pending' | 'complete'>('idle'); @@ -26,7 +27,7 @@ export const RevealStxAddressLedger: FC = () => { const stepToShow = success ? LedgerConnectStep.ActionComplete : step; - const showAddress = persistedAddress === address && address !== null; + const showAddress = persistedAddress === ledgerAddress && ledgerAddress !== null; const verifyAddress = useCallback(async () => { setPendingLedgerAction('pending'); @@ -34,7 +35,7 @@ export const RevealStxAddressLedger: FC = () => { const fromDeviceAddr = await main.ledger.showStxAddress(); if (fromDeviceAddr && fromDeviceAddr.address) { setSuccess(fromDeviceAddr.address === persistedAddress); - setAddress(fromDeviceAddr.address); + setLedgerAddress(fromDeviceAddr.address); } await main.ledger.requestAndConfirmStxAddress(); setPendingLedgerAction('complete'); @@ -48,8 +49,18 @@ export const RevealStxAddressLedger: FC = () => { mb="base-tight" mx="extra-loose" > - {address ? ( - <AddressDisplayer address={address} /> + {ledgerAddress && persistedAddress ? ( + <> + <AddressDisplayer address={persistedAddress} /> + <Box> + {ledgerAddress !== persistedAddress && ( + <SevereWarning mt="tight" mb="base" pr="base-loose"> + The addresses do not match. Make sure you're using the same Ledger device with which + you created this wallet. + </SevereWarning> + )} + </Box> + </> ) : ( <Flex flexDirection="column" mx="extra-loose" width="320px"> <Stack spacing="base-loose"> @@ -73,14 +84,6 @@ export const RevealStxAddressLedger: FC = () => { > Request Ledger address </Button> - <Box> - {address !== null && address !== persistedAddress && ( - <SevereWarning mt="tight" mb="base" pr="base-loose"> - The addresses do not match. Make sure you're using the same Ledger device with - which you created this wallet. - </SevereWarning> - )} - </Box> </Stack> </Flex> )} @@ -90,7 +93,7 @@ export const RevealStxAddressLedger: FC = () => { </ErrorLabel> )} <Box> - {pendingLedgerAction === 'pending' && address && ( + {pendingLedgerAction === 'pending' && ledgerAddress && ( <Flex mb="base"> <Box> <Spinner color={color('text-caption')} size="xs" /> diff --git a/app/modals/request-diagnostics/request-diagnostic-modal.tsx b/app/modals/request-diagnostics/request-diagnostic-modal.tsx new file mode 100644 index 000000000..f6ea42f02 --- /dev/null +++ b/app/modals/request-diagnostics/request-diagnostic-modal.tsx @@ -0,0 +1,45 @@ +import React, { FC, memo } from 'react'; +import { useDispatch } from 'react-redux'; +import { useHistory, useLocation } from 'react-router'; +import { useHotkeys } from 'react-hotkeys-hook'; + +import { grantDiagnosticsPermission, revokeDiagnosticPermission } from '@store/settings'; +import { Modal } from '@modals/components/base-modal'; +import { AllowDiagnosticsLayout } from '../../components/request-diagnostics.layout'; +import { ModalHeader } from '@modals/components/modal-header'; +import { Box } from '@stacks/ui'; + +export const RequestDiagnosticsModal: FC = memo(() => { + const history = useHistory(); + const dispatch = useDispatch(); + const location = useLocation(); + + const goToCurrentUrlOneRouteUpWithoutDiagnosticsModal = () => + history.push(location.pathname.replace('/request-diagnostics', '')); + + const userAllowDiagnosticAction = () => { + dispatch(grantDiagnosticsPermission()); + goToCurrentUrlOneRouteUpWithoutDiagnosticsModal(); + }; + + const userProhibitDiagnosticAction = () => { + dispatch(revokeDiagnosticPermission()); + goToCurrentUrlOneRouteUpWithoutDiagnosticsModal(); + }; + + useHotkeys('esc', () => userProhibitDiagnosticAction()); + + return ( + <Modal handleClose={() => null} minWidth="488px" isOpen> + <ModalHeader border={0} onSelectClose={() => userProhibitDiagnosticAction()}> + Help us improve + </ModalHeader> + <Box mx="extra-loose" mb="extra-loose"> + <AllowDiagnosticsLayout + onUserAllowDiagnostics={() => userAllowDiagnosticAction()} + onUserDenyDiagnosticsPermissions={() => userProhibitDiagnosticAction()} + /> + </Box> + </Modal> + ); +}); diff --git a/app/modals/reset-wallet/reset-wallet-modal.tsx b/app/modals/reset-wallet/reset-wallet-modal.tsx index 167751a7c..8bd00e71f 100644 --- a/app/modals/reset-wallet/reset-wallet-modal.tsx +++ b/app/modals/reset-wallet/reset-wallet-modal.tsx @@ -5,10 +5,10 @@ import { TxModalFooter } from '../send-stx/send-stx-modal-layout'; import { clearDiskStorage } from '@utils/disk-store'; import { ModalHeader } from '@modals/components/modal-header'; import { SettingsSelectors } from 'app/tests/features/settings.selectors'; +import { useAnalytics } from '@hooks/use-analytics'; interface ResetWalletModalProps { isOpen: boolean; - onClose(): void; } @@ -17,6 +17,7 @@ export const ResetWalletModal: FC<ResetWalletModalProps> = ({ isOpen, onClose }) const timer = useRef<number>(0); const cancelBtnRef = useRef<HTMLDivElement>(); const PANIC_CANCEL_TIME = 3500; + const analytics = useAnalytics(); const closeModal = useCallback(() => { setWipingWallet(false); @@ -31,12 +32,13 @@ export const ResetWalletModal: FC<ResetWalletModalProps> = ({ isOpen, onClose }) const resetWallet = useCallback(() => { setWipingWallet(true); + void analytics.track('reset_wallet'); // Allow user to grace period to panic cancel operations // Focusing cancel btn ensures any key press of: enter, space, esc // will cancel the pending operation cancelBtnRef.current?.focus(); timer.current = window.setTimeout(() => void clearStorage(), PANIC_CANCEL_TIME); - }, [cancelBtnRef, timer]); + }, [cancelBtnRef, timer, analytics]); return ( <Modal isOpen={isOpen} handleClose={onClose} minWidth={['100%', '488px']}> diff --git a/app/modals/send-stx/send-stx-modal.tsx b/app/modals/send-stx/send-stx-modal.tsx index 0e60c702d..095d0b5b5 100644 --- a/app/modals/send-stx/send-stx-modal.tsx +++ b/app/modals/send-stx/send-stx-modal.tsx @@ -19,7 +19,6 @@ import { validateDecimalPrecision } from '@utils/form/validate-decimals'; import { useLatestNonce } from '@hooks/use-latest-nonce'; import { safeAwait } from '@utils/safe-await'; -import { Api } from '@api/api'; import { STX_DECIMAL_PRECISION, STX_TRANSFER_TX_SIZE_BYTES } from '@constants/index'; import { validateStacksAddress } from '@utils/get-stx-transfer-direction'; @@ -42,6 +41,8 @@ import { TransactionError } from '@modals/components/transaction-error'; import { ModalHeader } from '@modals/components/modal-header'; import { HomeSelectors } from 'app/tests/features/home.selectors'; import { useCalculateFee } from '@hooks/use-calculate-fee'; +import { useAnalytics } from '@hooks/use-analytics'; +import { delay } from '@utils/delay'; interface TxModalProps { balance: string; @@ -78,6 +79,8 @@ export const SendStxModal: FC<TxModalProps> = ({ address, isOpen }) => { const [txDetails, setTxDetails] = useState<TokenTransferOptions | null>(null); + const analytics = useAnalytics(); + const totalIsMoreThanBalance = total.isGreaterThan(balance); const exceedsMaxLengthBytes = (string: string, maxLengthBytes: number): boolean => @@ -185,6 +188,7 @@ export const SendStxModal: FC<TxModalProps> = ({ address, isOpen }) => { }; useHotkeys('esc', closeModal); const sendStx = (tx: StacksTransaction) => { + void analytics.track('broadcast_transaction'); broadcastTx({ async onSuccess(txId: string) { await safeAwait(watchForNewTxToAppear({ txId, nodeUrl: stacksApi.baseUrl })); @@ -202,23 +206,20 @@ export const SendStxModal: FC<TxModalProps> = ({ address, isOpen }) => { const updateAmountFieldToMaxBalance = async () => { setCalculatingMaxSpend(true); - const [error, feeRate] = await safeAwait(new Api(stacksApi.baseUrl).getFeeRate()); - if (error) setCalculatingMaxSpend(false); - if (feeRate) { - const fee = new BigNumber(feeRate.data).multipliedBy(STX_TRANSFER_TX_SIZE_BYTES); - const balanceLessFee = new BigNumber(balance).minus(fee.toString()); - if (balanceLessFee.isLessThanOrEqualTo(0)) { - void form.setFieldTouched('amount'); - form.setFieldError('amount', 'Your balance is not sufficient to cover the transaction fee'); - setCalculatingMaxSpend(false); - return; - } - void form.setValues({ - ...form.values, - amount: microStxToStx(balanceLessFee.toString()).toString(), - }); + await delay(300); + const fee = calcFee(STX_TRANSFER_TX_SIZE_BYTES); + const balanceLessFee = new BigNumber(balance).minus(fee.toString()); + if (balanceLessFee.isLessThanOrEqualTo(0)) { + void form.setFieldTouched('amount'); + form.setFieldError('amount', 'Your balance is not sufficient to cover the transaction fee'); setCalculatingMaxSpend(false); + return; } + await form.setValues({ + ...form.values, + amount: microStxToStx(balanceLessFee.toString()).toString(), + }); + setCalculatingMaxSpend(false); }; const txFormStepMap: Record<TxModalStep, () => JSX.Element> = { diff --git a/app/modals/send-stx/steps/transaction-form.tsx b/app/modals/send-stx/steps/transaction-form.tsx index bcc5041f2..2c2357416 100644 --- a/app/modals/send-stx/steps/transaction-form.tsx +++ b/app/modals/send-stx/steps/transaction-form.tsx @@ -6,6 +6,7 @@ import { FormikProps } from 'formik'; import { capitalize } from '@utils/capitalize'; import { toHumanReadableStx } from '@utils/unit-convert'; import { HomeSelectors } from 'app/tests/features/home.selectors'; +import { useAnalytics } from '@hooks/use-analytics'; interface TxModalFormProps { balance: string; form: FormikProps<{ recipient: string; amount: string; memo: string; noMemoRequired: boolean }>; @@ -16,6 +17,11 @@ interface TxModalFormProps { export const TxModalForm: FC<TxModalFormProps> = props => { const { balance, form, isCalculatingMaxSpend, feeEstimateError, onSendEntireBalance } = props; + const analytics = useAnalytics(); + const onSendEntireBalanceTracked = () => { + void analytics.track('select_maximum_amount_for_send'); + onSendEntireBalance(); + }; return ( <Box mb="extra-loose"> <Flex flexDirection="column" alignItems="center" mt="48px"> @@ -76,7 +82,7 @@ export const TxModalForm: FC<TxModalFormProps> = props => { top="22px" style={{ position: 'absolute' }} width="80px" - onClick={onSendEntireBalance} + onClick={onSendEntireBalanceTracked} isLoading={isCalculatingMaxSpend} > Send max diff --git a/app/modals/stacking/stacking-modal.tsx b/app/modals/stacking/stacking-modal.tsx index c82909d43..489198ed5 100644 --- a/app/modals/stacking/stacking-modal.tsx +++ b/app/modals/stacking/stacking-modal.tsx @@ -23,11 +23,11 @@ interface StackingModalProps { poxAddress: string; numCycles: number; amountToStack: BigNumber; + fee: BigNumber; onClose(): void; } - export const StackingModal: FC<StackingModalProps> = props => { - const { onClose, numCycles, poxAddress, amountToStack } = props; + const { onClose, numCycles, poxAddress, amountToStack, fee } = props; const dispatch = useDispatch(); const history = useHistory(); @@ -48,14 +48,15 @@ export const StackingModal: FC<StackingModalProps> = props => { const stackingTxOptions = useMemo(() => { if (!poxInfo) throw new Error('poxInfo not defined'); if (!coreNodeInfo) throw new Error('Stacking requires coreNodeInfo'); - return stackingClient.getStackOptions({ + const stackingTxOptions = stackingClient.getStackOptions({ amountMicroStx: new BN(amountToStack.toString()), poxAddress, cycles: numCycles, contract: poxInfo.contract_id, burnBlockHeight: coreNodeInfo.burn_block_height, }); - }, [amountToStack, coreNodeInfo, numCycles, poxAddress, poxInfo, stackingClient]); + return { ...stackingTxOptions, fee: new BN(fee.toString()) }; + }, [amountToStack, coreNodeInfo, numCycles, poxAddress, poxInfo, stackingClient, fee]); const stackStx = (signedTx: StacksTransaction) => broadcastTx({ diff --git a/app/models/index.ts b/app/models/index.ts index 25d14898f..802e69270 100644 --- a/app/models/index.ts +++ b/app/models/index.ts @@ -11,7 +11,7 @@ export enum ApiResource { declare global { const CONFIG: { - NODE_ENV: 'development' | 'production'; + NODE_ENV: 'development' | 'production' | 'test'; DEBUG_PROD: string; STX_NETWORK: 'testnet' | 'mainnet'; PLAIN_HMR?: string; diff --git a/app/pages/home/home.tsx b/app/pages/home/home.tsx index 0f56bc80c..8ce325390 100644 --- a/app/pages/home/home.tsx +++ b/app/pages/home/home.tsx @@ -1,7 +1,9 @@ import React, { FC } from 'react'; +import { Route, Switch } from 'react-router-dom'; import { useSelector, useDispatch } from 'react-redux'; import { Spinner } from '@stacks/ui'; +import routes from '@constants/routes.json'; import { openTxInExplorer } from '@utils/external-links'; import { RootState } from '@store/index'; @@ -27,6 +29,8 @@ import { useTransactionList } from '@hooks/use-transaction-list'; import { useBalance } from '@hooks/use-balance'; import { useApi } from '@hooks/use-api'; import { useLatestNonce } from '@hooks/use-latest-nonce'; +import { RequestDiagnosticsModal } from '@modals/request-diagnostics/request-diagnostic-modal'; +import { usePromptUserToSetDiagnosticPermissions } from '@hooks/use-diagnostic-permission-prompt'; import { StackingCard } from '@components/home/stacking-card'; import { StackingLoading } from '@components/home/stacking-loading'; @@ -42,11 +46,13 @@ import { BalanceCard, } from '@components/home'; import { HomeLayout } from './home-layout'; +import { useAnalytics } from '@hooks/use-analytics'; export const Home: FC = () => { const dispatch = useDispatch(); const api = useApi(); useLatestNonce(); + usePromptUserToSetDiagnosticPermissions(); const { delegated: isDelegated } = useDelegationStatus(); const { availableBalance } = useBalance(); @@ -77,8 +83,15 @@ export const Home: FC = () => { const { txs, pendingTxs, txCount, focusedTxIdRef, txDomNodeRefMap } = useTransactionList(); + const analytics = useAnalytics(); + if (!address) return <Spinner />; + const openTxInExplorerTracked = (txId: string) => { + void analytics.track('view_transaction'); + return openTxInExplorer(txId); + }; + const transactionList = ( <> <TransactionList @@ -94,7 +107,7 @@ export const Home: FC = () => { activeTxIdRef={focusedTxIdRef} key={pendingTxs.tx_id} tx={pendingTxs} - onSelectTx={openTxInExplorer} + onSelectTx={openTxInExplorerTracked} /> ))} {txs.map(tx => ( @@ -103,7 +116,7 @@ export const Home: FC = () => { activeTxIdRef={focusedTxIdRef} key={tx.tx.tx_id} txWithEvents={tx} - onSelectTx={openTxInExplorer} + onSelectTx={openTxInExplorerTracked} /> ))} </TransactionList> @@ -146,6 +159,9 @@ export const Home: FC = () => { stackingCard={isDelegated ? <DelegationCard /> : stackingCardMap[stackingCardState]} stackingRewardCard={stackingRewardCard} /> + <Switch> + <Route exact path={routes.HOME_REQUEST_DIAGNOSTICS} component={RequestDiagnosticsModal} /> + </Switch> </> ); }; diff --git a/app/pages/onboarding/00-terms/terms.tsx b/app/pages/onboarding/00-terms/terms.tsx index b60aad1de..1b85f56df 100644 --- a/app/pages/onboarding/00-terms/terms.tsx +++ b/app/pages/onboarding/00-terms/terms.tsx @@ -234,7 +234,7 @@ export const Terms: React.FC = () => { Close </OnboardingButton> <OnboardingButton - onClick={() => history.push(routes.WELCOME)} + onClick={() => history.push(routes.REQUEST_DIAGNOSTICS)} ml="base" data-test={OnboardingSelector.BtnAcceptTerms} > diff --git a/app/pages/onboarding/01-diagnostics/diagnostics.tsx b/app/pages/onboarding/01-diagnostics/diagnostics.tsx new file mode 100644 index 000000000..ece2d7b8d --- /dev/null +++ b/app/pages/onboarding/01-diagnostics/diagnostics.tsx @@ -0,0 +1,43 @@ +import React, { memo } from 'react'; +import { useDispatch } from 'react-redux'; +import { useHistory } from 'react-router-dom'; +import { Flex } from '@stacks/ui'; + +import routes from '@constants/routes.json'; +import { Onboarding, OnboardingTitle } from '@components/onboarding'; +import { useBackButton } from '@hooks/use-back-url'; +import { AllowDiagnosticsLayout } from '@components/request-diagnostics.layout'; +import { grantDiagnosticsPermission, revokeDiagnosticPermission } from '@store/settings'; + +export const Diagnostics: React.FC = memo(() => { + const history = useHistory(); + const dispatch = useDispatch(); + useBackButton(routes.TERMS); + + return ( + <Onboarding maxWidth="800px" px="base-loose"> + <OnboardingTitle mb="base" mt="extra-loose"> + Help us improve + </OnboardingTitle> + <Flex + flexDirection="column" + justifyContent="center" + textAlign="center" + alignItems="center" + mt="extra-loose" + pb="extra-loose" + > + <AllowDiagnosticsLayout + onUserAllowDiagnostics={() => { + dispatch(grantDiagnosticsPermission()); + history.push(routes.WELCOME); + }} + onUserDenyDiagnosticsPermissions={() => { + dispatch(revokeDiagnosticPermission()); + history.push(routes.WELCOME); + }} + /> + </Flex> + </Onboarding> + ); +}); diff --git a/app/pages/onboarding/01-welcome/welcome.tsx b/app/pages/onboarding/02-welcome/welcome.tsx similarity index 88% rename from app/pages/onboarding/01-welcome/welcome.tsx rename to app/pages/onboarding/02-welcome/welcome.tsx index 2f281be9c..1b7c8a05a 100644 --- a/app/pages/onboarding/01-welcome/welcome.tsx +++ b/app/pages/onboarding/02-welcome/welcome.tsx @@ -9,12 +9,11 @@ import { OnboardingText, } from '@components/onboarding'; import { useBackButton } from '@hooks/use-back-url'; -import { WalletWarning } from '@components/wallet-warning'; import { OnboardingSelector } from 'app/tests/features/onboarding.selectors'; export const Welcome: React.FC = () => { const history = useHistory(); - useBackButton(routes.TERMS); + useBackButton(routes.REQUEST_DIAGNOSTICS); return ( <Onboarding> @@ -33,7 +32,6 @@ export const Welcome: React.FC = () => { > I already have a wallet </OnboardingButton> - <WalletWarning mt="extra-loose" /> </Onboarding> ); }; diff --git a/app/pages/onboarding/02-create-wallet/create-wallet.tsx b/app/pages/onboarding/03-create-wallet/create-wallet.tsx similarity index 100% rename from app/pages/onboarding/02-create-wallet/create-wallet.tsx rename to app/pages/onboarding/03-create-wallet/create-wallet.tsx diff --git a/app/pages/onboarding/03-restore-wallet/restore-wallet.tsx b/app/pages/onboarding/04-restore-wallet/restore-wallet.tsx similarity index 94% rename from app/pages/onboarding/03-restore-wallet/restore-wallet.tsx rename to app/pages/onboarding/04-restore-wallet/restore-wallet.tsx index 3aca154a8..1beef1a3c 100644 --- a/app/pages/onboarding/03-restore-wallet/restore-wallet.tsx +++ b/app/pages/onboarding/04-restore-wallet/restore-wallet.tsx @@ -20,6 +20,7 @@ import { import { ExternalLink } from '@components/external-link'; import { parseSeedPhraseInput } from '@utils/parse-seed-phrase'; import { OnboardingSelector } from 'app/tests/features/onboarding.selectors'; +import { useAnalytics } from '@hooks/use-analytics'; export const RestoreWallet: React.FC = () => { useBackButton(routes.WELCOME); @@ -29,6 +30,7 @@ export const RestoreWallet: React.FC = () => { const [error, setError] = useState<string | null>(null); const history = useHistory(); const dispatch = useDispatch(); + const analytics = useAnalytics(); const handleMnemonicInput = (e: React.FormEvent<HTMLInputElement>) => { if (hasSubmitted) setHasSubmitted(false); @@ -44,6 +46,7 @@ export const RestoreWallet: React.FC = () => { if (parsedMnemonic === null) { setError('Unable to parse Secret Key input'); + void analytics.track('submit_invalid_secret_key'); return; } @@ -51,10 +54,12 @@ export const RestoreWallet: React.FC = () => { if (mnemonicLength !== 12 && mnemonicLength !== 24) { setError('The Hiro Wallet can be used with only 12 and 24-word Secret Keys'); + void analytics.track('submit_invalid_secret_key'); return; } if (!validateMnemonic(parsedMnemonic)) { + void analytics.track('submit_invalid_secret_key'); setError('bip39error'); return; } diff --git a/app/pages/onboarding/04-connect-ledger/connect-ledger.tsx b/app/pages/onboarding/05-connect-ledger/connect-ledger.tsx similarity index 100% rename from app/pages/onboarding/04-connect-ledger/connect-ledger.tsx rename to app/pages/onboarding/05-connect-ledger/connect-ledger.tsx diff --git a/app/pages/onboarding/04-generating-secret/generating-secret.tsx b/app/pages/onboarding/05-generating-secret/generating-secret.tsx similarity index 100% rename from app/pages/onboarding/04-generating-secret/generating-secret.tsx rename to app/pages/onboarding/05-generating-secret/generating-secret.tsx diff --git a/app/pages/onboarding/05-secret-key/secret-key.tsx b/app/pages/onboarding/06-secret-key/secret-key.tsx similarity index 89% rename from app/pages/onboarding/05-secret-key/secret-key.tsx rename to app/pages/onboarding/06-secret-key/secret-key.tsx index e5cf3d328..27238b424 100644 --- a/app/pages/onboarding/05-secret-key/secret-key.tsx +++ b/app/pages/onboarding/06-secret-key/secret-key.tsx @@ -15,6 +15,7 @@ import { } from '@components/onboarding'; import { selectMnemonic } from '@store/keys/keys.reducer'; import { useBackButton } from '@hooks/use-back-url'; +import { useAnalytics } from '@hooks/use-analytics'; export const SecretKey: React.FC = () => { const history = useHistory(); @@ -28,6 +29,11 @@ export const SecretKey: React.FC = () => { } const { onCopy, hasCopied } = useClipboard(mnemonic); + const analytics = useAnalytics(); + const onCopyTracked = () => { + void analytics.track('copy_secret_key_to_clipboard'); + onCopy(); + }; return ( <Onboarding> @@ -40,7 +46,7 @@ export const SecretKey: React.FC = () => { <Text textStyle="body.small" mt="loose" mx="loose" lineHeight="20px" display="block"> {mnemonic} </Text> - <Button variant="link" mt="tight" onClick={onCopy}> + <Button variant="link" mt="tight" onClick={onCopyTracked}> <Text textStyle="caption.medium" fontSize="12px"> Copy to clipboard </Text> diff --git a/app/pages/onboarding/06-verify-key/verify-key.tsx b/app/pages/onboarding/07-verify-key/verify-key.tsx similarity index 90% rename from app/pages/onboarding/06-verify-key/verify-key.tsx rename to app/pages/onboarding/07-verify-key/verify-key.tsx index 8d80c6537..d095ed301 100644 --- a/app/pages/onboarding/06-verify-key/verify-key.tsx +++ b/app/pages/onboarding/07-verify-key/verify-key.tsx @@ -17,6 +17,7 @@ import { OnboardingFooter, OnboardingFooterLink, } from '@components/onboarding'; +import { useAnalytics } from '@hooks/use-analytics'; export const VerifyKey: React.FC = () => { const history = useHistory(); @@ -24,6 +25,7 @@ export const VerifyKey: React.FC = () => { const mnemonic = useSelector(selectMnemonic); const [inputMnemonic, setInputMnemonic] = useState(''); const [hasSubmitted, setHasSubmitted] = useState(false); + const analytics = useAnalytics(); const mnemonicCorrect = mnemonic === inputMnemonic; @@ -36,7 +38,11 @@ export const VerifyKey: React.FC = () => { const handleMnemonicValidation = (e: React.FormEvent) => { e.preventDefault(); setHasSubmitted(true); - if (!mnemonicCorrect) return; + if (!mnemonicCorrect) { + void analytics.track('submit_invalid_secret_key'); + return; + } + void analytics.track('submit_valid_secret_key'); history.push(routes.SET_PASSWORD); }; diff --git a/app/pages/onboarding/07-set-password/set-password.tsx b/app/pages/onboarding/08-set-password/set-password.tsx similarity index 96% rename from app/pages/onboarding/07-set-password/set-password.tsx rename to app/pages/onboarding/08-set-password/set-password.tsx index b5fb440a1..439b99707 100644 --- a/app/pages/onboarding/07-set-password/set-password.tsx +++ b/app/pages/onboarding/08-set-password/set-password.tsx @@ -21,6 +21,7 @@ import { import { ExplainerTooltip } from '@components/tooltip'; import { blastUndoStackToRemovePasswordFromMemory } from '@utils/blast-undo-stack'; import { OnboardingSelector } from 'app/tests/features/onboarding.selectors'; +import { useAnalytics } from '@hooks/use-analytics'; const weakPasswordWarningMessage = (result: ValidatedPassword) => { if (result.isMnemonicPhrase) { @@ -51,6 +52,7 @@ export const SetPassword: React.FC = () => { const [hasSubmitted, setHasSubmitted] = useState(false); const [btnDisabled, setBtnDisabled] = useState(false); const [successfullyChosenStrongPass, setSuccessfullyChosenStrongPass] = useState(false); + const analytics = useAnalytics(); const handleBack = useCallback(() => { history.goBack(); @@ -76,8 +78,11 @@ export const SetPassword: React.FC = () => { if (result.meetsAllStrengthRequirements) { setBtnDisabled(true); setSuccessfullyChosenStrongPass(true); + void analytics.track('submit_valid_password'); blastUndoStackToRemovePasswordFromMemory(passwordInputRef.current); dispatch(setSoftwareWallet({ password, history })); + } else { + void analytics.track('submit_invalid_password'); } }; diff --git a/app/pages/onboarding/index.ts b/app/pages/onboarding/index.ts index c2cafc6f9..329694f4b 100644 --- a/app/pages/onboarding/index.ts +++ b/app/pages/onboarding/index.ts @@ -1,9 +1,9 @@ export * from './00-terms/terms'; -export * from './01-welcome/welcome'; -export * from './02-create-wallet/create-wallet'; -export * from './03-restore-wallet/restore-wallet'; -export * from './04-connect-ledger/connect-ledger'; -export * from './04-generating-secret/generating-secret'; -export * from './05-secret-key/secret-key'; -export * from './06-verify-key/verify-key'; -export * from './07-set-password/set-password'; +export * from './02-welcome/welcome'; +export * from './03-create-wallet/create-wallet'; +export * from './04-restore-wallet/restore-wallet'; +export * from './05-connect-ledger/connect-ledger'; +export * from './05-generating-secret/generating-secret'; +export * from './06-secret-key/secret-key'; +export * from './07-verify-key/verify-key'; +export * from './08-set-password/set-password'; diff --git a/app/pages/root.tsx b/app/pages/root.tsx index c0f7c0e3a..f9dacb61b 100644 --- a/app/pages/root.tsx +++ b/app/pages/root.tsx @@ -8,6 +8,7 @@ import { color, CSSReset } from '@stacks/ui'; import { Store } from '@store/index'; import { Routes } from '../routes'; import { loadFonts } from '@utils/load-fonts'; +import { Toaster } from 'react-hot-toast'; import { css, Global } from '@emotion/react'; const GlobalStyle = css` @@ -47,7 +48,6 @@ interface RootProps { export interface BackContext { backUrl: null | string | (() => void); - setBackUrl(url: null | string | (() => void)): void; } @@ -68,6 +68,7 @@ function Root({ store, history, persistor }: RootProps) { <BackActionContext.Provider value={{ backUrl, setBackUrl }}> <Global styles={GlobalStyle} /> {CSSReset} + <Toaster position="bottom-center" /> <ConnectedRouter history={history}> <Routes /> </ConnectedRouter> diff --git a/app/components/settings/node-select-item.tsx b/app/pages/settings/components/node-select-item.tsx similarity index 100% rename from app/components/settings/node-select-item.tsx rename to app/pages/settings/components/node-select-item.tsx diff --git a/app/components/settings/node-select.tsx b/app/pages/settings/components/node-select.tsx similarity index 100% rename from app/components/settings/node-select.tsx rename to app/pages/settings/components/node-select.tsx diff --git a/app/pages/settings/settings-layout.tsx b/app/pages/settings/components/settings-layout.tsx similarity index 94% rename from app/pages/settings/settings-layout.tsx rename to app/pages/settings/components/settings-layout.tsx index 66fe52b18..4749cdd42 100644 --- a/app/pages/settings/settings-layout.tsx +++ b/app/pages/settings/components/settings-layout.tsx @@ -5,7 +5,7 @@ import { Screen } from '@components/screen'; export const SettingsLayout: FC = ({ children }) => ( <Screen> - <Box mt="68px"> + <Box mt="68px" pb="84px"> <Text as="h1" textStyle="display.large" fontSize="32px" display="block"> Settings </Text> diff --git a/app/components/settings/settings-section.tsx b/app/pages/settings/components/settings-section.tsx similarity index 59% rename from app/components/settings/settings-section.tsx rename to app/pages/settings/components/settings-section.tsx index 8fb6e5f60..093da729f 100644 --- a/app/components/settings/settings-section.tsx +++ b/app/pages/settings/components/settings-section.tsx @@ -1,12 +1,12 @@ import React, { FC } from 'react'; -import { Box, Text } from '@stacks/ui'; +import { Box, Text, BoxProps } from '@stacks/ui'; -interface SettingSectionProps { +interface SettingSectionProps extends BoxProps { title: string; } -export const SettingSection: FC<SettingSectionProps> = ({ title, children }) => ( - <Box as="section"> +export const SettingSection: FC<SettingSectionProps> = ({ title, children, ...props }) => ( + <Box as="section" {...props}> <Text textStyle="display.small" mt="68px" display="block"> {title} </Text> diff --git a/app/pages/settings/settings-appearance.tsx b/app/pages/settings/settings-appearance.tsx new file mode 100644 index 000000000..e95b5bd5c --- /dev/null +++ b/app/pages/settings/settings-appearance.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import toast from 'react-hot-toast'; +import { Button, useColorMode } from '@stacks/ui'; + +import { SettingDescription } from './components/settings-layout'; +import { SettingSection } from './components/settings-section'; + +export const SettingsAppearance = () => { + const { colorMode } = useColorMode(); + + return ( + <SettingSection title="Theme"> + <SettingDescription> + You're currently using the {colorMode} theme. <br />{' '} + <Button + mt="base" + onClick={() => { + void main.theme.setSystemMode(); + toast('Using system color mode'); + }} + > + Use system color mode + </Button> + </SettingDescription> + </SettingSection> + ); +}; diff --git a/app/pages/settings/settings-diagnostics.tsx b/app/pages/settings/settings-diagnostics.tsx new file mode 100644 index 000000000..5e530a358 --- /dev/null +++ b/app/pages/settings/settings-diagnostics.tsx @@ -0,0 +1,42 @@ +import React, { memo } from 'react'; +import toast from 'react-hot-toast'; +import { useDispatch } from 'react-redux'; +import { Box, Flex, Text } from '@stacks/ui'; + +import { SettingDescription } from './components/settings-layout'; +import { SettingSection } from './components/settings-section'; +import { + grantDiagnosticsPermission, + revokeDiagnosticPermission, + useHasUserGivenDiagnosticPermissions, +} from '@store/settings'; + +export const SettingsDiagnostics = memo(() => { + const dispatch = useDispatch(); + const hasGivenPermission = useHasUserGivenDiagnosticPermissions(); + + const updateDiagnosticPermissions = (e: React.ChangeEvent<HTMLInputElement>) => { + const diagnosticsEnabled = e.target.checked; + toast(diagnosticsEnabled ? 'Diagnostics enabled' : 'Diagnostics disabled'); + dispatch(diagnosticsEnabled ? grantDiagnosticsPermission() : revokeDiagnosticPermission()); + main.setDiagnosticPermission(diagnosticsEnabled); + }; + + return ( + <SettingSection title="Diagnostics"> + <SettingDescription> + Anonymous diagnostic information helps us improve the Hiro Wallet + <Flex as="label" textStyle="body.small" mt="base"> + <Box mr="tight" mt="1px"> + <input + type="checkbox" + defaultChecked={!!hasGivenPermission} + onChange={e => updateDiagnosticPermissions(e)} + /> + </Box> + <Text userSelect="none">Enable diagnostics</Text> + </Flex> + </SettingDescription> + </SettingSection> + ); +}); diff --git a/app/pages/settings/settings-manage-nodes.tsx b/app/pages/settings/settings-manage-nodes.tsx new file mode 100644 index 000000000..67a20a38b --- /dev/null +++ b/app/pages/settings/settings-manage-nodes.tsx @@ -0,0 +1,56 @@ +import { useSelector, useDispatch } from 'react-redux'; +import { UpsertStacksNodeSettingsModal } from '@modals/upsert-stacks-node-api/upsert-stacks-node-api'; +import { Button } from '@stacks/ui'; +import React, { useState } from 'react'; +import { NodeSelect } from './components/node-select'; +import { NodeSelectItem } from './components/node-select-item'; +import { SettingDescription } from './components/settings-layout'; +import { SettingSection } from './components/settings-section'; +import { + selectStacksNodeApis, + upsertStacksNodeApi, + selectActiveNodeApi, + setActiveStacksNode, + removeStacksNodeApi, + defaultNode, +} from '@store/stacks-node'; +import { RootState } from '@store/index'; + +export const SettingsManageNodes = () => { + const dispatch = useDispatch(); + + const { nodes, selectedNodeApi } = useSelector((state: RootState) => ({ + nodes: selectStacksNodeApis(state), + selectedNodeApi: selectActiveNodeApi(state), + })); + const [nodeModalOpen, setNodeModalOpen] = useState(false); + const [operation, setOperation] = useState<'create' | 'update'>('create'); + + return ( + <SettingSection title="Node settings"> + <SettingDescription>Select the node you'd like to use</SettingDescription> + <UpsertStacksNodeSettingsModal + isOpen={nodeModalOpen} + selectedNode={operation === 'update' ? selectedNodeApi : undefined} + onUpdateNode={node => dispatch(upsertStacksNodeApi(node))} + onClose={() => setNodeModalOpen(false)} + /> + <NodeSelect> + {[defaultNode, ...nodes].map((node, i) => ( + <NodeSelectItem + key={i} + index={i} + node={node} + activeNode={selectedNodeApi} + onChange={nodeId => dispatch(setActiveStacksNode(nodeId))} + onEdit={() => (setOperation('update'), setNodeModalOpen(true))} + onDelete={nodeId => dispatch(removeStacksNodeApi(nodeId))} + /> + ))} + </NodeSelect> + <Button mt="loose" onClick={() => (setOperation('create'), setNodeModalOpen(true))}> + Add a node + </Button> + </SettingSection> + ); +}; diff --git a/app/pages/settings/settings-reset-wallet.tsx b/app/pages/settings/settings-reset-wallet.tsx new file mode 100644 index 000000000..f6df333d4 --- /dev/null +++ b/app/pages/settings/settings-reset-wallet.tsx @@ -0,0 +1,41 @@ +import React, { useState } from 'react'; + +import { Button, color, Text } from '@stacks/ui'; + +import { ResetWalletModal } from '@modals/reset-wallet/reset-wallet-modal'; +import { useWalletType } from '@hooks/use-wallet-type'; + +import { SettingDescription } from './components/settings-layout'; +import { SettingSection } from './components/settings-section'; +import { SettingsSelectors } from 'app/tests/features/settings.selectors'; + +export const SettingsResetWallet = () => { + const [resetModalOpen, setResetModalOpen] = useState(false); + const { whenWallet } = useWalletType(); + + return ( + <SettingSection title="Reset wallet"> + <SettingDescription> + When you reset your wallet, you will need to + {whenWallet({ + software: ' sign back in with your 24-word Secret Key.', + ledger: ' reauthenticate with your Ledger device', + })} + <br /> + <Text mt="base-tight" display="block" color="ink.600" textStyle="caption"> + Your wallet data can be found in: <code>{main.getUserDataPath()}</code> + </Text> + </SettingDescription> + <ResetWalletModal isOpen={resetModalOpen} onClose={() => setResetModalOpen(false)} /> + + <Button + mt="loose" + style={{ background: color('feedback-error') }} + data-test={SettingsSelectors.BtnOpenResetModal} + onClick={() => setResetModalOpen(true)} + > + Reset wallet + </Button> + </SettingSection> + ); +}; diff --git a/app/pages/settings/settings.tsx b/app/pages/settings/settings.tsx index 1746e6fd3..655b72798 100644 --- a/app/pages/settings/settings.tsx +++ b/app/pages/settings/settings.tsx @@ -1,100 +1,23 @@ -import React, { useState } from 'react'; -import { useSelector, useDispatch } from 'react-redux'; -import { Button, Text, color, useColorMode } from '@stacks/ui'; +import React from 'react'; -import { SettingsSelectors } from 'app/tests/features/settings.selectors'; import routes from '@constants/routes.json'; import { useBackButton } from '@hooks/use-back-url'; -import { ResetWalletModal } from '@modals/reset-wallet/reset-wallet-modal'; -import { RootState } from '@store/index'; -import { - selectStacksNodeApis, - upsertStacksNodeApi, - selectActiveNodeApi, - setActiveStacksNode, - removeStacksNodeApi, - defaultNode, -} from '@store/stacks-node'; -import { UpsertStacksNodeSettingsModal } from '@modals/upsert-stacks-node-api/upsert-stacks-node-api'; -import { NodeSelect } from '@components/settings/node-select'; -import { NodeSelectItem } from '@components/settings/node-select-item'; -import { SettingSection } from '@components/settings/settings-section'; - -import { SettingsLayout, SettingDescription } from './settings-layout'; -import { useWalletType } from '@hooks/use-wallet-type'; +import { SettingsLayout } from './components/settings-layout'; +import { SettingsManageNodes } from './settings-manage-nodes'; +import { SettingsAppearance } from './settings-appearance'; +import { SettingsDiagnostics } from './settings-diagnostics'; +import { SettingsResetWallet } from './settings-reset-wallet'; export const Settings = () => { - const dispatch = useDispatch(); - const { colorMode } = useColorMode(); - const { nodes, selectedNodeApi } = useSelector((state: RootState) => ({ - nodes: selectStacksNodeApis(state), - selectedNodeApi: selectActiveNodeApi(state), - })); - const [resetModalOpen, setResetModalOpen] = useState(false); - const [nodeModalOpen, setNodeModalOpen] = useState(false); - const [operation, setOperation] = useState<'create' | 'update'>('create'); - const { whenWallet } = useWalletType(); useBackButton(routes.HOME); return ( <SettingsLayout> - <SettingSection title="Node settings"> - <SettingDescription>Select the node you'd like to use</SettingDescription> - <UpsertStacksNodeSettingsModal - isOpen={nodeModalOpen} - selectedNode={operation === 'update' ? selectedNodeApi : undefined} - onUpdateNode={node => dispatch(upsertStacksNodeApi(node))} - onClose={() => setNodeModalOpen(false)} - /> - <NodeSelect> - {[defaultNode, ...nodes].map((node, i) => ( - <NodeSelectItem - key={i} - index={i} - node={node} - activeNode={selectedNodeApi} - onChange={nodeId => dispatch(setActiveStacksNode(nodeId))} - onEdit={() => (setOperation('update'), setNodeModalOpen(true))} - onDelete={nodeId => dispatch(removeStacksNodeApi(nodeId))} - /> - ))} - </NodeSelect> - <Button mt="loose" onClick={() => (setOperation('create'), setNodeModalOpen(true))}> - Add a node - </Button> - </SettingSection> - <SettingSection title="Theme"> - <SettingDescription> - You're currently using the {colorMode} theme. <br />{' '} - <Button mt="base" onClick={() => main.theme.setSystemMode()}> - Use system color mode - </Button> - </SettingDescription> - </SettingSection> - <SettingSection title="Reset wallet"> - <SettingDescription> - When you reset your wallet, you will need to - {whenWallet({ - software: ' sign back in with your 24-word Secret Key.', - ledger: ' reauthenticate with your Ledger device', - })} - <br /> - <Text mt="base-tight" display="block" color="ink.600" textStyle="caption"> - Your wallet data can be found in: <code>{main.getUserDataPath()}</code> - </Text> - </SettingDescription> - <ResetWalletModal isOpen={resetModalOpen} onClose={() => setResetModalOpen(false)} /> - - <Button - mt="loose" - style={{ background: color('feedback-error') }} - data-test={SettingsSelectors.BtnOpenResetModal} - onClick={() => setResetModalOpen(true)} - > - Reset wallet - </Button> - </SettingSection> + <SettingsManageNodes /> + <SettingsAppearance /> + <SettingsDiagnostics /> + <SettingsResetWallet /> </SettingsLayout> ); }; diff --git a/app/pages/stacking/direct-stacking/components/choose-direct-stacking-amount.tsx b/app/pages/stacking/direct-stacking/components/choose-direct-stacking-amount.tsx index 238ab18ce..377b79d47 100644 --- a/app/pages/stacking/direct-stacking/components/choose-direct-stacking-amount.tsx +++ b/app/pages/stacking/direct-stacking/components/choose-direct-stacking-amount.tsx @@ -12,7 +12,7 @@ import { ExternalLink } from '@components/external-link'; import { useBalance } from '@hooks/use-balance'; import { - STACKING_CONTRACT_CALL_FEE, + STACKING_CONTRACT_CALL_TX_BYTES, STACKING_LEARN_MORE_URL, STACKING_MINIMIUM_FOR_NEXT_CYCLE_URL, } from '@constants/index'; @@ -45,7 +45,7 @@ export const ChooseDirectStackingAmountField: FC<ChooseAmountFieldProps> = props const setMax = useCallback(() => { const updatedAmount = new BigNumberFloorRound( - microStxToStx(availableBalance.minus(STACKING_CONTRACT_CALL_FEE).toString()) + microStxToStx(availableBalance.minus(STACKING_CONTRACT_CALL_TX_BYTES).toString()) ).decimalPlaces(0); void helpers.setValue(updatedAmount.toString()); }, [availableBalance, helpers]); diff --git a/app/pages/stacking/direct-stacking/components/direct-stacking-info-card.tsx b/app/pages/stacking/direct-stacking/components/direct-stacking-info-card.tsx index 1535603ad..e5d205761 100644 --- a/app/pages/stacking/direct-stacking/components/direct-stacking-info-card.tsx +++ b/app/pages/stacking/direct-stacking/components/direct-stacking-info-card.tsx @@ -7,8 +7,7 @@ import { Box, Flex, FlexProps, Text } from '@stacks/ui'; import { Hr } from '@components/hr'; import { selectPoxInfo } from '@store/stacking'; -import { useCalculateFee } from '@hooks/use-calculate-fee'; -import { STACKING_CONTRACT_CALL_FEE, UI_IMPOSED_MAX_STACKING_AMOUNT_USTX } from '@constants/index'; +import { UI_IMPOSED_MAX_STACKING_AMOUNT_USTX } from '@constants/index'; import { truncateMiddle } from '@utils/tx-utils'; import { parseNumericalFormInput } from '@utils/form/parse-numerical-form-input'; import { stxToMicroStx, toHumanReadableStx } from '@utils/unit-convert'; @@ -29,12 +28,11 @@ interface StackingInfoCardProps extends FlexProps { blocksPerCycle: number; btcAddress: string; amount: number | string | null; + fee: BigNumber; } - export const DirectStackingInfoCard: FC<StackingInfoCardProps> = props => { - const { cycles, duration, amount, btcAddress, blocksPerCycle, startDate, ...rest } = props; + const { cycles, duration, amount, btcAddress, blocksPerCycle, startDate, fee, ...rest } = props; - const calcFee = useCalculateFee(); const poxInfo = useSelector(selectPoxInfo); const amountToBeStacked = useMemo( @@ -125,7 +123,7 @@ export const DirectStackingInfoCard: FC<StackingInfoCardProps> = props => { <Section> <Row> <Label>Fee</Label> - <Value>{toHumanReadableStx(calcFee(STACKING_CONTRACT_CALL_FEE).toString())}</Value> + <Value>{toHumanReadableStx(fee).toString()}</Value> </Row> </Section> </Group> diff --git a/app/pages/stacking/direct-stacking/direct-stacking.tsx b/app/pages/stacking/direct-stacking/direct-stacking.tsx index c5024eed7..0c8a904f6 100644 --- a/app/pages/stacking/direct-stacking/direct-stacking.tsx +++ b/app/pages/stacking/direct-stacking/direct-stacking.tsx @@ -8,11 +8,12 @@ import { stxAmountSchema } from '@utils/validators/stx-amount-validator'; import { useBalance } from '@hooks/use-balance'; import { validateDecimalPrecision } from '@utils/form/validate-decimals'; import { stxToMicroStx, toHumanReadableStx } from '@utils/unit-convert'; -import { STACKING_CONTRACT_CALL_FEE } from '@constants/index'; +import { STACKING_CONTRACT_CALL_TX_BYTES } from '@constants/index'; import { StackingModal } from '@modals/stacking/stacking-modal'; import { btcAddressSchema } from '@utils/validators/btc-address-validator'; import { useBackButton } from '@hooks/use-back-url'; import routes from '@constants/routes.json'; +import { useCalculateFee } from '@hooks/use-calculate-fee'; import { RootState } from '@store/index'; import { selectWalletType } from '@store/keys'; import { selectActiveNodeApi } from '@store/stacks-node'; @@ -70,6 +71,9 @@ export const DirectStacking: FC = () => { poxInfo: selectPoxInfo(state), })); + const calcFee = useCalculateFee(); + const directStackingTxFee = calcFee(STACKING_CONTRACT_CALL_TX_BYTES); + if (nextCycleInfo === null || poxInfo === null) return null; const validationSchema = yup.object().shape({ @@ -86,7 +90,7 @@ export const DirectStacking: FC = () => { test: value => { if (value === null || value === undefined) return false; const uStxInput = stxToMicroStx(value); - return !uStxInput.isGreaterThan(availableBalance.minus(STACKING_CONTRACT_CALL_FEE)); + return !uStxInput.isGreaterThan(availableBalance.minus(directStackingTxFee)); }, }) .test({ @@ -126,6 +130,7 @@ export const DirectStacking: FC = () => { amountToStack={new BigNumber(formValues.amount)} numCycles={cyclesWithDefault(formValues.cycles)} poxAddress={formValues.btcAddress} + fee={directStackingTxFee} /> )} <Formik @@ -146,6 +151,7 @@ export const DirectStacking: FC = () => { startDate={nextCycleInfo.nextCycleStartingAt} blocksPerCycle={poxInfo.reward_cycle_length} duration={stackingCycleDuration} + fee={directStackingTxFee} /> <StackingGuideCard mt="loose" /> </StackingFormInfoPanel> diff --git a/app/pages/start-stacking/start-stacking.tsx b/app/pages/start-stacking/start-stacking.tsx index 99bd5c7af..b3bf11f02 100644 --- a/app/pages/start-stacking/start-stacking.tsx +++ b/app/pages/start-stacking/start-stacking.tsx @@ -8,7 +8,7 @@ import { useSelector } from 'react-redux'; import { selectPoxInfo } from '@store/stacking'; import { toHumanReadableStx } from '@utils/unit-convert'; import { useBalance } from '@hooks/use-balance'; -import { STACKING_CONTRACT_CALL_FEE } from '@constants/index'; +import { POOLED_STACKING_TX_SIZE_BYTES, STACKING_CONTRACT_CALL_TX_BYTES } from '@constants/index'; import { StartStackingLayout as Layout, StackingOptionsCardContainer as CardContainer, @@ -28,6 +28,7 @@ import { pseudoBorderLeft } from '@components/styles/pseudo-border-left'; import { IconUser, IconChartLine, IconLock, IconUserMinus } from '@tabler/icons'; import { StepsIcon } from '@components/icons/steps'; import { useModifierKey } from '@hooks/use-modifier-key'; +import { useCalculateFee } from '@hooks/use-calculate-fee'; export const ChooseStackingMethod: FC = () => { const history = useHistory(); @@ -36,17 +37,21 @@ export const ChooseStackingMethod: FC = () => { const { isPressed: holdingAltKey } = useModifierKey('alt', 1000); + const calcFee = useCalculateFee(); + const { availableBalance } = useBalance(); const poxInfo = useSelector(selectPoxInfo); if (!poxInfo) return null; - const meetsMinThreshold = availableBalance - .plus(STACKING_CONTRACT_CALL_FEE) + const meetsMinThresholdForDirectStacking = availableBalance + .plus(calcFee(STACKING_CONTRACT_CALL_TX_BYTES)) .isGreaterThanOrEqualTo(poxInfo.paddedMinimumStackingAmountMicroStx); - const sufficientBalanceToCoverFee = availableBalance.isGreaterThan(STACKING_CONTRACT_CALL_FEE); + const hasSufficientBalanceToCoverPoolingTxFee = availableBalance.isGreaterThan( + calcFee(POOLED_STACKING_TX_SIZE_BYTES) + ); return ( <Layout> @@ -83,11 +88,11 @@ export const ChooseStackingMethod: FC = () => { <Flex alignItems="center"> <OptionButton onClick={() => history.push(routes.DELEGATED_STACKING)} - isDisabled={!sufficientBalanceToCoverFee && !holdingAltKey} + isDisabled={!hasSufficientBalanceToCoverPoolingTxFee && !holdingAltKey} > Stack in a pool </OptionButton> - {!sufficientBalanceToCoverFee && <InsufficientStackingBalanceWarning />} + {!hasSufficientBalanceToCoverPoolingTxFee && <InsufficientStackingBalanceWarning />} </Flex> </Card> @@ -121,11 +126,11 @@ export const ChooseStackingMethod: FC = () => { <Flex alignItems="center"> <OptionButton onClick={() => history.push(routes.STACKING)} - isDisabled={!meetsMinThreshold && !holdingAltKey} + isDisabled={!meetsMinThresholdForDirectStacking && !holdingAltKey} > Stack by yourself </OptionButton> - {!meetsMinThreshold && <InsufficientStackingBalanceWarning />} + {!meetsMinThresholdForDirectStacking && <InsufficientStackingBalanceWarning />} </Flex> </Card> </CardContainer> diff --git a/app/preload.ts b/app/preload.ts index 54bdc4e1c..c823dd650 100644 --- a/app/preload.ts +++ b/app/preload.ts @@ -61,7 +61,8 @@ const walletApi = { // Expose protected methods that allow the renderer process to use // the ipcRenderer without exposing the entire object store: { - set: async (key: string, value: string) => ipcRenderer.invoke('store-set', { key, value }), + set: async (key: string, value: string | boolean) => + ipcRenderer.invoke('store-set', { key, value }), get: async (key: string) => ipcRenderer.invoke('store-get', { key }), delete: async (key: string) => ipcRenderer.invoke('store-delete', { key }), clear: async () => ipcRenderer.invoke('store-clear'), @@ -105,6 +106,15 @@ const walletApi = { }, }, + /** + * This method is needed to share the user's diagnostics preference + * with the `main` script, that otherwise has no way of determining + * what this state is. + */ + setDiagnosticPermission(updatedPermission: boolean) { + return ipcRenderer.send('set-diagnostics-permission', updatedPermission); + }, + ledger: { createListener: () => ipcRenderer.send('create-ledger-listener'), removeListener: () => ipcRenderer.send('remove-ledger-listener'), diff --git a/app/routes.tsx b/app/routes.tsx index a8d98e864..b4757ddf7 100644 --- a/app/routes.tsx +++ b/app/routes.tsx @@ -1,6 +1,7 @@ -import React from 'react'; +import React, { useEffect } from 'react'; import { Switch, Route, Redirect } from 'react-router-dom'; import { useStore } from 'react-redux'; +import * as Sentry from '@sentry/react'; import routes from './constants/routes.json'; import { Home } from './pages/home/home'; @@ -23,16 +24,43 @@ import { Settings } from './pages/settings/settings'; import { DirectStacking } from './pages/stacking/direct-stacking/direct-stacking'; import { ChooseStackingMethod } from './pages/start-stacking/start-stacking'; import { StackingDelegation } from './pages/stacking/delegated-stacking/pooled-stacking'; +import { useHasUserGivenDiagnosticPermissions } from '@store/settings'; +import { Diagnostics } from './pages/onboarding/01-diagnostics/diagnostics'; +import { initSegment } from '@utils/init-segment'; + +let diagnosticsEnabled = false; + +if (process.env.SENTRY_DSN) { + Sentry.init({ + dsn: process.env.SENTRY_DSN, + beforeSend(event) { + if (!diagnosticsEnabled) return null; + return event; + }, + }); +} + +initSegment(); + +Sentry.setContext('network', { network: process.env.STX_NETWORK }); export const routerConfig = [ { path: routes.HOME, component: Home, }, + { + path: routes.HOME_REQUEST_DIAGNOSTICS, + component: Home, + }, { path: routes.TERMS, component: Terms, }, + { + path: routes.REQUEST_DIAGNOSTICS, + component: Diagnostics, + }, { path: routes.WELCOME, component: Welcome, @@ -92,6 +120,12 @@ const getAppStartingRoute = (address?: string) => (!!address ? routes.HOME : rou export function Routes() { // `useStore` required as we only want the value on initial render const store = useStore(); + const diagnosticPermission = useHasUserGivenDiagnosticPermissions(); + + useEffect(() => { + diagnosticsEnabled = !!diagnosticPermission; + }, [diagnosticPermission]); + const address = selectAddress(store.getState()); return ( <App> @@ -100,7 +134,7 @@ export function Routes() { <Route key={i} exact {...route} /> ))} </Switch> - <Redirect exact from="/" to={getAppStartingRoute(address)} /> + <Redirect to={getAppStartingRoute(address)} /> </App> ); } diff --git a/app/store/index.ts b/app/store/index.ts index b609bbded..46175ed8c 100644 --- a/app/store/index.ts +++ b/app/store/index.ts @@ -6,6 +6,7 @@ import { PersistConfig } from 'redux-persist'; import { KeysState, createKeysReducer } from './keys'; import { TransactionState, transactionReducer } from './transaction'; import { addressReducer, AddressState } from './address'; +import { settingsReducer, SettingsState } from './settings'; import { HomeState, homeSlice } from './home'; import { pendingTransactionReducer, PendingTransactionState } from './pending-transaction'; import { stacksNodeReducer, StacksNodeState } from './stacks-node'; @@ -22,6 +23,7 @@ export interface RootState { home: HomeState; stacksNode: StacksNodeState; stacking: StackingState; + settings: SettingsState; _persist: any; } @@ -32,7 +34,7 @@ export type Store = ReduxStore<RootState, Action<string>>; export const persistConfig: PersistConfig<RootState> = { key: 'root', storage: reduxPersistElectronStore(), - whitelist: ['stacksNode'], + whitelist: ['stacksNode', 'settings'], }; interface RootReducerArgs { @@ -50,6 +52,7 @@ export function createRootReducer({ history, keys }: RootReducerArgs) { home: homeSlice.reducer, stacksNode: stacksNodeReducer, stacking: stackingSlice.reducer, + settings: settingsReducer, }); } diff --git a/app/store/settings/index.ts b/app/store/settings/index.ts new file mode 100644 index 000000000..c75c90c9c --- /dev/null +++ b/app/store/settings/index.ts @@ -0,0 +1,3 @@ +export * from './settings.reducer'; +export * from './settings.actions'; +export * from './settings.hooks'; diff --git a/app/store/settings/settings.actions.ts b/app/store/settings/settings.actions.ts new file mode 100644 index 000000000..c3251f27b --- /dev/null +++ b/app/store/settings/settings.actions.ts @@ -0,0 +1,4 @@ +import { createAction } from '@reduxjs/toolkit'; + +export const grantDiagnosticsPermission = createAction('settings/grant-diagnostic-permissions'); +export const revokeDiagnosticPermission = createAction('settings/revoke-diagnostic-permissions'); diff --git a/app/store/settings/settings.hooks.ts b/app/store/settings/settings.hooks.ts new file mode 100644 index 000000000..9da6b0dce --- /dev/null +++ b/app/store/settings/settings.hooks.ts @@ -0,0 +1,7 @@ +import { useSelector } from 'react-redux'; + +import { selectHasUserGivenDiagnosticPermission } from './settings.reducer'; + +export function useHasUserGivenDiagnosticPermissions() { + return useSelector(selectHasUserGivenDiagnosticPermission); +} diff --git a/app/store/settings/settings.reducer.ts b/app/store/settings/settings.reducer.ts new file mode 100644 index 000000000..ed1c39114 --- /dev/null +++ b/app/store/settings/settings.reducer.ts @@ -0,0 +1,27 @@ +import { createReducer, createSelector } from '@reduxjs/toolkit'; + +import { RootState } from '..'; +import { grantDiagnosticsPermission, revokeDiagnosticPermission } from './settings.actions'; + +export interface SettingsState { + diagnosticPermission: boolean | undefined; +} + +const initialState: SettingsState = { diagnosticPermission: undefined }; + +function setDiagnosticPermissionTo(givenPermission: boolean) { + return (state: SettingsState) => ({ ...state, diagnosticPermission: givenPermission }); +} + +export const settingsReducer = createReducer(initialState, builder => + builder + .addCase(grantDiagnosticsPermission, setDiagnosticPermissionTo(true)) + .addCase(revokeDiagnosticPermission, setDiagnosticPermissionTo(false)) +); + +export const selectSettingsState = (state: RootState) => state.settings; + +export const selectHasUserGivenDiagnosticPermission = createSelector( + selectSettingsState, + state => state.diagnosticPermission +); diff --git a/app/tests/features/onboarding.feature.ts b/app/tests/features/onboarding.feature.ts index 298f7d339..3fa80fba2 100644 --- a/app/tests/features/onboarding.feature.ts +++ b/app/tests/features/onboarding.feature.ts @@ -13,6 +13,10 @@ export function createOnboardingFeature(page: Page) { return page.$(selector); }, + findAcceptDiagnosticsBtn() { + return page.$(createTestSelector(OnboardingSelector.BtnAcceptDiagnosticPermission)); + }, + findAcceptBtn() { return page.$(createTestSelector(OnboardingSelector.BtnAcceptTerms)); }, @@ -42,8 +46,8 @@ export function createOnboardingFeature(page: Page) { export function initSoftwareWallet(page: Page) { return async (seed: string, password: string) => { const onboarding = createOnboardingFeature(page); - const termsOfServicePageTitle = await onboarding.findTermsOfServiceTitle(); + const termsOfServicePageTitle = await onboarding.findTermsOfServiceTitle(); if (!termsOfServicePageTitle) { expect(termsOfServicePageTitle).toBeTruthy(); throw new Error('Test not started in clean environment, loaded a `config.json`'); @@ -55,6 +59,9 @@ export function initSoftwareWallet(page: Page) { const button = await onboarding.findAcceptBtn(); await button.click(); + const diagnosticPermissionBtn = await onboarding.findAcceptDiagnosticsBtn(); + await diagnosticPermissionBtn.click(); + const restoreWalletButton = await onboarding.findResoreWalletBtn(); await restoreWalletButton.click(); diff --git a/app/tests/features/onboarding.selectors.ts b/app/tests/features/onboarding.selectors.ts index 00b267171..09198b1a7 100644 --- a/app/tests/features/onboarding.selectors.ts +++ b/app/tests/features/onboarding.selectors.ts @@ -5,4 +5,5 @@ export enum OnboardingSelector { BtnContinueWithKey = 'btn-continue-with-key', InputPassword = 'input-password', BtnContinueFromPassword = 'btn-continue-from-password', + BtnAcceptDiagnosticPermission = 'btn-accept-diagnostic-permission', } diff --git a/app/utils/init-segment.ts b/app/utils/init-segment.ts new file mode 100644 index 000000000..7d1d541e7 --- /dev/null +++ b/app/utils/init-segment.ts @@ -0,0 +1,19 @@ +import { Analytics, AnalyticsBrowser } from '@segment/analytics-next'; + +let analytics: Analytics | null = null; + +export function initSegment() { + const writeKey = process.env.SEGMENT_WRITE_KEY; + + if (writeKey) { + AnalyticsBrowser.standalone(writeKey) + .then(res => (analytics = res)) + .catch(console.error); + } else { + console.warn('segment init aborted: No WRITE_KEY setup.'); + } +} + +export function getAnalytics() { + return analytics; +} diff --git a/configs/webpack.config.base.js b/configs/webpack.config.base.js index 4ce90730d..dd0055459 100644 --- a/configs/webpack.config.base.js +++ b/configs/webpack.config.base.js @@ -86,6 +86,8 @@ export default { new webpack.EnvironmentPlugin({ STX_NETWORK: process.env.STX_NETWORK, + SEGMENT_WRITE_KEY: process.env.SEGMENT_WRITE_KEY || '', + SENTRY_DSN: process.env.SENTRY_DSN || '', }), ], }; diff --git a/electron-builder.js b/electron-builder.js index 7041efab5..b6b18ed1f 100644 --- a/electron-builder.js +++ b/electron-builder.js @@ -82,7 +82,7 @@ const networkConfigs = { testnet: { productName: 'Hiro Wallet Testnet', appId: 'so.hiro.StacksWalletTestnet', - artifactName: 'stacks-wallet.testnet.${ext}', + artifactName: 'hiro-wallet.testnet.${ext}', mac: { icon: 'icon.testnet.icns', }, @@ -102,7 +102,7 @@ const networkConfigs = { productName: 'Hiro Wallet', appId: 'so.hiro.StacksWallet', icon: 'icon-512x512.png', - artifactName: 'stacks-wallet.mainnet.${ext}', + artifactName: 'hiro-wallet.mainnet.${ext}', mac: { icon: 'icon.icns', }, diff --git a/package.json b/package.json index c0270cde9..f4af7685e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "stacks-wallet", - "version": "4.5.3", + "version": "4.6.0-dev.5", "description": "Hiro Wallet 2.0 — Stacking", "prettier": "@stacks/prettier-config", "homepage": "https://hiro.so/wallet", @@ -44,7 +44,7 @@ "channel": "3.x" }, { - "name": "beta", + "name": "dev", "prerelease": true }, "main" @@ -209,6 +209,9 @@ "@hot-loader/react-dom": "17.0.1", "@popperjs/core": "2.9.1", "@reduxjs/toolkit": "1.5.1", + "@segment/analytics-next": "1.30.0", + "@sentry/electron": "2.5.4", + "@sentry/react": "6.13.2", "@stacks/blockchain-api-client": "0.62.3", "@stacks/ui": "7.8.0", "@stacks/ui-core": "7.3.0", @@ -244,7 +247,9 @@ "react-card-flip": "1.1.0", "react-dom": "17.0.2", "react-hot-loader": "4.13.0", + "react-hot-toast": "2.1.1", "react-hotkeys-hook": "3.3.0", + "react-icons": "4.2.0", "react-popper": "2.2.5", "react-query": "3.13.4", "react-redux": "7.2.3", diff --git a/resources/entitlements.mac.plist b/resources/entitlements.mac.plist index c7b92d694..6883e4a27 100644 --- a/resources/entitlements.mac.plist +++ b/resources/entitlements.mac.plist @@ -2,8 +2,6 @@ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> - <key>com.apple.security.cs.allow-dyld-environment-variables</key> - <true/> <key>com.apple.security.cs.allow-unsigned-executable-memory</key> <true/> <key>com.apple.security.cs.disable-library-validation</key> diff --git a/yarn.lock b/yarn.lock index faf85173f..0314424e6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1092,7 +1092,14 @@ pirates "^4.0.0" source-map-support "^0.5.16" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.8.7": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" + integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.10.5", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": version "7.13.17" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.17.tgz#8966d1fc9593bf848602f0662d6b4d0069e3a7ec" integrity sha512-NCdgJEelPTSh+FEFylhnP1ylq848l1z9t9N0j1Lfbcw0+KXGjsTvUmkxy+voLLXB5SOKMbLLx4jxYliGrYQseA== @@ -1465,6 +1472,45 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@formatjs/ecma402-abstract@1.9.8": + version "1.9.8" + resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.9.8.tgz#f3dad447fbc7f063f88e2a148b7a353161740e74" + integrity sha512-2U4n11bLmTij/k4ePCEFKJILPYwdMcJTdnKVBi+JMWBgu5O1N+XhCazlE6QXqVO1Agh2Doh0b/9Jf1mSmSVfhA== + dependencies: + "@formatjs/intl-localematcher" "0.2.20" + tslib "^2.1.0" + +"@formatjs/fast-memoize@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-1.2.0.tgz#1123bfcc5d21d761f15d8b1c32d10e1b6530355d" + integrity sha512-fObitP9Tlc31SKrPHgkPgQpGo4+4yXfQQITTCNH8AZdEqB7Mq4nPrjpUL/tNGN3lEeJcFxDbi0haX8HM7QvQ8w== + dependencies: + tslib "^2.1.0" + +"@formatjs/icu-messageformat-parser@2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.0.11.tgz#e4ba40b9a8aefc8bccfc96be5906d3bca305b4b3" + integrity sha512-5mWb8U8aulYGwnDZWrr+vdgn5PilvtrqQYQ1pvpgzQes/osi85TwmL2GqTGLlKIvBKD2XNA61kAqXYY95w4LWg== + dependencies: + "@formatjs/ecma402-abstract" "1.9.8" + "@formatjs/icu-skeleton-parser" "1.2.12" + tslib "^2.1.0" + +"@formatjs/icu-skeleton-parser@1.2.12": + version "1.2.12" + resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.2.12.tgz#45426eb1448c0c08c931eb9f0672283c0e4d0062" + integrity sha512-DTFxWmEA02ZNW6fsYjGYSADvtrqqjCYF7DSgCmMfaaE0gLP4pCdAgOPE+lkXXU+jP8iCw/YhMT2Seyk/C5lBWg== + dependencies: + "@formatjs/ecma402-abstract" "1.9.8" + tslib "^2.1.0" + +"@formatjs/intl-localematcher@0.2.20": + version "0.2.20" + resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.2.20.tgz#782aef53d1c1b6112ee67468dc59f9b8d1ba7b17" + integrity sha512-/Ro85goRZnCojzxOegANFYL0LaDIpdPjAukR7xMTjOtRx+3yyjR0ifGTOW3/Kjhmab3t6GnyHBYWZSudxEOxPA== + dependencies: + tslib "^2.1.0" + "@hot-loader/react-dom@17.0.1": version "17.0.1" resolved "https://registry.yarnpkg.com/@hot-loader/react-dom/-/react-dom-17.0.1.tgz#0c75b4dd068f819435dafb3e8809ca1749695656" @@ -1474,18 +1520,18 @@ object-assign "^4.1.1" scheduler "^0.20.1" -"@internationalized/message@3.0.0-alpha.0": - version "3.0.0-alpha.0" - resolved "https://registry.yarnpkg.com/@internationalized/message/-/message-3.0.0-alpha.0.tgz#83015e2057d2b6b5034a3e23983b1e051f9d9e36" - integrity sha512-NT2eiVq5f5z7Yi9Hmchb8GAGYjEpYbYcD4u/Oxo5XG9XFbrnz7zNvrJJlzuQ+2jPozabq6pFKurqaFmM49DYUg== +"@internationalized/message@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@internationalized/message/-/message-3.0.2.tgz#c3db2b6b7f75af815819f77da11f8424381416e3" + integrity sha512-ZZ8FQDCsri3vUB2mfDD76Vbf97DH361AiZUXKHV4BqwCtYyaNYiZqIr8KXrcMCxJvrIYVQLSn8+jeIQRO3bvtw== dependencies: "@babel/runtime" "^7.6.2" - intl-messageformat "^2.2.0" + intl-messageformat "^9.6.12" -"@internationalized/number@3.0.0-alpha.0": - version "3.0.0-alpha.0" - resolved "https://registry.yarnpkg.com/@internationalized/number/-/number-3.0.0-alpha.0.tgz#27190fbc1d73a24ac96dfafdfe7aa4e520090eed" - integrity sha512-8aOD2I3HmEscIZO/cm1jkcrYMSmRPhoW9G1OsuQb4Ge/Y9HsJVGB9otTylUEXJUmoXi/eD8Mr1gx3+0FLCM4eA== +"@internationalized/number@^3.0.2": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@internationalized/number/-/number-3.0.3.tgz#d29003dffdff54ca6f2287ec0cb77ff3d045478f" + integrity sha512-ewFoVvsxSyd9QZnknvOWPjirYqdMQhXTeDhJg3hM6C/FeZt0banpGH1nZ0SGMZXHz8NK9uAa2KVIq+jqAIOg4w== dependencies: "@babel/runtime" "^7.6.2" @@ -1705,6 +1751,18 @@ resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-5.50.0.tgz#29c6419e8379d496ab6d0426eadf3c4d100cd186" integrity sha512-swKHYCOZUGyVt4ge0u8a7AwNcA//h4nx5wIi0sruGye1IJ5Cva0GyK9L2/WdX+kWVTKp92ZiEo1df31lrWGPgA== +"@lukeed/csprng@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@lukeed/csprng/-/csprng-1.0.0.tgz#733a122382749d27e2e46ec38f8c71c9d53a9636" + integrity sha512-ruuGHsnabmObBdeMg3vKdGRmh06Oog3eFpf/Tk6X0kDSJDpJTDCj2dqdp1+0VjzIUgHlFF9GBm7uFqfYhhdX9g== + +"@lukeed/uuid@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@lukeed/uuid/-/uuid-2.0.0.tgz#1c0f33c071cb6902bc3b9e475782ada7314ef9bd" + integrity sha512-dUz8OmYvlY5A9wXaroHIMSPASpSYRLCqbPvxGSyHguhtTQIy24lC+EGxQlwv71AhRCO55WOtgwhzQLpw27JaJQ== + dependencies: + "@lukeed/csprng" "^1.0.0" + "@malept/cross-spawn-promise@^1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" @@ -1768,9 +1826,9 @@ integrity sha512-DvJbbn3dUgMxDnJLH+RZQPnXak1h4ZVYQ7CWiFWjQwBFkVajT4rfw2PdpHLTSTwxrYfnoEXkuBiwkDm6tPMQeA== "@popperjs/core@^2.8.3": - version "2.9.2" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.9.2.tgz#adea7b6953cbb34651766b0548468e743c6a2353" - integrity sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q== + version "2.10.1" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.10.1.tgz#728ecd95ab207aab8a9a4e421f0422db329232be" + integrity sha512-HnUhk1Sy9IuKrxEMdIRCxpIqPw6BFsbYSEUO9p/hNw5sMld/+3OLMWQP80F8/db9qsv3qUjs7ZR5bS/R+iinXw== "@reach/alert@^0.13.2": version "0.13.2" @@ -1822,631 +1880,858 @@ prop-types "^15.7.2" tslib "^2.1.0" -"@react-aria/breadcrumbs@^3.1.3": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@react-aria/breadcrumbs/-/breadcrumbs-3.1.3.tgz#29619b62009bc4eff828e9661e06fbf26f4c7ccd" - integrity sha512-iWW3Vf5fZMVTN+d5y7s97oFuWpI+B2agoeYzaMRqP6fkrs5CepmxEoPHYb7VtnIOX/oUXrsP/kcaZEmLMN7CJA== +"@react-aria/breadcrumbs@^3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@react-aria/breadcrumbs/-/breadcrumbs-3.1.5.tgz#d3e77a73fa31fdd504c23397c7dacb74220cd69b" + integrity sha512-0ruIP6gP4hkGyX/b3g8MeuaP7ZX9M4mvauPHvuqGHNpUAZdESMj4jHo5ERImaTUJTObC2Vid2674OyzYFITSUA== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/i18n" "^3.1.2" - "@react-aria/interactions" "^3.3.4" - "@react-aria/link" "^3.1.2" - "@react-aria/utils" "^3.7.0" - "@react-types/breadcrumbs" "^3.2.0" - "@react-types/shared" "^3.5.0" - -"@react-aria/button@^3.3.1": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@react-aria/button/-/button-3.3.1.tgz#f180ffa95e3e822b7da4937421cf8280dd17af17" - integrity sha512-LXNuo0L79AhYqnxV+Y3J3xt7hPcmCVCEpZaC/dBzovR1MLunrdpk3QAXsRt3tqza1XvoqdvNhNHQm1Z1kyBTUg== + "@react-aria/i18n" "^3.3.2" + "@react-aria/interactions" "^3.5.1" + "@react-aria/link" "^3.1.4" + "@react-aria/utils" "^3.8.2" + "@react-types/breadcrumbs" "^3.2.1" + "@react-types/shared" "^3.8.0" + +"@react-aria/button@^3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@react-aria/button/-/button-3.3.4.tgz#3af6eb4e0a479a76ba7386d541051d1273cd68fa" + integrity sha512-vebTcf9YpwaKCvsca2VWhn6eYPa15OJtMENwaGop72UrL35Oa7xDgU0RG22RAjRjt8HRVlAfLpHkJQW6GBGU3g== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/focus" "^3.2.2" - "@react-aria/i18n" "^3.3.0" - "@react-aria/interactions" "^3.3.3" - "@react-aria/utils" "^3.6.0" - "@react-stately/toggle" "^3.2.1" - "@react-types/button" "^3.3.1" - -"@react-aria/checkbox@^3.2.1": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@react-aria/checkbox/-/checkbox-3.2.1.tgz#493d9d584b4db474645a4565c4f899ee3a579f07" - integrity sha512-XnypnlVIfhB3CD7eSjSds8hNkzHgnhu0t48I1D0jYdL1O6tQC4UytPdIqlemRYBVHDloZkWerbjenpHnxhv8iA== + "@react-aria/focus" "^3.5.0" + "@react-aria/interactions" "^3.6.0" + "@react-aria/utils" "^3.9.0" + "@react-stately/toggle" "^3.2.3" + "@react-types/button" "^3.4.1" + +"@react-aria/checkbox@^3.2.3": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@react-aria/checkbox/-/checkbox-3.2.3.tgz#be7f1f881e6d0fb554b5b20b9243e31e222207d5" + integrity sha512-bLNdVefKGFA2+QT84htWHYUpxLqA5r3L4q6ilBLOzcRiKpgQM2OW2bQGLN6Zw26MKjmTzEMrR2Db+a/O5e1fUQ== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/label" "^3.1.1" - "@react-aria/toggle" "^3.1.1" - "@react-aria/utils" "^3.3.0" - "@react-stately/checkbox" "^3.0.1" - "@react-stately/toggle" "^3.2.1" - "@react-types/checkbox" "^3.2.1" - -"@react-aria/dialog@^3.1.2": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@react-aria/dialog/-/dialog-3.1.2.tgz#868970e7fdaa6ddb91a0d8d5b492778607d417fd" - integrity sha512-CUHzLdcKxnQ1IpbJOJ3BIDe762QoTOFXZfDAheNiTi24ym85w7KkW7dnfJDK2+J5RY15c5KWooOZvTaBmIJ7Xw== + "@react-aria/label" "^3.1.3" + "@react-aria/toggle" "^3.1.4" + "@react-aria/utils" "^3.8.2" + "@react-stately/checkbox" "^3.0.3" + "@react-stately/toggle" "^3.2.3" + "@react-types/checkbox" "^3.2.3" + +"@react-aria/combobox@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@react-aria/combobox/-/combobox-3.1.0.tgz#7ff16c733510e3070355023d6da3c29d2c55142b" + integrity sha512-+Mqgs79k4MrjPySA6dtD/SJfGrCFs31sVIJZ1RbYf7GEyqAI1U7T5lo3kQ7UJAEAF0RKUnQGxA/RUzk9/ZPy8Q== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-aria/i18n" "^3.3.2" + "@react-aria/interactions" "^3.6.0" + "@react-aria/listbox" "^3.3.1" + "@react-aria/live-announcer" "^3.0.1" + "@react-aria/menu" "^3.2.3" + "@react-aria/overlays" "^3.7.2" + "@react-aria/selection" "^3.6.0" + "@react-aria/textfield" "^3.4.0" + "@react-aria/utils" "^3.9.0" + "@react-stately/collections" "^3.3.3" + "@react-stately/combobox" "^3.0.1" + "@react-stately/layout" "^3.4.0" + "@react-types/button" "^3.4.1" + "@react-types/combobox" "^3.1.0" + "@react-types/shared" "^3.9.0" + +"@react-aria/dialog@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@react-aria/dialog/-/dialog-3.1.4.tgz#7fe3f33e09b75dcdf598d0523e982262d6c89220" + integrity sha512-OtQGBol3CfcbBpjqXDqXzH5Ygny44PIuyAsZ1e3dfIdtaI+XHsoglyZnvDaVVealIgedHkMubreZnyNYnlzPLg== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/focus" "^3.2.2" - "@react-aria/utils" "^3.3.0" - "@react-stately/overlays" "^3.1.1" - "@react-types/dialog" "^3.3.0" + "@react-aria/focus" "^3.4.1" + "@react-aria/utils" "^3.8.2" + "@react-stately/overlays" "^3.1.3" + "@react-types/dialog" "^3.3.1" -"@react-aria/focus@^3.2.2", "@react-aria/focus@^3.2.3", "@react-aria/focus@^3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.2.4.tgz#86c4fbde51a7cae414407b2d421fb5b311cd62f5" - integrity sha512-qoJoUDSriI7RCRq3L7yDOPtFZfquyjLA9d2pOJzvMx1F6dEqfNCaycyIg9lHykHXXhShgrXwfpyGTXoSUQpmtw== +"@react-aria/focus@^3.4.1", "@react-aria/focus@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.5.0.tgz#02b85f97d6114af1eccc0902ce40723b626cb7f9" + integrity sha512-Eib75Q6QgQdn8VVVByg5Vipaaj/C//8Bs++sQY7nkomRx4sdArOnXbDppul3YHP6mRfU9VRLvAigEUlReQF/Xw== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/interactions" "^3.3.4" - "@react-aria/utils" "^3.7.0" - "@react-types/shared" "^3.5.0" + "@react-aria/interactions" "^3.6.0" + "@react-aria/utils" "^3.9.0" + "@react-types/shared" "^3.9.0" clsx "^1.1.1" -"@react-aria/i18n@^3.1.2", "@react-aria/i18n@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@react-aria/i18n/-/i18n-3.3.0.tgz#7f92ae81f6536b19b17b89c0991ddb6c10f2512a" - integrity sha512-8KYk0tQiEf9Kd9xdF4cKliP1169WSIryKFnZgnm9dvZl96TyfDK1xJpZQy58XjRdbS/H45CKydFmMcZEElu3BQ== +"@react-aria/grid@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@react-aria/grid/-/grid-3.0.0.tgz#11adf27a5a52441c34eba59a3de0b26cbb37d7bd" + integrity sha512-0FAzGw6eZyPiYllGix23oNCDp09s3oal2z/+kuN6v4GwneBWWgE7RKIEb91ec1Wx7Rhsqc1MOcPeoJzUFsqT7A== dependencies: "@babel/runtime" "^7.6.2" - "@internationalized/message" "3.0.0-alpha.0" - "@internationalized/number" "3.0.0-alpha.0" - "@react-aria/ssr" "^3.0.1" - "@react-aria/utils" "^3.6.0" - "@react-types/shared" "^3.4.0" + "@react-aria/focus" "^3.5.0" + "@react-aria/i18n" "^3.3.2" + "@react-aria/interactions" "^3.6.0" + "@react-aria/live-announcer" "^3.0.1" + "@react-aria/selection" "^3.6.0" + "@react-aria/utils" "^3.9.0" + "@react-stately/grid" "^3.0.0" + "@react-stately/virtualizer" "^3.1.5" + "@react-types/checkbox" "^3.2.3" + "@react-types/grid" "^3.0.0" + "@react-types/shared" "^3.9.0" + +"@react-aria/i18n@^3.3.2": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@react-aria/i18n/-/i18n-3.3.2.tgz#891902938333c6ab5491b7acb7581f8567045dbc" + integrity sha512-a4AptbWLPVMJfjPdyW60TFtT4gvKAputx9YaUrIywoV/5p900AcOOc3uuL43+vuCKBzMkGUeTa1a4eL1HstDUA== + dependencies: + "@babel/runtime" "^7.6.2" + "@internationalized/message" "^3.0.2" + "@internationalized/number" "^3.0.2" + "@react-aria/ssr" "^3.0.3" + "@react-aria/utils" "^3.8.2" + "@react-types/shared" "^3.8.0" -"@react-aria/interactions@^3.2.1", "@react-aria/interactions@^3.3.3", "@react-aria/interactions@^3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.3.4.tgz#a5b3a87f886cf0f4e28cbd13fbe02c7efb4f1e2e" - integrity sha512-WzT9aIRWvLZvZvuwNKKUkZzeomZgIrquAtwgRYGWbjSbrYPOT9B3w/GBEWZDYUG0c1K8NkIEAxTX0e+QI+tqAA== +"@react-aria/interactions@^3.5.1", "@react-aria/interactions@^3.6.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.6.0.tgz#63c16e6179e8ae38221e26256d9a7639d7f9b24e" + integrity sha512-dMEGYIIhJ3uxDd19Z/rxuqQp9Rx9c46AInrfzAiOijQj/fTmb4ubCsuFOAQrc0sy1HCY1/ntnRZQuRgT/iS74w== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/utils" "^3.7.0" - "@react-types/shared" "^3.5.0" + "@react-aria/utils" "^3.9.0" + "@react-types/shared" "^3.9.0" -"@react-aria/label@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@react-aria/label/-/label-3.1.1.tgz#03dc5c4813cd1f51760ba48783c186c2eeda1189" - integrity sha512-9kZKJonYSXeY6hZULZrsujAb6uXDGEy8qPq0tjTVoTA3+gx26LOmLCLgvHFtxUK1e4s99rHmaSPdOtq5qu3EVQ== +"@react-aria/label@^3.1.3", "@react-aria/label@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@react-aria/label/-/label-3.2.0.tgz#9e3ce738c3b16e76d5a2f7363383238c8ff98c14" + integrity sha512-MwwCmhLrSoVRvdM2tHyJERT7tYG1Ig7EjeSGbFXxzk1Jq3zzKJ67mWA14Ie60wgtAiJ1yfhOel4D3eUECXqLkg== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/utils" "^3.3.0" - "@react-types/label" "^3.2.1" - "@react-types/shared" "^3.2.1" + "@react-aria/utils" "^3.9.0" + "@react-types/label" "^3.5.0" + "@react-types/shared" "^3.9.0" -"@react-aria/link@^3.1.2": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@react-aria/link/-/link-3.1.2.tgz#0a39e44fb1a7bb30e2ef0c88e0f248462998c87a" - integrity sha512-ONAyB+2irMSNnv2qZKw51AwYv1GzFXAn+N4nWxreI+TIzhAA6JBkMYT9I6JFqx51UwvGI+ys0YXAMJVIBeZRvA== +"@react-aria/link@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@react-aria/link/-/link-3.1.4.tgz#bfd723dee0388240a39d88d08c860286c261bb47" + integrity sha512-DEGNecKg9HQAKWd3BnHRZS0z17CxVO69VJAQOZDMzswtWQrSi2uwgdsEYcDmKfoXH1UXQOzp0FzkxzlNb9tEKA== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/interactions" "^3.2.1" - "@react-aria/utils" "^3.3.0" - "@react-types/link" "^3.1.1" - "@react-types/shared" "^3.2.1" + "@react-aria/interactions" "^3.5.1" + "@react-aria/utils" "^3.8.2" + "@react-types/link" "^3.1.3" + "@react-types/shared" "^3.8.0" -"@react-aria/listbox@^3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@react-aria/listbox/-/listbox-3.2.4.tgz#3162e47d64e1f6cd8fdfe45766cb88c3852a525d" - integrity sha512-IYs4oS2wzWVcWEtKG57zZLZI507WlDy24wuzymwgFxxIRXDVaBsSMOs7+uE7N1P4fLOa1yAlv170AvKDDbIJ2g== +"@react-aria/listbox@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@react-aria/listbox/-/listbox-3.3.1.tgz#ecba0e3a3bee04d569479096c9245fe482b19611" + integrity sha512-8sYnaIt75pC87hd6bSe82lwUeF2rGIcDEjnEuzZ77kcD3CF6hnu8rjSrbRrYG+Hy+p3TNhEvCK3UM/SWW0iVQA== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/interactions" "^3.3.3" - "@react-aria/label" "^3.1.1" - "@react-aria/selection" "^3.3.2" - "@react-aria/utils" "^3.6.0" - "@react-stately/collections" "^3.3.0" - "@react-stately/list" "^3.2.2" - "@react-types/listbox" "^3.1.1" - "@react-types/shared" "^3.4.0" - -"@react-aria/menu@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@react-aria/menu/-/menu-3.2.0.tgz#cd9417105b3230f1c34ddddddb31a95f462393e2" - integrity sha512-CFgC82ZO/LjJtMhDUJFdE3+PV0jS88LK9CCr6w11ggp+U3Q2fPXPdkAVeEB3cJn4KI0TRCBgE+4EneIzdTEgcw== + "@react-aria/focus" "^3.4.1" + "@react-aria/interactions" "^3.5.1" + "@react-aria/label" "^3.1.3" + "@react-aria/selection" "^3.5.1" + "@react-aria/utils" "^3.8.2" + "@react-stately/collections" "^3.3.3" + "@react-stately/list" "^3.3.0" + "@react-types/listbox" "^3.2.1" + "@react-types/shared" "^3.8.0" + +"@react-aria/live-announcer@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@react-aria/live-announcer/-/live-announcer-3.0.1.tgz#772888326808d180adc5bc9fa0b4b1416ec08811" + integrity sha512-c63UZ4JhXxy29F6FO1LUkQLDRzv17W4g3QQ+sy6tmFw7R5I5r8uh8jR7RCbBX7bdGCLnQDwOQ055KsM/a9MT3A== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/interactions" "^3.3.4" - "@react-aria/overlays" "^3.6.2" - "@react-aria/selection" "^3.4.0" - "@react-aria/utils" "^3.7.0" - "@react-stately/collections" "^3.3.1" - "@react-stately/menu" "^3.2.1" - "@react-stately/tree" "^3.1.3" - "@react-types/button" "^3.3.1" - "@react-types/menu" "^3.1.1" - "@react-types/shared" "^3.5.0" - -"@react-aria/meter@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@react-aria/meter/-/meter-3.1.1.tgz#2b3bff2cc2b8c3f552a5edbea444ce9d9f073079" - integrity sha512-Soh+jDEA7onv/wbbdhxUvNqnNp1WgHY3eMDjOXkGpTVozc8wUwMxBCwdPTIXnxMyvFXbzqYNGZOxF/9gsO32yg== + "@react-aria/utils" "^3.8.2" + "@react-aria/visually-hidden" "^3.2.3" + +"@react-aria/menu@^3.2.3": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@react-aria/menu/-/menu-3.2.3.tgz#ef71e5e9a05621366c3097e6bbf64f0a49333f68" + integrity sha512-1bDkRRy+GaNbLxjTnvkFXuOUx4Y90GG1oSiUrD6vgP0SfFHe0IeldHT23agT9xXTkX5spdk+YgtkKNybmJ8HDA== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-aria/interactions" "^3.5.1" + "@react-aria/overlays" "^3.7.2" + "@react-aria/selection" "^3.5.1" + "@react-aria/utils" "^3.8.2" + "@react-stately/collections" "^3.3.3" + "@react-stately/menu" "^3.2.3" + "@react-stately/tree" "^3.2.0" + "@react-types/button" "^3.4.1" + "@react-types/menu" "^3.3.0" + "@react-types/shared" "^3.8.0" + +"@react-aria/meter@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@react-aria/meter/-/meter-3.1.3.tgz#d4529b4fad84b52ae956509e173bb510ae6b6ba3" + integrity sha512-/UORZsn3Q8clxUMZuI68VYLEkdDjpa32c1FAwv1adyTlQrGvX06iWwvMPKwsJsL6S7AHD5ZMl65H3QT7WXJpbQ== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/progress" "^3.1.1" - "@react-types/meter" "^3.1.1" - "@react-types/shared" "^3.2.1" + "@react-aria/progress" "^3.1.3" + "@react-types/meter" "^3.1.2" + "@react-types/shared" "^3.8.0" -"@react-aria/overlays@^3.6.1", "@react-aria/overlays@^3.6.2": - version "3.6.2" - resolved "https://registry.yarnpkg.com/@react-aria/overlays/-/overlays-3.6.2.tgz#0a9fcb7426d4321dc80ee636282228eb7be83a84" - integrity sha512-6f9o1fypGcB/VcprvoDm5280glaiAp/9RZeNPP+HPXE5MxpQIzFDJCzTrSezAUYNkueh/KNMpUxOUUgytloScQ== +"@react-aria/numberfield@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@react-aria/numberfield/-/numberfield-3.1.0.tgz#b9be9930276e8c6ccaba821e775ca67155d8784c" + integrity sha512-szecO5pqd8AiJOcDhj099C+fnuWf0xcB0aUxg7uiikBnTq5RRTMy0P45uVDZneD5Fa7upXcAj4uqMH5+BuJh2A== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-aria/i18n" "^3.3.2" + "@react-aria/interactions" "^3.6.0" + "@react-aria/live-announcer" "^3.0.1" + "@react-aria/spinbutton" "^3.0.1" + "@react-aria/textfield" "^3.4.0" + "@react-aria/utils" "^3.9.0" + "@react-stately/numberfield" "^3.0.2" + "@react-types/button" "^3.4.1" + "@react-types/numberfield" "^3.1.0" + "@react-types/shared" "^3.9.0" + "@react-types/textfield" "^3.3.0" + +"@react-aria/overlays@^3.7.2": + version "3.7.2" + resolved "https://registry.yarnpkg.com/@react-aria/overlays/-/overlays-3.7.2.tgz#dca7693c0ec31371b19c2f51b482f03819b8c391" + integrity sha512-KAurJ5MJRnXCPRrO1OdAaXz253cwO5VOOp8wx3/40Zm05o5FBA15ZJZT6BD8rZQOKMCAjkI76tiZQeMQtDULcQ== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/i18n" "^3.3.0" - "@react-aria/interactions" "^3.3.4" - "@react-aria/utils" "^3.7.0" - "@react-aria/visually-hidden" "^3.2.1" - "@react-stately/overlays" "^3.1.1" - "@react-types/button" "^3.3.1" - "@react-types/overlays" "^3.4.0" + "@react-aria/i18n" "^3.3.2" + "@react-aria/interactions" "^3.5.1" + "@react-aria/utils" "^3.8.2" + "@react-aria/visually-hidden" "^3.2.3" + "@react-stately/overlays" "^3.1.3" + "@react-types/button" "^3.4.1" + "@react-types/overlays" "^3.5.1" dom-helpers "^3.3.1" -"@react-aria/progress@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@react-aria/progress/-/progress-3.1.1.tgz#053b7c15a67ca4a4c9feb50f4a4f2f5c2345521f" - integrity sha512-Y17ziWi5EoveF8QFQ+JyOvCjUCIYVNQUbr+TpuBossTQd3XEK/Dje0I/ZJ65q+tuBEtfnW2qoWpZzYCrQnGu9Q== +"@react-aria/progress@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@react-aria/progress/-/progress-3.1.3.tgz#5b60adfbf52ee2b012a11cfa2c2acf12a56343a0" + integrity sha512-8He91F3MYPT63s/3XUYvaRHHGsPgG3/b4TzdhO5GqmpfCnvDyrXrBI5cj+uyIB9gczU59zENJcnP8Q0oOITiMA== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/i18n" "^3.1.2" - "@react-aria/label" "^3.1.1" - "@react-aria/utils" "^3.3.0" - "@react-types/progress" "^3.1.1" - "@react-types/shared" "^3.2.1" + "@react-aria/i18n" "^3.3.2" + "@react-aria/label" "^3.1.3" + "@react-aria/utils" "^3.8.2" + "@react-types/progress" "^3.1.2" + "@react-types/shared" "^3.8.0" -"@react-aria/radio@^3.1.3": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@react-aria/radio/-/radio-3.1.3.tgz#65b156fc61a9e747dcacfbc8cf6043a3fc38a923" - integrity sha512-Q4Z1Fld9InZPnAAKqH3HcLiH0MO6rCMBOXJif6bs1HUlagc3vzT3e235dWCxzmn3XCqAOooX/sLD8O3sA8ZvfA== +"@react-aria/radio@^3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@react-aria/radio/-/radio-3.1.5.tgz#2fd2fc521d5dea81c9deae012395f19a0757ad05" + integrity sha512-z0IDDAcLcNyCfow2d6Ija8Ge/ZsUTnDKO3oeKnJjE4qDjytXfZFOpUwQdcM8m3ZksFZoJ5dc/2DwBf/dOHWuOQ== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/focus" "^3.2.2" - "@react-aria/i18n" "^3.3.0" - "@react-aria/interactions" "^3.3.3" - "@react-aria/label" "^3.1.1" - "@react-aria/utils" "^3.6.0" - "@react-stately/radio" "^3.3.0" - "@react-types/radio" "^3.1.1" - -"@react-aria/searchfield@^3.1.2": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@react-aria/searchfield/-/searchfield-3.1.2.tgz#e67fbf7477c3cff14d05a7dec22428b41253e0f0" - integrity sha512-8R6sITQhzyt4+fJCWvTD1ydJkZxZy8PHZJfNxk9G+C+9g38V5QBEfA+K9aVnVOp5J7QrgNyY8bf9cwf+MTB5vA== + "@react-aria/focus" "^3.4.1" + "@react-aria/i18n" "^3.3.2" + "@react-aria/interactions" "^3.5.1" + "@react-aria/label" "^3.1.3" + "@react-aria/utils" "^3.8.2" + "@react-stately/radio" "^3.3.2" + "@react-types/radio" "^3.1.2" + +"@react-aria/searchfield@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@react-aria/searchfield/-/searchfield-3.2.0.tgz#f0f8609c2e3a7ed300209f6aa01f6d782c131f81" + integrity sha512-uD3wSsvsZYW8LJ1hnt/5aWwcqmNT1Qorio2PizfvY7jKC4FytU/wjxxI8p8mRRtffltqldgTPgakAwW3KYPpAw== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/i18n" "^3.1.2" - "@react-aria/interactions" "^3.3.4" - "@react-aria/textfield" "^3.2.1" - "@react-aria/utils" "^3.7.0" - "@react-stately/searchfield" "^3.1.1" - "@react-types/button" "^3.2.1" - "@react-types/searchfield" "^3.1.1" - "@react-types/shared" "^3.5.0" - -"@react-aria/select@^3.3.1": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@react-aria/select/-/select-3.3.1.tgz#cfa694ff4b2020846e08b58f6f0a489f0d2b24ff" - integrity sha512-E/EZ4SKf8P5EMVznCmTjfa9y1cR6L+WIzXHTFAlwrmmIzNirHSipbFp6LpJzoByqd0p9IKxhBdxqFP92url0Qg== + "@react-aria/i18n" "^3.3.2" + "@react-aria/interactions" "^3.6.0" + "@react-aria/textfield" "^3.4.0" + "@react-aria/utils" "^3.9.0" + "@react-stately/searchfield" "^3.1.3" + "@react-types/button" "^3.4.1" + "@react-types/searchfield" "^3.1.2" + "@react-types/shared" "^3.9.0" + +"@react-aria/select@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@react-aria/select/-/select-3.5.0.tgz#833c3416bd4c7b1d494167118431da2fbae3401e" + integrity sha512-iBDTjherYU1v4H5ryWOo4OAhiuG4qa8yvg9/a+APcbVg2DuNLfmAzFG4I3foRaVaYvypryfDygGYXfGQmMftbg== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/i18n" "^3.3.0" - "@react-aria/interactions" "^3.3.4" - "@react-aria/label" "^3.1.1" - "@react-aria/menu" "^3.2.0" - "@react-aria/selection" "^3.4.0" - "@react-aria/utils" "^3.7.0" - "@react-aria/visually-hidden" "^3.2.1" - "@react-stately/select" "^3.1.1" - "@react-types/button" "^3.3.1" - "@react-types/select" "^3.2.0" - "@react-types/shared" "^3.5.0" - -"@react-aria/selection@^3.3.2", "@react-aria/selection@^3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@react-aria/selection/-/selection-3.4.0.tgz#abd7aa5435f504e314a72122f2bcaef43b06fa78" - integrity sha512-ddxiB9zhy8JEkG4+DElSMNrSKxRI3RQKyOwQf4i3omqXj8bMH1XJesFwbdGNmR/zrbzXvr35ln9y3S0WS+4ClA== + "@react-aria/i18n" "^3.3.2" + "@react-aria/interactions" "^3.6.0" + "@react-aria/label" "^3.2.0" + "@react-aria/listbox" "^3.3.1" + "@react-aria/menu" "^3.2.3" + "@react-aria/selection" "^3.6.0" + "@react-aria/utils" "^3.9.0" + "@react-aria/visually-hidden" "^3.2.3" + "@react-stately/select" "^3.1.3" + "@react-types/button" "^3.4.1" + "@react-types/select" "^3.4.0" + "@react-types/shared" "^3.9.0" + +"@react-aria/selection@^3.5.1", "@react-aria/selection@^3.6.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@react-aria/selection/-/selection-3.6.0.tgz#88ee3a37ed71c0571692c8e790f88776d93775da" + integrity sha512-i22Ix89NUAHTRFboVBgtTPqrr749UlUtWzJCnHKwY75ihYKtmeiGDkd3ULlsoWBp9VDCMsZ8Uge0g5FyHW8J+Q== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/focus" "^3.2.4" - "@react-aria/i18n" "^3.3.0" - "@react-aria/interactions" "^3.3.4" - "@react-aria/utils" "^3.7.0" - "@react-stately/collections" "^3.3.1" - "@react-stately/selection" "^3.4.0" - "@react-types/shared" "^3.5.0" - -"@react-aria/separator@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@react-aria/separator/-/separator-3.1.1.tgz#bfcd71bb5ab50dc04a7f307b84bd77955f08002f" - integrity sha512-VbiqQsTtKKMjvMcPVWgTbDHzx7qMP3VFC+y9cEVajicMwRoO4bn7kJgcSzainXpWx70bhT5RW1mt84fzxMF+Lg== + "@react-aria/focus" "^3.5.0" + "@react-aria/i18n" "^3.3.2" + "@react-aria/interactions" "^3.6.0" + "@react-aria/utils" "^3.9.0" + "@react-stately/collections" "^3.3.3" + "@react-stately/selection" "^3.7.0" + "@react-types/shared" "^3.9.0" + +"@react-aria/separator@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@react-aria/separator/-/separator-3.1.3.tgz#58937d639caabd461e8325085eafe57256cece6d" + integrity sha512-Vl5UjLvt7NojRZOmKunXzttDqrjZp9i3oIKmwk5ydppchfzvriKsPeFinbWzcRMzIaHOljQ8Gj8yqgGjJtuvuQ== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/utils" "^3.3.0" - "@react-types/shared" "^3.2.1" + "@react-aria/utils" "^3.8.2" + "@react-types/shared" "^3.8.0" -"@react-aria/slider@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@react-aria/slider/-/slider-3.0.1.tgz#c1d99d7303fe269bd57a9504ba13c6b34c830fd3" - integrity sha512-qRmdn+6BrcgDkUqlPmkqr11GOxpOdeNjTAMYPCD5cXxbZdio1INGDtIQkQG8G7RIBld1Auhq7leeFfT4f7vhdg== +"@react-aria/slider@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@react-aria/slider/-/slider-3.0.3.tgz#de6945970cb7f7fd5c462f57bcb6245bfa0b6f73" + integrity sha512-cXTombpZopb8Wy/g4GGmIvK1PPAmCxmgx6eM/r56wQBa/BCIIhlSUlv2SxzgV6tM8M6RnTu0NtPUFGIk3MtS1Q== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/focus" "^3.2.3" - "@react-aria/i18n" "^3.3.0" - "@react-aria/interactions" "^3.3.3" - "@react-aria/label" "^3.1.1" - "@react-aria/utils" "^3.6.0" - "@react-stately/radio" "^3.3.0" - "@react-stately/slider" "^3.0.1" - "@react-types/radio" "^3.1.1" - "@react-types/slider" "^3.0.1" - -"@react-aria/ssr@^3.0.1": + "@react-aria/focus" "^3.4.1" + "@react-aria/i18n" "^3.3.2" + "@react-aria/interactions" "^3.5.1" + "@react-aria/label" "^3.1.3" + "@react-aria/utils" "^3.8.2" + "@react-stately/radio" "^3.3.2" + "@react-stately/slider" "^3.0.3" + "@react-types/radio" "^3.1.2" + "@react-types/slider" "^3.0.2" + +"@react-aria/spinbutton@^3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.0.1.tgz#5f7c111f9ecd184b8f6140139703c1ee552dca30" - integrity sha512-rweMNcSkUO4YkcmgFIoZFvgPyHN2P9DOjq3VOHnZ8SG3Y4TTvSY6Iv90KgzeEfmWCUqqt65FYH4JgrpGNToEMw== + resolved "https://registry.yarnpkg.com/@react-aria/spinbutton/-/spinbutton-3.0.1.tgz#e0d5595e1c74518ca46acdeebf7bd19022ee5d50" + integrity sha512-V2wUhSgJDxSqzo5HPbx7OgGpFeuvxq8/7nNO8mT3cEZfZASUGvjIdCRmAf243qyfo9Yby4zdx9E/BxNOGCZ9cQ== dependencies: "@babel/runtime" "^7.6.2" + "@react-aria/i18n" "^3.3.2" + "@react-aria/live-announcer" "^3.0.1" + "@react-aria/utils" "^3.8.2" + "@react-types/button" "^3.4.1" + "@react-types/shared" "^3.8.0" -"@react-aria/switch@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@react-aria/switch/-/switch-3.1.1.tgz#a67239302908426dedc383a05bf7543190bec948" - integrity sha512-VPuonUcZ0IFs3FAAL3cAWtZr95DH0nyzTWDgVfbfGQCz6zVcD1R6OlA0mUPEdqUl5jQamBvFIk/W/5KbtrpdQw== +"@react-aria/ssr@^3.0.3", "@react-aria/ssr@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.1.0.tgz#b7163e6224725c30121932a8d1422ef91d1fab22" + integrity sha512-RxqQKmE8sO7TGdrcSlHTcVzMP450hqowtBSd2bBS9oPlcokVkaGq28c3Rwa8ty5ctw4EBCjXqjP7xdcKMGDzug== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/toggle" "^3.1.1" - "@react-stately/toggle" "^3.2.1" - "@react-types/switch" "^3.1.1" -"@react-aria/textfield@^3.2.1", "@react-aria/textfield@^3.2.2": - version "3.2.2" - resolved "https://registry.yarnpkg.com/@react-aria/textfield/-/textfield-3.2.2.tgz#2e8195668464911d4f7a363d19da8786c10afd22" - integrity sha512-oIIvy82uBTZqNyHivObFbVtUFMU7GsssIq8T195c0hiuUISoaUxhrV1zlqeo3Ny/WOf275+kGF3UNnkWXihmBg== +"@react-aria/switch@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@react-aria/switch/-/switch-3.1.3.tgz#eb369cf6154055cf8429d5ec81caa97443b09f18" + integrity sha512-JXRIY9rzRc1iBrwO0EzBukMViU6Ty+TXA9SOsp0DhVfF0QZbIwKKd/M6rFq5xvCItUNMWTqdEdqh2c7hFjhZjQ== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/focus" "^3.2.2" - "@react-aria/label" "^3.1.1" - "@react-aria/utils" "^3.4.1" - "@react-types/shared" "^3.2.1" - "@react-types/textfield" "^3.2.2" + "@react-aria/toggle" "^3.1.4" + "@react-stately/toggle" "^3.2.3" + "@react-types/switch" "^3.1.2" -"@react-aria/toggle@^3.1.1": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@react-aria/toggle/-/toggle-3.1.2.tgz#b21c55c103cbeb47baed1e76406aca778e77e8dd" - integrity sha512-oFGo1ABma44hTZvBJWAgpxDr1FkRegk/UL9rAYvrKTBQIRXarvHm0Yv4BmHq/ZWYhHhNWsg07A6CntBQBZFG/A== +"@react-aria/table@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@react-aria/table/-/table-3.0.0.tgz#3f0dd6ba30ac4481c0e1ff1e8ae6a7082ade907f" + integrity sha512-h1Yc4SyyjpyxmhJyFB8Y+sOPD3yELQDZwfyNhjkG8oil8L+R1S2wwquN5wlZ+1Fk2XpglobqwtbSXIlPlwUlKA== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/focus" "^3.2.2" - "@react-aria/interactions" "^3.3.3" - "@react-aria/utils" "^3.6.0" - "@react-stately/toggle" "^3.2.1" - "@react-types/checkbox" "^3.2.2" - "@react-types/shared" "^3.4.0" - "@react-types/switch" "^3.1.1" - -"@react-aria/tooltip@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@react-aria/tooltip/-/tooltip-3.1.1.tgz#e0dfdd9e51b581563f684927249d70e1bad761e3" - integrity sha512-wTszWN6lG3A9Ofdrhv1vG9aOmoqzuUZCbG9ZbXZ9+RtiOMwP/WnuSLWXcMH+KaWYpaImy7h1MDfOgHeaPxCbag== + "@react-aria/focus" "^3.5.0" + "@react-aria/grid" "^3.0.0" + "@react-aria/i18n" "^3.3.2" + "@react-aria/interactions" "^3.6.0" + "@react-aria/live-announcer" "^3.0.1" + "@react-aria/selection" "^3.6.0" + "@react-aria/utils" "^3.9.0" + "@react-stately/table" "^3.0.0" + "@react-stately/virtualizer" "^3.1.5" + "@react-types/checkbox" "^3.2.3" + "@react-types/grid" "^3.0.0" + "@react-types/shared" "^3.9.0" + "@react-types/table" "^3.0.0" + +"@react-aria/tabs@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@react-aria/tabs/-/tabs-3.0.2.tgz#224ff75afd690ebc348576176f294ebb9083a4a8" + integrity sha512-rRfkeG0F4bV2i66myC5OfF7dh1mB2cV1VfBXvY/TUSCilr9d6eagczCc0Y1jS7IfdhrQQQNEFMRXfuHimawX/Q== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/focus" "^3.2.3" - "@react-aria/interactions" "^3.3.3" - "@react-aria/overlays" "^3.6.1" - "@react-aria/utils" "^3.6.0" - "@react-stately/tooltip" "^3.0.2" - "@react-types/shared" "^3.4.0" - "@react-types/tooltip" "^3.1.1" - -"@react-aria/utils@^3.3.0", "@react-aria/utils@^3.4.1", "@react-aria/utils@^3.6.0", "@react-aria/utils@^3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.7.0.tgz#0aab1f682e9f1781cfadd2dd1ef9494bfaca0cbf" - integrity sha512-sMCdX0eF+4B05I+SX9V/NzI1/fD45vabi0dNyJhbSu2xNI82VIYgPcMBDjGU83NJSnjY969R3/JbbLjBrtKUgA== + "@react-aria/focus" "^3.5.0" + "@react-aria/i18n" "^3.3.2" + "@react-aria/interactions" "^3.6.0" + "@react-aria/selection" "^3.6.0" + "@react-aria/utils" "^3.9.0" + "@react-stately/list" "^3.3.0" + "@react-stately/tabs" "^3.0.1" + "@react-types/shared" "^3.9.0" + "@react-types/tabs" "^3.0.1" + +"@react-aria/textfield@^3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@react-aria/textfield/-/textfield-3.4.0.tgz#e967fbc9d9f0f212553c9724267b35c666a63bf2" + integrity sha512-kKig+6wvAKqJMFI1TnDr4xcL76BSm6NBqItXDdTRIO8wsOglYt4iLJXpzDijV3q4PWQ/11KZV4DohC2HLLlBhw== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-aria/focus" "^3.5.0" + "@react-aria/label" "^3.2.0" + "@react-aria/utils" "^3.9.0" + "@react-types/shared" "^3.9.0" + "@react-types/textfield" "^3.3.0" + +"@react-aria/toggle@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@react-aria/toggle/-/toggle-3.1.4.tgz#a4371c4f8ad61b49b2b6e37c1b64a5a9c9e1c60e" + integrity sha512-BvIA8QLS7xBp4XrpA2Xc/o5g9SntbrEicANwvc/Xcftu+08ZRsZ4n5/RHTXUUc+i/bJ3yQoxgUwYE7Ru1IhrfA== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/ssr" "^3.0.1" - "@react-stately/utils" "^3.2.0" - "@react-types/shared" "^3.5.0" + "@react-aria/focus" "^3.4.1" + "@react-aria/interactions" "^3.5.1" + "@react-aria/utils" "^3.8.2" + "@react-stately/toggle" "^3.2.3" + "@react-types/checkbox" "^3.2.3" + "@react-types/shared" "^3.8.0" + "@react-types/switch" "^3.1.2" + +"@react-aria/tooltip@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@react-aria/tooltip/-/tooltip-3.1.3.tgz#cf967d9306170ed2ec0ed589fe1cb4cc081ddbe6" + integrity sha512-l2/BS1XBKrLpg+dovI3xy6NdCgJ5n82TS4p8vQJa7GcynI1I64R0IjOUFv0lc6ZZsr1G8Wg71SNYfmlgTrPr2w== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-aria/focus" "^3.4.1" + "@react-aria/interactions" "^3.5.1" + "@react-aria/utils" "^3.8.2" + "@react-stately/tooltip" "^3.0.5" + "@react-types/shared" "^3.8.0" + "@react-types/tooltip" "^3.1.2" + +"@react-aria/utils@^3.8.2", "@react-aria/utils@^3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.9.0.tgz#c5446f807091a744311d4d559fa8a42e7448824d" + integrity sha512-P0dEOMHGHHJ5KC8iCpaMxAtgdUdeISAm4FZnmoD5fK3JxlKEC046hUxlad83RkNOBZkT2dDvF4HeDCUqdMWHKQ== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-aria/ssr" "^3.1.0" + "@react-stately/utils" "^3.2.2" + "@react-types/shared" "^3.9.0" clsx "^1.1.1" -"@react-aria/visually-hidden@^3.2.1": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@react-aria/visually-hidden/-/visually-hidden-3.2.1.tgz#c022c562346140a473242448045add59269a74fd" - integrity sha512-ba7bQD09MuzUghtPyrQoXHgQnRRfOu039roVKPz2em9gHD0Wy4ap2UPwlzx35KzNq6FdCzMDZeSZHSnUWlzKnw== +"@react-aria/visually-hidden@^3.2.3": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@react-aria/visually-hidden/-/visually-hidden-3.2.3.tgz#4779df0a468873550afb42a7f5fcb2411d82db8d" + integrity sha512-iAe5EFI7obEOwTnIdAwWrKq+CrIJFGTw85v8fXnQ7CIVGRDblX85GOUww9bzQNPDLLRYWS4VF702ii8kV4+JCw== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/interactions" "^3.2.1" - "@react-aria/utils" "^3.3.0" + "@react-aria/interactions" "^3.5.1" + "@react-aria/utils" "^3.8.2" clsx "^1.1.1" "@react-spectrum/utils@^3.5.1": - version "3.5.1" - resolved "https://registry.yarnpkg.com/@react-spectrum/utils/-/utils-3.5.1.tgz#dd733913e30e0ed59c6bdae430531283b4cdcc96" - integrity sha512-lSdxCtshkj9dsi9sGcem6s9lak2XT55uyZGZr2S3w6iwm3aS7OlJNoT/4xtUFGW3t1bF2oxNngHX6eLl+quFyw== + version "3.6.2" + resolved "https://registry.yarnpkg.com/@react-spectrum/utils/-/utils-3.6.2.tgz#c6904e6b99bb22c381f2550c7db4ef663d275acb" + integrity sha512-FEgFSQ2OJ6L9RGxO9MJRVxySrb9SvBHZ8qP5JkFb4mjwpCPs/I8oOi3L/3yqOXwzNTjngXfOG+Z/u7/pJppBtQ== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/i18n" "^3.3.0" - "@react-aria/ssr" "^3.0.1" - "@react-aria/utils" "^3.6.0" - "@react-types/shared" "^3.4.0" + "@react-aria/i18n" "^3.3.2" + "@react-aria/ssr" "^3.0.3" + "@react-aria/utils" "^3.8.2" + "@react-types/shared" "^3.8.0" clsx "^1.1.1" -"@react-stately/checkbox@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@react-stately/checkbox/-/checkbox-3.0.1.tgz#2e48a2085f1559549df62c1eda78299127acaf80" - integrity sha512-5rUx31X2NX78+vu/Ig4F9u0GnCeLAKD9N+BeGZXzJ/pTBIxoS/iAd9hegic4HKeulSrdYgNEpy3MMUPxhM9BkQ== +"@react-stately/checkbox@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@react-stately/checkbox/-/checkbox-3.0.3.tgz#18ee6bd3b544334b6f853bb5c5f7017ac3bb9c37" + integrity sha512-amT889DTLdbjAVjZ9j9TytN73PszynGIspKi1QSUCvXeA2OVyCwShxhV0Pn7yYX8cMinvGXrjhWdhn0nhYeMdg== dependencies: "@babel/runtime" "^7.6.2" - "@react-stately/toggle" "^3.2.1" - "@react-stately/utils" "^3.1.1" - "@react-types/checkbox" "^3.2.1" + "@react-stately/toggle" "^3.2.3" + "@react-stately/utils" "^3.2.2" + "@react-types/checkbox" "^3.2.3" -"@react-stately/collections@^3.2.1", "@react-stately/collections@^3.3.0", "@react-stately/collections@^3.3.1": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@react-stately/collections/-/collections-3.3.1.tgz#683acf6e7a4e9ea174e1cf82a13bb8175ba0a1a0" - integrity sha512-bBiOj0hszFpCbk9KhSm04Jo87GAODm8kA52uFiGAO99yb2ypO+UTFYseBExFQ59cV7b++UMCfdJe/+Ymv9RALg== +"@react-stately/collections@^3.3.3": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@react-stately/collections/-/collections-3.3.4.tgz#ca9e481d2769dbebb593d5a1ed4bcc54013aef9d" + integrity sha512-HnlQip9RH+3nGNh8U2U1YkCdA+zGSedQLWVCdR53w/n6To7kIp7yDLby5dkmP+9VGQEkyfsoSjwGJ1NF94CCZg== dependencies: "@babel/runtime" "^7.6.2" - "@react-types/shared" "^3.5.0" + "@react-types/shared" "^3.8.0" -"@react-stately/list@^3.2.1", "@react-stately/list@^3.2.2": - version "3.2.2" - resolved "https://registry.yarnpkg.com/@react-stately/list/-/list-3.2.2.tgz#fb368cc7678503179202d11aef0ef8d48d1cbf12" - integrity sha512-8sJvy0cUhllhUMadYjX1qKmTxAWMRGxkvZpU/6reOEChlvibjAwbn2paoR8yZ+ppieeQOBe+AAYTl53gK8fKDA== +"@react-stately/combobox@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@react-stately/combobox/-/combobox-3.0.1.tgz#b94f395ec751cfd038ee281032c9c5f3f86cb9a2" + integrity sha512-kUzlFz7ZtgE6JtxAR6f42KA/cwiJoQyBojz3jew3CQMiPmzdsqcrnVrOSrWm78IprYW1fBgnyydsLXVUTgGnfQ== dependencies: "@babel/runtime" "^7.6.2" - "@react-stately/collections" "^3.3.0" - "@react-stately/selection" "^3.2.1" - "@react-stately/utils" "^3.1.1" - "@react-types/shared" "^3.2.1" - -"@react-stately/menu@^3.2.1": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@react-stately/menu/-/menu-3.2.1.tgz#314646217e5dd49fa1da6886d33f485d44d6f0dd" - integrity sha512-8cpCynynjjn3qWNzrZMJEpsdk4tkXK9q3Xaw0ADqVym/NC/wPU3P3cqL4HY+ETar01tS2x8K23qYHbOZz0cQtQ== + "@react-stately/list" "^3.3.0" + "@react-stately/menu" "^3.2.3" + "@react-stately/select" "^3.1.3" + "@react-stately/utils" "^3.2.2" + "@react-types/combobox" "^3.0.1" + "@react-types/shared" "^3.8.0" + +"@react-stately/grid@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@react-stately/grid/-/grid-3.0.0.tgz#db60929a1a485289c632151bd896e70a88679db6" + integrity sha512-e+sCDN3CCXEveGAAGUXLI6qnnbzydIO4gUVSkvsug/pDfy9PgaqMtrxwLhoxJmZO7KmRt3t8ZOoS9wvp0Ctzfg== dependencies: "@babel/runtime" "^7.6.2" - "@react-stately/overlays" "^3.1.1" - "@react-stately/utils" "^3.1.1" - "@react-types/menu" "^3.1.1" - "@react-types/shared" "^3.2.1" + "@react-stately/selection" "^3.7.0" + "@react-types/grid" "^3.0.0" + "@react-types/shared" "^3.8.0" -"@react-stately/overlays@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@react-stately/overlays/-/overlays-3.1.1.tgz#6c1a393b77148184f7b1df22ece832d694d5a8b4" - integrity sha512-79YYXvmWKflezNPhc4fvXA1rDZurZvvEJcmbStNlR5Ryrnk/sQiOQCoVWooi2M4glSMT3UOTvD7YEnXxARcuIQ== +"@react-stately/layout@^3.4.0": + version "3.4.2" + resolved "https://registry.yarnpkg.com/@react-stately/layout/-/layout-3.4.2.tgz#a9d6258ee8a00a23327250f1dbc6724a7c4a0e81" + integrity sha512-t+dNIDFtTHNH1Z/9nK4WACHdDlb9Af1+l9UCbZka7I1d1Bz695NCvYTrsGO8I0CuEz9M/eTSo0GzlMYZkCAp5g== dependencies: "@babel/runtime" "^7.6.2" - "@react-stately/utils" "^3.1.1" - "@react-types/overlays" "^3.2.1" + "@react-stately/virtualizer" "^3.1.5" + "@react-types/grid" "^3.0.0" + "@react-types/shared" "^3.8.0" + "@react-types/table" "^3.0.0" -"@react-stately/radio@^3.3.0": +"@react-stately/list@^3.3.0": version "3.3.0" - resolved "https://registry.yarnpkg.com/@react-stately/radio/-/radio-3.3.0.tgz#6c8c980370f267011bbc0a79c080b4bf35274c1b" - integrity sha512-CcQT/UtiPx7Cy3+9gGcY/J3YH61/U3pw8jwoHA7lBBbqKH7b5Wjbis/UP9wv4tDBeUYPV0MdXlJjGBjyKt5Kow== + resolved "https://registry.yarnpkg.com/@react-stately/list/-/list-3.3.0.tgz#64ab3a507aa3ef03a8f3afc9f8d0bde0c79efd81" + integrity sha512-vp/+5C6ZTy6an0WqR/o0tr3wEbRFeFnZZcGseQps036Ir3XzWMs6CvdwfXCIWiZ03nOQPRvy8GbF8j1Qj4voYQ== dependencies: "@babel/runtime" "^7.6.2" - "@react-stately/utils" "^3.2.0" - "@react-types/radio" "^3.1.1" + "@react-stately/collections" "^3.3.3" + "@react-stately/selection" "^3.7.0" + "@react-stately/utils" "^3.2.2" + "@react-types/shared" "^3.8.0" -"@react-stately/searchfield@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@react-stately/searchfield/-/searchfield-3.1.1.tgz#fcada7bff9cac5bc4ffed11ba9cd06b8513be72a" - integrity sha512-asSTsM+H7kZB8XCIAQO0nqMm5onS+2d1yT351NEj42eAsliz5Zf/eZAsEo4Up8W77scDPxhFpaUigYMqjoFPyQ== +"@react-stately/menu@^3.2.3": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@react-stately/menu/-/menu-3.2.3.tgz#eb58e3cfc941d49637bac04aa474935f08bc7215" + integrity sha512-r09qH8F+OaH7PTc9t2iAOfeCPy3jSg9uAwlDiGaev3zknM618XafIoQ1sWUNQYecSQ5BWWUyBYh5Vl8i2HnEvw== dependencies: "@babel/runtime" "^7.6.2" - "@react-stately/utils" "^3.1.1" - "@react-types/searchfield" "^3.1.1" - "@react-types/shared" "^3.2.1" + "@react-stately/overlays" "^3.1.3" + "@react-stately/utils" "^3.2.2" + "@react-types/menu" "^3.3.0" + "@react-types/shared" "^3.8.0" -"@react-stately/select@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@react-stately/select/-/select-3.1.1.tgz#f49602ee7fc71f14550360bfa7c5becab58ac877" - integrity sha512-cl63nW66IJPsn9WQjKvghAIFKdFKuU1txx4zdEGY9tcwB/Yc+bgniLGOOTExJqN/RdPW9uBny5jjWcc4OQXyJA== +"@react-stately/numberfield@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@react-stately/numberfield/-/numberfield-3.0.2.tgz#2e2831e60cafb7cc4b3124fe5f135a7bbd70e590" + integrity sha512-hxJt/Bj9cqJ8EPp9Vb0BL2CMWaRROWvxveiy76zcMMAT1TN33Wjhta+r+RjhJeUqDCHyvgcbYUeyxEbqrcipRA== dependencies: "@babel/runtime" "^7.6.2" - "@react-stately/collections" "^3.2.1" - "@react-stately/list" "^3.2.1" - "@react-stately/menu" "^3.2.1" - "@react-stately/selection" "^3.2.1" - "@react-stately/utils" "^3.1.1" - "@react-types/select" "^3.1.1" - "@react-types/shared" "^3.2.1" - -"@react-stately/selection@^3.2.1", "@react-stately/selection@^3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@react-stately/selection/-/selection-3.4.0.tgz#795134e17b59f21cc4979b30179bccdfc2e3b9c1" - integrity sha512-5RV9f1Tm4WSTDguL1iizYcgzeWiK6Qe2EZ03zaaE9gm5UyyIrEPQD4WW9Semio2cUF8IFuWLaOvRCk+un7p53Q== + "@internationalized/number" "^3.0.2" + "@react-stately/utils" "^3.2.2" + "@react-types/numberfield" "^3.0.1" + "@react-types/shared" "^3.8.0" + +"@react-stately/overlays@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@react-stately/overlays/-/overlays-3.1.3.tgz#b0bb4061c1b20e712dfc32c933ae4bb23e5ccc0e" + integrity sha512-X8H/h9F8ZjevwJ7P8ak7v500qQd5x4Y76LsXUXrR6LtcO8FXfp2I+W8sGmBtLZwLQpTJiF1U0WMQqXLE1g6eLA== dependencies: "@babel/runtime" "^7.6.2" - "@react-stately/collections" "^3.3.1" - "@react-stately/utils" "^3.1.1" - "@react-types/shared" "^3.5.0" + "@react-stately/utils" "^3.2.2" + "@react-types/overlays" "^3.5.1" -"@react-stately/slider@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@react-stately/slider/-/slider-3.0.1.tgz#076c149947ae45f5eda30178b368ad0c4052f2a3" - integrity sha512-gGpfdVbTmdsOvrmZvFx4hJ5b7nczvAWdHR/tFFJKfxH0/V8NudZ5hGnawY84R3x+OvgV+tKUfifEUKA+oJyG5w== +"@react-stately/radio@^3.3.2": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@react-stately/radio/-/radio-3.3.2.tgz#be489c1e7fe00fadff579776a2e2f4908fae029f" + integrity sha512-U1GfO7NflkyYiUP56/iFWwoLuMxE6Ydb4wEY3ZAlkMcWqes9YBQCzfPeckl6f77i+1ldc3Irs3NH9fDrKp8Oow== dependencies: "@babel/runtime" "^7.6.2" - "@react-aria/i18n" "^3.3.0" - "@react-aria/utils" "^3.6.0" - "@react-stately/utils" "^3.2.0" - "@react-types/slider" "^3.0.1" + "@react-stately/utils" "^3.2.2" + "@react-types/radio" "^3.1.2" -"@react-stately/toggle@^3.2.1": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@react-stately/toggle/-/toggle-3.2.1.tgz#8b10b5eb99c3c4df2c36d17a5f23b77773ed7722" - integrity sha512-gZVuJ8OYoATUoXzdprsyx6O1w3wCrN+J0KnjhrjjKTrBG68n3pZH0p6dM0XpsaCzlSv0UgNa4fhHS3dYfr/ovw== +"@react-stately/searchfield@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@react-stately/searchfield/-/searchfield-3.1.3.tgz#c2fe18be4ca8478c3bb3fdebc7e9e4a14ebfae07" + integrity sha512-IIsgZ87RgdSTLcXB3U+EdgbtAXlpw50G9fDYhwpjIaiZQ60RsaEz0mo+s1+oapXGudCFWyQYNR+nqF7jzNKxwg== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-stately/utils" "^3.2.2" + "@react-types/searchfield" "^3.1.2" + "@react-types/shared" "^3.8.0" + +"@react-stately/select@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@react-stately/select/-/select-3.1.3.tgz#539340e9ccdf8d0b331d289f18f1bb5c81ab3655" + integrity sha512-r0M2gcyyfo7vDDZGsOb64XQlVHtNQl+3mId3gYA46sHEu81C8Lhy4YSPZjItppnCLigBlm88hISl/i0e+XBx8g== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-stately/collections" "^3.3.3" + "@react-stately/list" "^3.3.0" + "@react-stately/menu" "^3.2.3" + "@react-stately/selection" "^3.7.0" + "@react-stately/utils" "^3.2.2" + "@react-types/select" "^3.3.1" + "@react-types/shared" "^3.8.0" + +"@react-stately/selection@^3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@react-stately/selection/-/selection-3.7.0.tgz#a1bab8e7bc589ce20d8160ce2eb77cc606ded581" + integrity sha512-SfYFCBx8VAEvo24tUp738bl12NiFKg8M+VUy9UeI/M5uJSScXB/F8NLGPjaDpkRD2qGJ5BEYGzD39I3eBu3EcQ== dependencies: "@babel/runtime" "^7.6.2" - "@react-stately/utils" "^3.1.1" - "@react-types/checkbox" "^3.2.1" - "@react-types/shared" "^3.2.1" + "@react-stately/collections" "^3.3.3" + "@react-stately/utils" "^3.2.2" + "@react-types/shared" "^3.8.0" -"@react-stately/tooltip@^3.0.2": +"@react-stately/slider@^3.0.3": version "3.0.3" - resolved "https://registry.yarnpkg.com/@react-stately/tooltip/-/tooltip-3.0.3.tgz#577fbf3cca39db7047ec2d77ddc03a56c454a82a" - integrity sha512-N98S8ccHEpgbgM6wIMZwqz37s8IQTa+5nPr8eVnIs5wqwdnAARFjvckr2okOGwaksofp1wtpcYbnNrIBwexJOg== + resolved "https://registry.yarnpkg.com/@react-stately/slider/-/slider-3.0.3.tgz#77f85eb459d1542a74baf68ff545fcc569e5c309" + integrity sha512-6A9TUIYiBXyLcwUdmfGyVeEmOc9KMrrjtAfCLghDUyUFUUlxd5NO3gBs4zicdu7zbOMI/zB0kj5dWyfdZiiEmw== dependencies: "@babel/runtime" "^7.6.2" - "@react-stately/overlays" "^3.1.1" - "@react-stately/utils" "^3.2.0" - "@react-types/tooltip" "^3.1.1" + "@react-aria/i18n" "^3.3.2" + "@react-aria/utils" "^3.8.2" + "@react-stately/utils" "^3.2.2" + "@react-types/slider" "^3.0.2" -"@react-stately/tree@^3.1.3": - version "3.1.3" - resolved "https://registry.yarnpkg.com/@react-stately/tree/-/tree-3.1.3.tgz#5ceb1aa3793836a503253ddd47fc9227ac59c7b4" - integrity sha512-xwM2C3ppd8yJfduwgff7Gl2bNPMVeF4K65InFJZNVx5JLKFF6DJLAPTORAHLpCN+AoB8bY4sRK3V5fNBVpz0oQ== +"@react-stately/table@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@react-stately/table/-/table-3.0.0.tgz#269cefbbd4cec322084898f2d0eb3149c9996cfa" + integrity sha512-ge89ofdzOLUfonZsePLNlaG+9qLQV61dyaVac+LUjFsIOuA9cO9uZwApjncGBIdtUzb+WvdZHdPc6sv1cwim3w== dependencies: "@babel/runtime" "^7.6.2" - "@react-stately/collections" "^3.3.1" - "@react-stately/selection" "^3.4.0" - "@react-stately/utils" "^3.1.1" - "@react-types/shared" "^3.5.0" + "@react-stately/collections" "^3.3.3" + "@react-stately/grid" "^3.0.0" + "@react-types/grid" "^3.0.0" + "@react-types/shared" "^3.8.0" + "@react-types/table" "^3.0.0" -"@react-stately/utils@^3.1.1", "@react-stately/utils@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@react-stately/utils/-/utils-3.2.0.tgz#0b90a70fee3236025ad8bed1f0e3555d5fc10296" - integrity sha512-vVBJvHVLnQySgqZ7OfP3ngDdwfGscJDsSD3WcN5ntHiT3JlZ5bksQReDkJEs20SFu2ST4w/0K7O4m97SbuMl2Q== +"@react-stately/tabs@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@react-stately/tabs/-/tabs-3.0.1.tgz#7df000f8c5c14b3bf973348c491e12bcfcafe49d" + integrity sha512-XhF/5mt8eme3mu0+4nC7Du+e5OWSu0W8SeKfbH9JmTWTCayZpPtui68nRStJK6OkgHs28gA+j55RSsTqT/N1Fg== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-stately/list" "^3.3.0" + "@react-stately/utils" "^3.2.2" + "@react-types/tabs" "^3.0.1" + +"@react-stately/toggle@^3.2.3": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@react-stately/toggle/-/toggle-3.2.3.tgz#a4de6edc16982990492c6c557e5194f46dacc809" + integrity sha512-p5eVjXwNo4y4CeybxfjYmbTzNMNiI67uspbRAJnawWBVWw8X+yIvRfpjYAsqmvsJ+DsvwybSTlQDT6taGoWEsA== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-stately/utils" "^3.2.2" + "@react-types/checkbox" "^3.2.3" + "@react-types/shared" "^3.8.0" + +"@react-stately/tooltip@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@react-stately/tooltip/-/tooltip-3.0.5.tgz#0cb716791ef3242acd810794162d651b1c47a328" + integrity sha512-rHqPSfkxbx0T0B/j+WDl4G2CfLjFeBfyaifGiIUJWHO/0Kwvh5am88VeHtuTVzC2DPEGTdtXqYns21EuJOrDlQ== dependencies: "@babel/runtime" "^7.6.2" + "@react-stately/overlays" "^3.1.3" + "@react-stately/utils" "^3.2.2" + "@react-types/tooltip" "^3.1.2" -"@react-types/breadcrumbs@^3.2.0": +"@react-stately/tree@^3.2.0": version "3.2.0" - resolved "https://registry.yarnpkg.com/@react-types/breadcrumbs/-/breadcrumbs-3.2.0.tgz#c30d236f4073bebb89d7e2603e1d077e4e26b818" - integrity sha512-LmYOZwEbVl3QnjCmc6H3qVTukAQ2mAzwP2jxzmAnzk3dD+jPhsij/G8PWgTZI3oXCM/vSmLxqG8ga7FtrAx2SQ== + resolved "https://registry.yarnpkg.com/@react-stately/tree/-/tree-3.2.0.tgz#151c90f161c5c8339b6876f59a4f0502be08670b" + integrity sha512-FfHfs79KeXN0Yi8X5O/oRWL1ZTZByhIT++NEUX4aCO3VSxnqhcl9/ErSmH/fYr36q0xdYZsX3BFvk/fm1EDkXQ== dependencies: - "@react-types/shared" "^3.2.1" + "@babel/runtime" "^7.6.2" + "@react-stately/collections" "^3.3.3" + "@react-stately/selection" "^3.7.0" + "@react-stately/utils" "^3.2.2" + "@react-types/shared" "^3.8.0" + +"@react-stately/utils@^3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@react-stately/utils/-/utils-3.2.2.tgz#468eafa60740c6b0b847a368215dfaa55e87f505" + integrity sha512-7NCpRMAexDdgVqbrB9uDrkDpM4Tdw5BU6Gu6IKUXmKsoDYziE6mAjaGkCZBitsrln1Cezc6euI5YPa1JqxgpJg== + dependencies: + "@babel/runtime" "^7.6.2" + +"@react-stately/virtualizer@^3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@react-stately/virtualizer/-/virtualizer-3.1.5.tgz#a0a0751f3b291ea25e015ca2c0f933c30d190d05" + integrity sha512-SyOBDhURW6Dq5DyazMtj2W/ch91RaIcLPLsHXP580Tsq+Hy5oEX80B31273DAWzzBPYi6sl64w0V2m2GmCWsAA== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-aria/utils" "^3.8.2" + "@react-types/shared" "^3.8.0" -"@react-types/button@^3.2.1", "@react-types/button@^3.3.1": +"@react-types/breadcrumbs@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@react-types/breadcrumbs/-/breadcrumbs-3.2.1.tgz#9dbca1b34d0e0ac5d34fdfc53691ad7379b2bec4" + integrity sha512-njXfiYTlACKAz5xVp34tXb7gtm6avzgzrkYT70r3HHk8g7cBUS7iJPiSIgCRxUGwIpesIYeZY3a1Nvqzvohgmg== + dependencies: + "@react-types/shared" "^3.8.0" + +"@react-types/button@^3.4.1": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@react-types/button/-/button-3.4.1.tgz#715ac9d4997c79233be4d9020b58f85936b8252b" + integrity sha512-B54M84LxdEppwjXNlkBEJyMfe9fd+bvFV7R6+NJvupGrZm/LuFNYjFcHk7yjMKWTdWm6DbpIuQz54n5qTW7Vlg== + dependencies: + "@react-types/shared" "^3.8.0" + +"@react-types/checkbox@^3.2.3": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@react-types/checkbox/-/checkbox-3.2.3.tgz#2b9d529c55c9884519c7f626f0fe8be7d0f18be1" + integrity sha512-YqeAFyrpaxI/eW6zQ7tVkKIASgzpywRrc6C/rV6Mw0zzGGSSvmYvdOBx9yHOEvpts7dLgaGlmLK6CeG7s4yGKg== + dependencies: + "@react-types/shared" "^3.8.0" + +"@react-types/combobox@^3.0.1", "@react-types/combobox@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@react-types/combobox/-/combobox-3.1.0.tgz#5c2f63a4e2dbdeffecc693a8b39a1fee433f3216" + integrity sha512-/2mKPrV8P+Gad9z3X2BIAscglu6yJbb372Hu90BLoxTk0T0Z/W9AdbEXPPKEq06osY7LzzwHm/v6QWkSosczeA== + dependencies: + "@react-types/shared" "^3.9.0" + +"@react-types/dialog@^3.3.1": version "3.3.1" - resolved "https://registry.yarnpkg.com/@react-types/button/-/button-3.3.1.tgz#4bdd325bc7df19c33911af256f63eae91e2a452e" - integrity sha512-xKLGSzGfsDBMe0SM7icOLNmzW38sdNSDSGMdrTLd3ygxb6pXY/LlcTdx7Sq28hdW8XL/ikFAnoQeS1VLXZHj7w== + resolved "https://registry.yarnpkg.com/@react-types/dialog/-/dialog-3.3.1.tgz#eb07e3d703643f7967243d56951d58a2cf77096f" + integrity sha512-1i6fVtixUNlftSNbVPFRieyEy3N/GNqcqpeOsJUB1jby28ppbM+JCp3Icb0ijaNC9Nl8c/oI8srtOWIQIKUJiQ== dependencies: - "@react-types/shared" "^3.4.0" + "@react-types/overlays" "^3.5.1" + "@react-types/shared" "^3.8.0" -"@react-types/checkbox@^3.2.1", "@react-types/checkbox@^3.2.2": - version "3.2.2" - resolved "https://registry.yarnpkg.com/@react-types/checkbox/-/checkbox-3.2.2.tgz#7182d44a533e2ffd2c9118372cbc2c33b006eb18" - integrity sha512-WAAqLdjf6GUWjsMN5NaFMFumOtGTq+3+48CpM0ah2L+qmhMdj1s4gvHDerhls6u4ovRK/7zhg7XK+qQwcYVqMg== +"@react-types/grid@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@react-types/grid/-/grid-3.0.0.tgz#a69446e4f99623102339b1351701c371a0c95323" + integrity sha512-OO3i2KfCzyLPK7fPYlVEybobiQmjZGT53rncwzOWAqD3YihTueGXYeAIpbbIZ75BrJzdcntfedPqcWwYNOaNbw== dependencies: - "@react-types/shared" "^3.4.0" + "@react-types/shared" "^3.8.0" -"@react-types/dialog@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@react-types/dialog/-/dialog-3.3.0.tgz#60a2b53f250ee082b53aef9340c80f1afe654bc7" - integrity sha512-63Vsr/UOZiaajlNDQUgWDi6v3EMenV1f8Cwh+L4lcyIJnbC6WeC2VEV3ld/TYVC0U58SQ0k7u2EIyHkWjc5kdQ== +"@react-types/label@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@react-types/label/-/label-3.5.0.tgz#c7093871f42c62e1b5523f61a0856a2f58d4cf2a" + integrity sha512-a9lpQUyV4XwsZv0gV1jPjPWicSSa+DRliuXLTwORirxNLF0kMk89DLYf0a9CZhiEniJYqoqR3laJDvLAFW1x/Q== dependencies: - "@react-types/overlays" "^3.2.1" - "@react-types/shared" "^3.2.1" + "@react-types/shared" "^3.9.0" -"@react-types/label@^3.2.1": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@react-types/label/-/label-3.4.0.tgz#6023dc9dd0146324ead52e08540cd60e57a3e27f" - integrity sha512-l84ysm1dcjL/5qVk9iN74z+/Ul0999XqnwTu6aTbuwAXqMk2sTU45eK2Yp/FJ7YWeflcF1vsomTkjMkX0BHKMw== +"@react-types/link@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@react-types/link/-/link-3.1.3.tgz#461bc7bf0d98bc09da8b6344a3326844dd389f4d" + integrity sha512-l8NODCP8nSSwL7lsfOI0WSnkVKIHzkR3qRr5oOUfFVMkqo7ib3Ry2Xlw/f5NRmP0XxrBbkxMluMJ0yPhIp7T4Q== dependencies: - "@react-types/shared" "^3.4.0" + "@react-aria/interactions" "^3.5.1" + "@react-types/shared" "^3.8.0" -"@react-types/link@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@react-types/link/-/link-3.1.1.tgz#6cbaa0b1e5cf1492dd59a8f8f645308848395306" - integrity sha512-sTyr6fEjwBWXGp/7iU/+ncO0O8YHnf53ZdB7+vOZX+7w1smQ2yVAllRHrREcnEXijMBfuoWf2i0pNqgQBdmLwQ== +"@react-types/listbox@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@react-types/listbox/-/listbox-3.2.1.tgz#881bbc9690343f35fe08a99526a90618f53328bf" + integrity sha512-uBYx5BgL8gyH62UhSXAFyFDwAD4ALcK5gjOk+p/vWsFm0vvmtutALkb3yYjDQvwdI89pSZDjN4j7QChCmlNcmQ== dependencies: - "@react-aria/interactions" "^3.2.1" - "@react-types/shared" "^3.2.1" + "@react-types/shared" "^3.8.0" -"@react-types/listbox@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@react-types/listbox/-/listbox-3.1.1.tgz#b896303ccb87123cf59ee2c089953d7928497c9b" - integrity sha512-HAljfdpbyLoJL9iwqz7Fw9MOmRwfzODeN+sr5ncE0eXJxnRBFhb5LjbjAN1dUBrKFBkv3etGlYu5HvX+PJjpew== +"@react-types/menu@^3.3.0": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@react-types/menu/-/menu-3.4.1.tgz#42f58ce3b79b844441627c5cd3126705b3b00063" + integrity sha512-9xx7x13h2/DpnD8m2+eN09ViEwXldYXGtD0WSExO99ZulNi4tbzwJfnUBBJWj1aq9v2ZgObECOSqwkIDOJo6qA== dependencies: - "@react-types/shared" "^3.2.1" + "@react-types/overlays" "^3.5.1" + "@react-types/shared" "^3.9.0" -"@react-types/menu@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@react-types/menu/-/menu-3.1.1.tgz#e5aa52ac07c083243540dd5da0790a85fd1628c6" - integrity sha512-/xZWp4/3P/8dKFAGuzxz8IccSXvJH0TmHIk2/xnj2Eyw9152IfutIpOda3iswhjrx1LEkzUgdJ8bCdiebgg6QQ== +"@react-types/meter@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@react-types/meter/-/meter-3.1.2.tgz#1a362218e3727a62b720009e957c59d3887fd186" + integrity sha512-rF14kgjXkafmwaMGTpNsDMfjXhGNvKLdf02fwVBEqQjUJ5PFu/DubrIecu4Q6+TG/hEXjD0EryU+YxAwVOzkmg== dependencies: - "@react-types/overlays" "^3.2.1" - "@react-types/shared" "^3.2.1" + "@react-types/progress" "^3.1.2" + "@react-types/shared" "^3.8.0" -"@react-types/meter@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@react-types/meter/-/meter-3.1.1.tgz#1a89c77c0f847fc741984703a22af266eae1429f" - integrity sha512-82dltyAhCIfyuwfyu+dijEUC08+G7imX3x7QVPSWIHfXusWbWXQG9YzBXJkmCoZlMPEMhEtA6l5niHM3gMD/Zg== +"@react-types/numberfield@^3.0.1", "@react-types/numberfield@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@react-types/numberfield/-/numberfield-3.1.0.tgz#30aff4352a24797a235a74e538a8dd86c5c60af3" + integrity sha512-+QfvGqWD/QWOIyOCRDX/KyyV6QWdA/BQZKVpkFd0Vyy11GGT0eiKGyBevlN22/mwQkHbu53smVrRKXlHdB1tUQ== dependencies: - "@react-types/progress" "^3.1.1" - "@react-types/shared" "^3.2.1" + "@react-types/shared" "^3.9.0" -"@react-types/overlays@^3.2.1", "@react-types/overlays@^3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@react-types/overlays/-/overlays-3.4.0.tgz#3c4619906bb12e3697e770b59c2090bb18da25bd" - integrity sha512-ddiMB6JXR7acQnRFEL2/6SSdBropmNrcAFk3qFCfovuVZh6STYhPmoAgj06mJFDoAD63pxayysfPG2EvLl2yAw== +"@react-types/overlays@^3.5.1": + version "3.5.1" + resolved "https://registry.yarnpkg.com/@react-types/overlays/-/overlays-3.5.1.tgz#35350dfca639d04a8fbd973de59b141450df1b46" + integrity sha512-T3o6wQ5NNm1rSniIa01bIa6fALC8jbwpYxFMaQRrdEpIvwktt0Fi5Xo6/97+oe4HvzzU0JMhtwWDTdRySvgeZw== dependencies: - "@react-types/shared" "^3.3.0" + "@react-types/shared" "^3.8.0" -"@react-types/progress@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@react-types/progress/-/progress-3.1.1.tgz#e2a99eab26e2b3117f65f78ccb320eae1cdbf693" - integrity sha512-Q9mgDbUw7Dcexd2CAo/NRanQ+7btHYAzjphoVSrIUwTsmgg4/WsPjZ3fplVyyRnzoYEjME/b7Og5HZ+ZEFTvsA== +"@react-types/progress@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@react-types/progress/-/progress-3.1.2.tgz#7878ce5b03bfa92f5f8ca999a4cafc545f3d07a4" + integrity sha512-RLddv7VLuN/vWi13zbCmp8L5spbO/ArzimplJ5v59XrDNi/obbFkMOxne8/NrIS06aRiYiP8scXgC+koyyqpJg== dependencies: - "@react-types/shared" "^3.2.1" + "@react-types/shared" "^3.8.0" -"@react-types/radio@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@react-types/radio/-/radio-3.1.1.tgz#5b1b11ff3043ac902e8970e49260f2664da80e5e" - integrity sha512-neInMjlbZyyGYYyeDJk9BcEejLczvsBiyk/swSUHmQ99eNIjK3ptUHTNdXM1xBBc3zI1SvBxOQr+uGeeEszvxw== +"@react-types/radio@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@react-types/radio/-/radio-3.1.2.tgz#a2a6aed62c0036b9c3647edd9ce944aa80624346" + integrity sha512-vkIic8abrVUyl/YjKU3yTVwn8QgebzuadfV89PsaKc3hdmSiHhDsln5wYsfWOEotqMwPrG1aEv9yRMYO78OQXQ== dependencies: - "@react-types/shared" "^3.2.1" + "@react-types/shared" "^3.8.0" -"@react-types/searchfield@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@react-types/searchfield/-/searchfield-3.1.1.tgz#bbbb8984706c02559810328791cdfb8d418336a0" - integrity sha512-qNVrO3bIM9TcZHVuU7QI12LHShosvp3D297xw/iGLQoyaL0/W68d4dJs5ujU5ZRj8/gGRhAQiparpRs9hiHkxw== +"@react-types/searchfield@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@react-types/searchfield/-/searchfield-3.1.2.tgz#184770b67f1fad57a6024ad00b7e42cf934ed54b" + integrity sha512-lIyXEzoS/XXmddAvgZk/a8/8qAkVt5XbUrX7CrpZOiwqIPsVDI2bDYiv7N9GdS0pMeSyu1X9mXCnJfvzu/Dkow== dependencies: - "@react-types/textfield" "^3.2.1" + "@react-types/textfield" "^3.2.3" -"@react-types/select@^3.1.1", "@react-types/select@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@react-types/select/-/select-3.2.0.tgz#31b9e0f94fc24f053f4a1f073e174ffd59bac055" - integrity sha512-9vYhQWr1iB+3KWTZ1RxS2xZq0n0CJfsTRbEr0akLrtE/pRLC4O4l8RMFD49HyX0fShvz1FStmxTE2x7k8yVc4w== +"@react-types/select@^3.3.1", "@react-types/select@^3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@react-types/select/-/select-3.4.0.tgz#bef3b86e80a6ac696de62cb5772589347fd29ac7" + integrity sha512-AoraJ9WQfot6tsj3JLMZIQWWG5Hzkwm5UHfhmXg1UDFIzVoPpQicFRd8y76qZxyXsyTTfxgS9lKe9cgBRJPDVw== dependencies: - "@react-types/shared" "^3.4.0" + "@react-types/shared" "^3.9.0" -"@react-types/shared@^3.2.1", "@react-types/shared@^3.3.0", "@react-types/shared@^3.4.0", "@react-types/shared@^3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.5.0.tgz#dbc90e8fe711967e66d6f3ce0e17d34b24bd6283" - integrity sha512-997Me7AegwJOI10ye/Q5ds6fT+VBc6XcsXYzPqOD+HIbyL1kUQNDF/VoO37ib7KEH8jXH9aceoX9blz3Q1QcpA== +"@react-types/shared@^3.8.0", "@react-types/shared@^3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.9.0.tgz#d834f3e6e2c992089192f3c83fb7963e3a6f5207" + integrity sha512-YYksINfR6q92P10AhPEGo47Hd7oz1hrnZ6Vx8Gsrq62IbqDdv1XOTzPBaj17Z1ymNY2pitLUSEXsLmozt4wxxQ== -"@react-types/slider@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@react-types/slider/-/slider-3.0.1.tgz#b663c06765c5517f5d433e6158ad29d12eeaac4e" - integrity sha512-EUWogUMH/dU01+adJ7/Hlu6mP0thbXw8ftmWbPVMLWqweV2dEzRkvQZ8d9+q2JFMSNXwMSWvuMSVSnPKFbUXeQ== +"@react-types/slider@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@react-types/slider/-/slider-3.0.2.tgz#81313a14caa30ee27feeb66a50a3854a6923ca56" + integrity sha512-cok3e2fLpSGXggwtACDH5WYERhAQtHmyjbYANvf4CA855h7uMbX9L+wuRnvaj+j2W79oE9INDDBt7lG+vJuSiA== dependencies: - "@react-types/shared" "^3.4.0" + "@react-types/shared" "^3.8.0" -"@react-types/switch@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@react-types/switch/-/switch-3.1.1.tgz#7909a8f7c2cb68ab7536efd03af3be3417e0eca3" - integrity sha512-nI5J/1CrJrVANwgikXyPMqxWJ4UyefzE4Vz/TwTgoXQ9v+LRNo22wbisfh1EmJAlZ0E52X/iKViVaBroNty+EA== +"@react-types/switch@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@react-types/switch/-/switch-3.1.2.tgz#f7015e5e66035c9ae517966842a4f9e5d589fa26" + integrity sha512-EaYWoLvUCpOnt//Ov8VBxOjbs4hBpYE/rBAzzIknXaFvKOu867iZBFL7FJbcemOgC8/dwyaj6GUZ1Gw3Z1g59w== dependencies: - "@react-types/checkbox" "^3.2.1" - "@react-types/shared" "^3.2.1" + "@react-types/checkbox" "^3.2.3" + "@react-types/shared" "^3.8.0" -"@react-types/textfield@^3.2.1", "@react-types/textfield@^3.2.2": - version "3.2.2" - resolved "https://registry.yarnpkg.com/@react-types/textfield/-/textfield-3.2.2.tgz#2f310c125df7c4a64a19d7c5064537218f909d38" - integrity sha512-S+U+Uc0WDgMK8X28j5WUtmkCL25iTQ+oGfCRFf4/GJtiwfO9lVLCgH/NWxpoVuNsPGvt36rlDnyS82Ge9H1/qA== +"@react-types/table@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@react-types/table/-/table-3.0.0.tgz#6dbfcfa062ab0da9ef455bf56a4e7dea6cb6c6ef" + integrity sha512-8tF2C86LCIFucncF6lXEVdioKWY+86/YwBtwr9ND9Qq3MWv8zoHS66CGrvw3LYBOoCCk3MMZ53Du7TKT6p2eUQ== dependencies: - "@react-types/shared" "^3.2.1" + "@react-types/grid" "^3.0.0" + "@react-types/shared" "^3.8.0" -"@react-types/tooltip@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@react-types/tooltip/-/tooltip-3.1.1.tgz#7d45a4dd8c57c422a1a2dcb03b6c043e7481c3ca" - integrity sha512-18gM2Co9tzCDfN0tEdfboD18sXDtD6YiKctd8HQ8tBiRO4IF1ce9ubKe6++Lj+38GQPq7GWFFoUiS1WArTWIHA== +"@react-types/tabs@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@react-types/tabs/-/tabs-3.0.1.tgz#a32931e95303d4442e51d4c687d4e154654014f6" + integrity sha512-GvPVU9GAqImHFhU+Do+pdGK/vZA4kqA699Gly1V95DUmtdG3GSwTnwlvM/Sy80/F9fKZDGokZnQmBFo8MFZyIw== dependencies: - "@react-types/overlays" "^3.4.0" - "@react-types/shared" "^3.4.0" + "@react-types/shared" "^3.8.0" + +"@react-types/textfield@^3.2.3", "@react-types/textfield@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@react-types/textfield/-/textfield-3.3.0.tgz#07a447fda327df4843e7d36cbd00f87f8a73e725" + integrity sha512-lOf0tx3c3dVaomH/uvKpOKFVTXQ232kLnMhOJTtj97JDX7fTr3SNhDUV0G8Zf4M0vr+l+xkTrJkywYE23rzliw== + dependencies: + "@react-types/shared" "^3.9.0" + +"@react-types/tooltip@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@react-types/tooltip/-/tooltip-3.1.2.tgz#a80d1ab5a37337156881a032cdaa136a9e028e32" + integrity sha512-puyiRi3IaEeKH25AErZzQKthnxk1McU+7S+Qo2kFLy3F3PyXV0cmSqvKKOhH6kU5Cw4ZnuAlNjCI0tV8PYdlYA== + dependencies: + "@react-types/overlays" "^3.5.1" + "@react-types/shared" "^3.8.0" "@reduxjs/toolkit@1.5.1": version "1.5.1" @@ -2458,6 +2743,215 @@ redux-thunk "^2.3.0" reselect "^4.0.0" +"@segment/analytics-next@1.30.0": + version "1.30.0" + resolved "https://registry.yarnpkg.com/@segment/analytics-next/-/analytics-next-1.30.0.tgz#2dc9dab8f01f0772c9ce3d5990779582a3db6b5b" + integrity sha512-fxuiY/C2egOjEpuwwVExpfbB3biDQ5BMsAetBRhGhAW1bPCw1G7YqZPBT/TwtiaydH3t5XHxKv9sONVLhT66Dw== + dependencies: + "@lukeed/uuid" "^2.0.0" + "@segment/analytics.js-video-plugins" "^0.2.1" + "@segment/facade" "3.3.10" + "@segment/tsub" "^0.1.9" + dset "^2.1.0" + js-cookie "^2.2.1" + spark-md5 "^3.0.1" + unfetch "^4.1.0" + +"@segment/analytics.js-video-plugins@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@segment/analytics.js-video-plugins/-/analytics.js-video-plugins-0.2.1.tgz#3596fa3887dcd9df5978dc566edf4a0aea2a9b1e" + integrity sha512-lZwCyEXT4aaHBLNK433okEKdxGAuyrVmop4BpQqQSJuRz0DglPZgd9B/XjiiWs1UyOankg2aNYMN3VcS8t4eSQ== + dependencies: + unfetch "^3.1.1" + +"@segment/facade@3.3.10": + version "3.3.10" + resolved "https://registry.yarnpkg.com/@segment/facade/-/facade-3.3.10.tgz#94381079d326f8d4b2d11e0b2b1a85ca7aac28c4" + integrity sha512-Ed6hRwpNqwjsj3s5fXFqzoWwyB/foVGM+uT3Kl94Yd5BlZtYvmHxtX5gGsAPD49eazIPxLqJDZSHz/2tnokRTQ== + dependencies: + "@segment/isodate-traverse" "^1.1.1" + inherits "^2.0.4" + klona "^2.0.4" + new-date "^1.0.3" + obj-case "0.2.1" + +"@segment/isodate-traverse@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@segment/isodate-traverse/-/isodate-traverse-1.1.1.tgz#37e1a68b5e48a841260145f1be86d342995dfc64" + integrity sha512-+G6e1SgAUkcq0EDMi+SRLfT48TNlLPF3QnSgFGVs0V9F3o3fq/woQ2rHFlW20W0yy5NnCUH0QGU3Am2rZy/E3w== + dependencies: + "@segment/isodate" "^1.0.3" + +"@segment/isodate@1.0.3", "@segment/isodate@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@segment/isodate/-/isodate-1.0.3.tgz#f44e8202d5edd277ce822785239474b2c9411d4a" + integrity sha512-BtanDuvJqnACFkeeYje7pWULVv8RgZaqKHWwGFnL/g/TH/CcZjkIVTfGDp/MAxmilYHUkrX70SqwnYSTNEaN7A== + +"@segment/tsub@^0.1.9": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@segment/tsub/-/tsub-0.1.9.tgz#15690b62b3cd01ddd7ef53db8012a8941770b22b" + integrity sha512-m2ZTotDbXx0iW1eh3f3a3YUPwFptpCIEG7Xp/1MpTohPNmsL7Pft0PzQF3Qd7JClMmT6r7dmUjZjtWFEwEIaeQ== + dependencies: + dlv "^1.1.3" + dset "2.1.0" + math-float64-ldexp "^1.0.1" + tiny-hashes "^1.0.1" + +"@sentry/browser@6.13.2": + version "6.13.2" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.13.2.tgz#8b731ecf8c3cdd92a4b6893a26f975fd5844056d" + integrity sha512-bkFXK4vAp2UX/4rQY0pj2Iky55Gnwr79CtveoeeMshoLy5iDgZ8gvnLNAz7om4B9OQk1u7NzLEa4IXAmHTUyag== + dependencies: + "@sentry/core" "6.13.2" + "@sentry/types" "6.13.2" + "@sentry/utils" "6.13.2" + tslib "^1.9.3" + +"@sentry/browser@6.7.1": + version "6.7.1" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.7.1.tgz#e01144a08984a486ecc91d7922cc457e9c9bd6b7" + integrity sha512-R5PYx4TTvifcU790XkK6JVGwavKaXwycDU0MaAwfc4Vf7BLm5KCNJCsDySu1RPAap/017MVYf54p6dWvKiRviA== + dependencies: + "@sentry/core" "6.7.1" + "@sentry/types" "6.7.1" + "@sentry/utils" "6.7.1" + tslib "^1.9.3" + +"@sentry/core@6.13.2": + version "6.13.2" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.13.2.tgz#2ce164f81667aa89cd116f807d772b4718434583" + integrity sha512-snXNNFLwlS7yYxKTX4DBXebvJK+6ikBWN6noQ1CHowvM3ReFBlrdrs0Z0SsSFEzXm2S4q7f6HHbm66GSQZ/8FQ== + dependencies: + "@sentry/hub" "6.13.2" + "@sentry/minimal" "6.13.2" + "@sentry/types" "6.13.2" + "@sentry/utils" "6.13.2" + tslib "^1.9.3" + +"@sentry/core@6.7.1": + version "6.7.1" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.7.1.tgz#c3aaa6415d06bec65ac446b13b84f073805633e3" + integrity sha512-VAv8OR/7INn2JfiLcuop4hfDcyC7mfL9fdPndQEhlacjmw8gRrgXjR7qyhnCTgzFLkHI7V5bcdIzA83TRPYQpA== + dependencies: + "@sentry/hub" "6.7.1" + "@sentry/minimal" "6.7.1" + "@sentry/types" "6.7.1" + "@sentry/utils" "6.7.1" + tslib "^1.9.3" + +"@sentry/electron@2.5.4": + version "2.5.4" + resolved "https://registry.yarnpkg.com/@sentry/electron/-/electron-2.5.4.tgz#337b2f7e228e805a3e4eb3611c7b12c6cf87c618" + integrity sha512-tCCK+P581TmdjsDpHBQz7qYcldzGdUk1Fd6FPxPy1JKGzeY4uf/uSLKzR80Lzs5kTpEZFOwiMHSA8yjwFp5qoA== + dependencies: + "@sentry/browser" "6.7.1" + "@sentry/core" "6.7.1" + "@sentry/minimal" "6.7.1" + "@sentry/node" "6.7.1" + "@sentry/types" "6.7.1" + "@sentry/utils" "6.7.1" + tslib "^2.2.0" + +"@sentry/hub@6.13.2": + version "6.13.2" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.13.2.tgz#ebc66fd55c96c7686a53ffd3521b6a63f883bb79" + integrity sha512-sppSuJdNMiMC/vFm/dQowCBh11uTrmvks00fc190YWgxHshodJwXMdpc+pN61VSOmy2QA4MbQ5aMAgHzPzel3A== + dependencies: + "@sentry/types" "6.13.2" + "@sentry/utils" "6.13.2" + tslib "^1.9.3" + +"@sentry/hub@6.7.1": + version "6.7.1" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.7.1.tgz#d46d24deec67f0731a808ca16796e6765b371bc1" + integrity sha512-eVCTWvvcp6xa0A5GGNHMQEWslmKPlisE5rGmsV/kjvSUv3zSrI0eIDfb51ikdnCiBjHpK2NBWP8Vy8cZOEJegg== + dependencies: + "@sentry/types" "6.7.1" + "@sentry/utils" "6.7.1" + tslib "^1.9.3" + +"@sentry/minimal@6.13.2": + version "6.13.2" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.13.2.tgz#de3ecc62b9463bf56ccdbcf4c75f7ea1aeeebc11" + integrity sha512-6iJfEvHzzpGBHDfLxSHcGObh73XU1OSQKWjuhDOe7UQDyI4BQmTfcXAC+Fr8sm8C/tIsmpVi/XJhs8cubFdSMw== + dependencies: + "@sentry/hub" "6.13.2" + "@sentry/types" "6.13.2" + tslib "^1.9.3" + +"@sentry/minimal@6.7.1": + version "6.7.1" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.7.1.tgz#babf85ee2f167e9dcf150d750d7a0b250c98449c" + integrity sha512-HDDPEnQRD6hC0qaHdqqKDStcdE1KhkFh0RCtJNMCDn0zpav8Dj9AteF70x6kLSlliAJ/JFwi6AmQrLz+FxPexw== + dependencies: + "@sentry/hub" "6.7.1" + "@sentry/types" "6.7.1" + tslib "^1.9.3" + +"@sentry/node@6.7.1": + version "6.7.1" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-6.7.1.tgz#b09e2eca8e187168feba7bd865a23935bf0f5cc0" + integrity sha512-rtZo1O8ROv4lZwuljQz3iFZW89oXSlgXCG2VqkxQyRspPWu89abROpxLjYzsWwQ8djnur1XjFv51kOLDUTS6Qw== + dependencies: + "@sentry/core" "6.7.1" + "@sentry/hub" "6.7.1" + "@sentry/tracing" "6.7.1" + "@sentry/types" "6.7.1" + "@sentry/utils" "6.7.1" + cookie "^0.4.1" + https-proxy-agent "^5.0.0" + lru_map "^0.3.3" + tslib "^1.9.3" + +"@sentry/react@6.13.2": + version "6.13.2" + resolved "https://registry.yarnpkg.com/@sentry/react/-/react-6.13.2.tgz#481f1549b1509b4d94eb943934ebeba6430a1a8f" + integrity sha512-aLkWyn697LTcmK1PPnUg5UJcyBUPoI68motqgBY53SIYDAwOeYNUQt2aanDuOTY5aE2PdnJwU48klA8vuYkoRQ== + dependencies: + "@sentry/browser" "6.13.2" + "@sentry/minimal" "6.13.2" + "@sentry/types" "6.13.2" + "@sentry/utils" "6.13.2" + hoist-non-react-statics "^3.3.2" + tslib "^1.9.3" + +"@sentry/tracing@6.7.1": + version "6.7.1" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.7.1.tgz#b11f0c17a6c5dc14ef44733e5436afb686683268" + integrity sha512-wyS3nWNl5mzaC1qZ2AIp1hjXnfO9EERjMIJjCihs2LWBz1r3efxrHxJHs8wXlNWvrT3KLhq/7vvF5CdU82uPeQ== + dependencies: + "@sentry/hub" "6.7.1" + "@sentry/minimal" "6.7.1" + "@sentry/types" "6.7.1" + "@sentry/utils" "6.7.1" + tslib "^1.9.3" + +"@sentry/types@6.13.2": + version "6.13.2" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.13.2.tgz#8388d5b92ea8608936e7aae842801dc90e0184e6" + integrity sha512-6WjGj/VjjN8LZDtqJH5ikeB1o39rO1gYS6anBxiS3d0sXNBb3Ux0pNNDFoBxQpOhmdDHXYS57MEptX9EV82gmg== + +"@sentry/types@6.7.1": + version "6.7.1" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.7.1.tgz#c8263e1886df5e815570c4668eb40a1cfaa1c88b" + integrity sha512-9AO7HKoip2MBMNQJEd6+AKtjj2+q9Ze4ooWUdEvdOVSt5drg7BGpK221/p9JEOyJAZwEPEXdcMd3VAIMiOb4MA== + +"@sentry/utils@6.13.2": + version "6.13.2" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.13.2.tgz#fb8010e7b67cc8c084d8067d64ef25289269cda5" + integrity sha512-foF4PbxqPMWNbuqdXkdoOmKm3quu3PP7Q7j/0pXkri4DtCuvF/lKY92mbY0V9rHS/phCoj+3/Se5JvM2ymh2/w== + dependencies: + "@sentry/types" "6.13.2" + tslib "^1.9.3" + +"@sentry/utils@6.7.1": + version "6.7.1" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.7.1.tgz#909184ad580f0f6375e1e4d4a6ffd33dfe64a4d1" + integrity sha512-Tq2otdbWlHAkctD+EWTYKkEx6BL1Qn3Z/imkO06/PvzpWvVhJWQ5qHAzz5XnwwqNHyV03KVzYB6znq1Bea9HuA== + dependencies: + "@sentry/types" "6.7.1" + tslib "^1.9.3" + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -2787,9 +3281,9 @@ integrity sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ== "@types/big.js@^6.0.2": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@types/big.js/-/big.js-6.0.2.tgz#a86938c1bb4511e69d91f69823cacc3f48ff1fa3" - integrity sha512-7NdmOT3zjtghMofDwP1nAJCJWVjc/96V5msXRAZ4lPrvpGlajA95VQec7OXwA2wQaVmhjt+F5ko8pjvQU1tTFA== + version "6.1.2" + resolved "https://registry.yarnpkg.com/@types/big.js/-/big.js-6.1.2.tgz#68a952b629a6aaa2b5855a2f63363d1e77f6dd91" + integrity sha512-h24JIZ52rvSvi2jkpYDk2yLH99VzZoCJiSfDWwjst7TwJVuXN61XVCUlPCzRl7mxKEMsGf8z42Q+J4TZwU3z2w== "@types/bn.js@*", "@types/bn.js@5.1.0": version "5.1.0" @@ -3703,6 +4197,11 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -4230,9 +4729,9 @@ big.js@^5.2.2: integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== big.js@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-6.0.3.tgz#8b4d99ac7023668e0e465d3f78c23b8ac29ad381" - integrity sha512-n6yn1FyVL1EW2DBAr4jlU/kObhRzmr+NNRESl65VIOT8WBJj/Kezpx2zFdhJUqYI6qrtTW7moCStYL5VxeVdPA== + version "6.1.1" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-6.1.1.tgz#63b35b19dc9775c94991ee5db7694880655d5537" + integrity sha512-1vObw81a8ylZO5ePrtMay0n018TcftpTA5HFKDaSuiUDBo8biRBtjIobw60OpwuvrGk+FsxKamqN4cnmj/eXdg== bignumber.js@9.0.1: version "9.0.1" @@ -4348,6 +4847,18 @@ boolean@^3.0.1: resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.0.3.tgz#0fee0c9813b66bef25a8a6a904bb46736d05f024" integrity sha512-EqrTKXQX6Z3A2nRmMEIlAIfjQOgFnVO2nqZGpbcsPnYGWBwpFqzlrozU1dy+S2iqfYDLh26ef4KrgTxu9xQrxA== +boxen@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-0.3.1.tgz#a7d898243ae622f7abb6bb604d740a76c6a5461b" + integrity sha1-p9iYJDrmIvertrtgTXQKdsalRhs= + dependencies: + chalk "^1.1.1" + filled-array "^1.0.0" + object-assign "^4.0.1" + repeating "^2.0.0" + string-width "^1.0.1" + widest-line "^1.0.0" + boxen@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.0.1.tgz#657528bdd3f59a772b8279b831f27ec2c744664b" @@ -4672,6 +5183,11 @@ capture-exit@^2.0.0: dependencies: rsvp "^4.8.4" +capture-stack-trace@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" + integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -4685,6 +5201,17 @@ chalk@4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^1.0.0, chalk@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + 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: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -4835,15 +5362,6 @@ cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" -clipboard@^2.0.0: - version "2.0.8" - resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.8.tgz#ffc6c103dd2967a83005f3f61976aa4655a4cdba" - integrity sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ== - dependencies: - good-listener "^1.2.2" - select "^1.1.2" - tiny-emitter "^2.0.0" - cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" @@ -4945,9 +5463,9 @@ color-name@^1.0.0, color-name@~1.1.4: integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.5.4: - version "1.5.5" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.5.tgz#65474a8f0e7439625f3d27a6a19d89fc45223014" - integrity sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg== + version "1.6.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312" + integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" @@ -5107,6 +5625,21 @@ config-chain@^1.1.11: ini "^1.3.4" proto-list "~1.2.1" +configstore@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-2.1.0.tgz#737a3a7036e9886102aa6099e47bb33ab1aba1a1" + integrity sha1-c3o6cDbpiGECqmCZ5HuzOrGroaE= + dependencies: + dot-prop "^3.0.0" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + object-assign "^4.0.1" + os-tmpdir "^1.0.0" + osenv "^0.1.0" + uuid "^2.0.1" + write-file-atomic "^1.1.2" + xdg-basedir "^2.0.0" + configstore@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" @@ -5140,6 +5673,23 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= +const-ninf-float64@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/const-ninf-float64/-/const-ninf-float64-1.0.0.tgz#d9e4c8d3bdd13603e98b93abcbe38f7a6db7318d" + integrity sha1-2eTI073RNgPpi5Ory+OPem23MY0= + +const-pinf-float64@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/const-pinf-float64/-/const-pinf-float64-1.0.0.tgz#f6efb0d79f9c0986d3e79f2923abf9b70b63d726" + integrity sha1-9u+w15+cCYbT558pI6v5twtj1yY= + +const-smallest-float64@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/const-smallest-float64/-/const-smallest-float64-1.0.0.tgz#b706684180c9d87fe0f3f946d60c747e1e54947e" + integrity sha1-twZoQYDJ2H/g8/lG1gx0fh5UlH4= + dependencies: + utils-define-read-only-property "^1.0.0" + content-disposition@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" @@ -5199,6 +5749,11 @@ cookie@0.4.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== +cookie@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" @@ -5277,6 +5832,13 @@ create-ecdh@^4.0.0: bn.js "^4.1.0" elliptic "^6.5.3" +create-error-class@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= + dependencies: + capture-stack-trace "^1.0.0" + create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" @@ -5403,9 +5965,9 @@ csstype@3.0.7: integrity sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g== csstype@^3.0.2: - version "3.0.8" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340" - integrity sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw== + version "3.0.9" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.9.tgz#6410af31b26bd0520933d02cbc64fce9ce3fbf0b" + integrity sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw== dargs@^7.0.0: version "7.0.0" @@ -5612,11 +6174,6 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -delegate@^3.1.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" - integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== - delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" @@ -5708,6 +6265,11 @@ discontinuous-range@1.0.0: resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" integrity sha1-44Mx8IRLukm5qctxx3FYWqsbxlo= +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + dmg-builder@22.10.5: version "22.10.5" resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-22.10.5.tgz#65a33c106ead5a350c7de8997c546559bd6e0e7c" @@ -5779,9 +6341,9 @@ dom-helpers@^3.3.1: "@babel/runtime" "^7.1.2" dom-helpers@^5.0.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.0.tgz#57fd054c5f8f34c52a3eeffdb7e7e93cd357d95b" - integrity sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ== + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== dependencies: "@babel/runtime" "^7.8.7" csstype "^3.0.2" @@ -5828,6 +6390,13 @@ domutils@^2.5.2, domutils@^2.6.0: domelementtype "^2.2.0" domhandler "^4.2.0" +dot-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" + integrity sha1-G3CK8JSknJoOfbyteQq6U52sEXc= + dependencies: + is-obj "^1.0.0" + dot-prop@^5.1.0, dot-prop@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -5852,6 +6421,18 @@ dotenv@^8.2.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== +dset@2.1.0, dset@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/dset/-/dset-2.1.0.tgz#cd1e99e55cf32366d8f144f906c42f7fb3bf431e" + integrity sha512-hlQYwNEdW7Qf8zxysy+yN1E8C/SxRst3Z9n+IvXOR35D9bPVwNHhnL8ZBeoZjvinuGrlvGg6pAMDwhmjqFDgjA== + +duplexer2@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= + dependencies: + readable-stream "^2.0.2" + duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -6187,7 +6768,7 @@ errno@^0.1.3: dependencies: prr "~1.0.1" -error-ex@^1.3.1: +error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== @@ -6262,7 +6843,7 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -6832,6 +7413,11 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +filled-array@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/filled-array/-/filled-array-1.1.0.tgz#c3c4f6c663b923459a9aa29912d2d031f1507f84" + integrity sha1-w8T2xmO5I0WamqKZEtLQMfFQf4Q= + finalhandler@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -7272,12 +7858,31 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" -good-listener@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" - integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA= - dependencies: - delegate "^3.1.2" +goober@^2.0.35: + version "2.0.41" + resolved "https://registry.yarnpkg.com/goober/-/goober-2.0.41.tgz#0a3d786ff9917bcf2a096eef703bf717838cbec9" + integrity sha512-kwjegMT5018zWydhOQlQneCgCtrKJaPsru7TaBWmTYV0nsMeUrM6L6O8JmNYb9UbPMgWcmtf+9p4Y3oJabIH1A== + +got@^5.0.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35" + integrity sha1-X4FjWmHkplifGAVp6k44FoClHzU= + dependencies: + create-error-class "^3.0.1" + duplexer2 "^0.1.4" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + node-status-codes "^1.0.0" + object-assign "^4.0.1" + parse-json "^2.1.0" + pinkie-promise "^2.0.0" + read-all-stream "^3.0.0" + readable-stream "^2.0.5" + timed-out "^3.0.0" + unzip-response "^1.0.2" + url-parse-lax "^1.0.0" got@^9.6.0: version "9.6.0" @@ -7346,6 +7951,13 @@ harmony-reflect@^1.4.6: resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + has-bigints@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" @@ -7799,17 +8411,14 @@ interpret@^2.2.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== -intl-messageformat-parser@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/intl-messageformat-parser/-/intl-messageformat-parser-1.4.0.tgz#b43d45a97468cadbe44331d74bb1e8dea44fc075" - integrity sha1-tD1FqXRoytvkQzHXS7Ho3qRPwHU= - -intl-messageformat@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-2.2.0.tgz#345bcd46de630b7683330c2e52177ff5eab484fc" - integrity sha1-NFvNRt5jC3aDMwwuUhd/9eq0hPw= +intl-messageformat@^9.6.12: + version "9.9.1" + resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.9.1.tgz#255d453b0656b4f7e741f31d2b4a95bf2adfe064" + integrity sha512-cuzS/XKHn//hvKka77JKU2dseiVY2dofQjIOZv6ZFxFt4Z9sPXnZ7KQ9Ak2r+4XBCjI04MqJ1PhKs/3X22AkfA== dependencies: - intl-messageformat-parser "1.4.0" + "@formatjs/fast-memoize" "1.2.0" + "@formatjs/icu-messageformat-parser" "2.0.11" + tslib "^2.1.0" ip-regex@^2.1.0: version "2.1.0" @@ -7971,6 +8580,11 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= +is-finite@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" @@ -8038,6 +8652,11 @@ is-negative-zero@^2.0.1: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= + is-npm@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" @@ -8060,7 +8679,7 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-obj@^1.0.1: +is-obj@^1.0.0, is-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= @@ -8111,6 +8730,11 @@ is-potential-custom-element-name@^1.0.0: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= + is-regex@^1.0.4, is-regex@^1.0.5: version "1.1.2" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" @@ -8132,7 +8756,12 @@ is-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= -is-stream@^1.1.0: +is-retry-allowed@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" + integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== + +is-stream@^1.0.0, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -8684,6 +9313,11 @@ jpeg-js@^0.4.2: resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.3.tgz#6158e09f1983ad773813704be80680550eff977b" integrity sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q== +js-cookie@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" + integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== + js-sha3@0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" @@ -8925,6 +9559,18 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== +klona@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" + integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== + +latest-version@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-2.0.0.tgz#56f8d6139620847b8017f8f1f4d78e211324168b" + integrity sha1-VvjWE5YghHuAF/jx9NeOIRMkFos= + dependencies: + package-json "^2.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" @@ -9171,6 +9817,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0= + make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -9235,6 +9886,70 @@ matcher@^3.0.0: dependencies: escape-string-regexp "^4.0.0" +math-abs@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/math-abs/-/math-abs-1.0.2.tgz#8fb2675d969327a61a629821fc23e41faac5c4d3" + integrity sha1-j7JnXZaTJ6YaYpgh/CPkH6rFxNM= + +math-float64-copysign@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/math-float64-copysign/-/math-float64-copysign-1.0.0.tgz#8aec85d28d81c7a23cab0748a23c5f01916966f6" + integrity sha1-iuyF0o2Bx6I8qwdIojxfAZFpZvY= + dependencies: + math-float64-from-words "^1.0.0" + math-float64-get-high-word "^1.0.0" + math-float64-to-words "^1.0.0" + +math-float64-exponent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/math-float64-exponent/-/math-float64-exponent-1.0.0.tgz#d8893e835f5e65812add6ce7abafee93daa75ca5" + integrity sha1-2Ik+g19eZYEq3Wznq6/uk9qnXKU= + dependencies: + math-float64-get-high-word "^1.0.0" + +math-float64-from-words@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/math-float64-from-words/-/math-float64-from-words-1.0.0.tgz#94648f9377f8128a8add54856cba951f6e90a139" + integrity sha1-lGSPk3f4EoqK3VSFbLqVH26QoTk= + dependencies: + utils-is-little-endian "^1.0.0" + +math-float64-get-high-word@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/math-float64-get-high-word/-/math-float64-get-high-word-1.0.0.tgz#9fb7107e366585d5bb0efddc036f947c9666611a" + integrity sha1-n7cQfjZlhdW7Dv3cA2+UfJZmYRo= + dependencies: + utils-is-little-endian "^1.0.0" + +math-float64-ldexp@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/math-float64-ldexp/-/math-float64-ldexp-1.0.1.tgz#e8076daa29a6529a572002fa9fd9e3e3c52253da" + integrity sha1-6AdtqimmUppXIAL6n9nj48UiU9o= + dependencies: + const-ninf-float64 "^1.0.0" + const-pinf-float64 "^1.0.0" + math-float64-copysign "^1.0.0" + math-float64-exponent "^1.0.0" + math-float64-from-words "^1.0.0" + math-float64-normalize "^1.0.0" + math-float64-to-words "^1.0.0" + +math-float64-normalize@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/math-float64-normalize/-/math-float64-normalize-1.0.0.tgz#d8bba30804df177bf1d76f641315301fa1260077" + integrity sha1-2LujCATfF3vx129kExUwH6EmAHc= + dependencies: + const-smallest-float64 "^1.0.0" + math-abs "^1.0.2" + validate.io-infinite "^1.0.0" + +math-float64-to-words@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/math-float64-to-words/-/math-float64-to-words-1.0.0.tgz#624ebd00c7ff87b2bbcba6e230f904e8a83e061e" + integrity sha1-Yk69AMf/h7K7y6biMPkE6Kg+Bh4= + dependencies: + utils-is-little-endian "^1.0.0" + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -9455,7 +10170,7 @@ mkdirp@1.x, mkdirp@^1.0.3: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@^0.5.1, mkdirp@^0.5.4, mkdirp@^0.5.5: +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.4, mkdirp@^0.5.5: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -9571,6 +10286,13 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +new-date@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/new-date/-/new-date-1.0.3.tgz#a5956086d3f5ed43d0b210d87a10219ccb7a2326" + integrity sha512-0fsVvQPbo2I18DT2zVHpezmeeNYV2JaJSrseiHLc17GNOxJzUdx5mvSigPu8LtIfZSij5i1wXnXFspEs2CD6hA== + dependencies: + "@segment/isodate" "1.0.3" + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -9641,6 +10363,11 @@ node-releases@^1.1.71: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== +node-status-codes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" + integrity sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8= + nopt@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" @@ -9739,6 +10466,11 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== +obj-case@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/obj-case/-/obj-case-0.2.1.tgz#13a554d04e5ca32dfd9d566451fd2b0e11007f1a" + integrity sha512-PquYBBTy+Y6Ob/O2574XHhDtHJlV1cJHMCgW+rDRc9J5hhmRelJB3k5dTK/3cVmFVtzvAKuENeuLpoyTzMzkOg== + object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -9933,6 +10665,24 @@ os-browserify@0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-tmpdir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.0: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" @@ -10026,6 +10776,16 @@ 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-json@^2.0.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-2.4.0.tgz#0d15bd67d1cbbddbb2ca222ff2edb86bcb31a8bb" + integrity sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs= + dependencies: + got "^5.0.0" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + package-json@^6.3.0: version "6.5.0" resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" @@ -10059,6 +10819,13 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" +parse-json@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -10278,6 +11045,11 @@ pkg-up@^3.1.0: dependencies: find-up "^3.0.0" +pkginfo@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" + integrity sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE= + playwright@1.13.1: version "1.13.1" resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.13.1.tgz#53c49244ffa7fc2d5d8bf7ce87739393206eda5e" @@ -10343,6 +11115,11 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + prepend-http@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" @@ -10371,16 +11148,14 @@ pretty-format@^26.0.0, pretty-format@^26.6.2: react-is "^17.0.1" prism-react-renderer@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.2.0.tgz#5ad4f90c3e447069426c8a53a0eafde60909cdf4" - integrity sha512-GHqzxLYImx1iKN1jJURcuRoA/0ygCcNhfGw1IT8nPIMzarmKQ3Nc+JcG0gi8JXQzuh0C5ShE4npMIoqNin40hg== + version "1.2.1" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.2.1.tgz#392460acf63540960e5e3caa699d851264e99b89" + integrity sha512-w23ch4f75V1Tnz8DajsYKvY5lF7H1+WvzvLUcF0paFxkTHSp42RS0H5CttdN2Q8RR3DRGZ9v5xD/h3n8C8kGmg== prismjs@^1.23.0: - version "1.23.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.23.0.tgz#d3b3967f7d72440690497652a9d40ff046067f33" - integrity sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA== - optionalDependencies: - clipboard "^2.0.0" + version "1.25.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.25.0.tgz#6f822df1bdad965734b310b315a23315cf999756" + integrity sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg== process-nextick-args@~2.0.0: version "2.0.1" @@ -10602,7 +11377,7 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.2.8: +rc@^1.0.1, rc@^1.1.6, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -10613,35 +11388,39 @@ rc@^1.2.8: strip-json-comments "~2.0.1" react-aria@^3.4.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/react-aria/-/react-aria-3.5.0.tgz#52ba11feac30578c6c61a08137958fa2d32b8215" - integrity sha512-V/qPcflOHTdt30BW9BV90nLwB9GsL6mbaMj2VORHUdJFw1VpqLUx91Cx4KDYmaWk5I+j5pjM1rO79VwTIJ3KHA== - dependencies: - "@react-aria/breadcrumbs" "^3.1.3" - "@react-aria/button" "^3.3.1" - "@react-aria/checkbox" "^3.2.1" - "@react-aria/dialog" "^3.1.2" - "@react-aria/focus" "^3.2.4" - "@react-aria/i18n" "^3.3.0" - "@react-aria/interactions" "^3.3.4" - "@react-aria/label" "^3.1.1" - "@react-aria/link" "^3.1.2" - "@react-aria/listbox" "^3.2.4" - "@react-aria/menu" "^3.2.0" - "@react-aria/meter" "^3.1.1" - "@react-aria/overlays" "^3.6.2" - "@react-aria/progress" "^3.1.1" - "@react-aria/radio" "^3.1.3" - "@react-aria/searchfield" "^3.1.2" - "@react-aria/select" "^3.3.1" - "@react-aria/separator" "^3.1.1" - "@react-aria/slider" "^3.0.1" - "@react-aria/ssr" "^3.0.1" - "@react-aria/switch" "^3.1.1" - "@react-aria/textfield" "^3.2.2" - "@react-aria/tooltip" "^3.1.1" - "@react-aria/utils" "^3.7.0" - "@react-aria/visually-hidden" "^3.2.1" + version "3.10.0" + resolved "https://registry.yarnpkg.com/react-aria/-/react-aria-3.10.0.tgz#11201ce7cff295a71f848cffdb6ab0ad5a1045b0" + integrity sha512-z4U4CPHDDVO7HulTQlx3uLii0V849e8N15sYIGqYBHVex8Mi60YZb+rZq5qzZxMjDL0rvPHBAJl5i2F4d4QQWA== + dependencies: + "@react-aria/breadcrumbs" "^3.1.5" + "@react-aria/button" "^3.3.4" + "@react-aria/checkbox" "^3.2.3" + "@react-aria/combobox" "^3.1.0" + "@react-aria/dialog" "^3.1.4" + "@react-aria/focus" "^3.5.0" + "@react-aria/i18n" "^3.3.2" + "@react-aria/interactions" "^3.6.0" + "@react-aria/label" "^3.2.0" + "@react-aria/link" "^3.1.4" + "@react-aria/listbox" "^3.3.1" + "@react-aria/menu" "^3.2.3" + "@react-aria/meter" "^3.1.3" + "@react-aria/numberfield" "^3.1.0" + "@react-aria/overlays" "^3.7.2" + "@react-aria/progress" "^3.1.3" + "@react-aria/radio" "^3.1.5" + "@react-aria/searchfield" "^3.2.0" + "@react-aria/select" "^3.5.0" + "@react-aria/separator" "^3.1.3" + "@react-aria/slider" "^3.0.3" + "@react-aria/ssr" "^3.1.0" + "@react-aria/switch" "^3.1.3" + "@react-aria/table" "^3.0.0" + "@react-aria/tabs" "^3.0.2" + "@react-aria/textfield" "^3.4.0" + "@react-aria/tooltip" "^3.1.3" + "@react-aria/utils" "^3.9.0" + "@react-aria/visually-hidden" "^3.2.3" react-card-flip@1.1.0: version "1.1.0" @@ -10681,6 +11460,13 @@ react-hot-loader@4.13.0: shallowequal "^1.1.0" source-map "^0.7.3" +react-hot-toast@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/react-hot-toast/-/react-hot-toast-2.1.1.tgz#56409ab406b534e9e58274cf98d80355ba0fdda0" + integrity sha512-Odrp4wue0fHh0pOfZt5H+9nWCMtqs3wdlFSzZPp7qsxfzmbE26QmGWIh6hG43CukiPeOjA8WQhBJU8JwtWvWbQ== + dependencies: + goober "^2.0.35" + react-hotkeys-hook@3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/react-hotkeys-hook/-/react-hotkeys-hook-3.3.0.tgz#356428769fa990c333d4ee4998b866bbd45e54b8" @@ -10695,6 +11481,11 @@ react-hotkeys-hook@^2.4.0: dependencies: hotkeys-js "3.8.1" +react-icons@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.2.0.tgz#6dda80c8a8f338ff96a1851424d63083282630d0" + integrity sha512-rmzEDFt+AVXRzD7zDE21gcxyBizD/3NqjbX6cmViAgdqfJ2UiLer8927/QhhrXQV7dEj/1EGuOTPp7JnLYVJKQ== + react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" @@ -10774,9 +11565,9 @@ react-router@5.2.0: tiny-warning "^1.0.0" react-transition-group@^4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.1.tgz#63868f9325a38ea5ee9535d828327f85773345c9" - integrity sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw== + version "4.4.2" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470" + integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg== dependencies: "@babel/runtime" "^7.5.5" dom-helpers "^5.0.1" @@ -10791,6 +11582,14 @@ react@17.0.2: loose-envify "^1.1.0" object-assign "^4.1.1" +read-all-stream@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" + integrity sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po= + dependencies: + pinkie-promise "^2.0.0" + readable-stream "^2.0.0" + read-config-file@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.0.0.tgz#224b5dca6a5bdc1fb19e63f89f342680efdb9299" @@ -10847,7 +11646,7 @@ readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.6, readable-stre string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@~2.3.6: +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.2.2, 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== @@ -10922,9 +11721,9 @@ regenerate@^1.4.0: integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.13.4: - version "0.13.7" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" - integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== regenerator-transform@^0.14.2: version "0.14.5" @@ -10966,6 +11765,14 @@ regexpu-core@^4.7.1: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.2.0" +registry-auth-token@^3.0.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" + integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + registry-auth-token@^4.0.0: version "4.2.1" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" @@ -10973,6 +11780,13 @@ registry-auth-token@^4.0.0: dependencies: rc "^1.2.8" +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= + dependencies: + rc "^1.0.1" + registry-url@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" @@ -11012,6 +11826,13 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + request-promise-core@1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" @@ -11352,11 +12173,6 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -select@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" - integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= - selfsigned@^1.10.8: version "1.10.8" resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.8.tgz#0d17208b7d12c33f8eac85c41835f27fc3d81a30" @@ -11369,6 +12185,13 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= + dependencies: + semver "^5.0.3" + semver-diff@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" @@ -11376,7 +12199,7 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -11598,6 +12421,11 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +slide@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= + smart-buffer@^4.0.2, smart-buffer@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" @@ -11734,6 +12562,11 @@ source-map@^0.7.3, source-map@~0.7.2: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== +spark-md5@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.2.tgz#7952c4a30784347abcee73268e473b9c0167e3fc" + integrity sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw== + spawn-command@^0.0.2-1: version "0.0.2-1" resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" @@ -12098,6 +12931,11 @@ sumchecker@^3.0.1: dependencies: debug "^4.1.0" +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -12256,10 +13094,15 @@ thunky@^1.0.2: resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== -tiny-emitter@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" - integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== +timed-out@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217" + integrity sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc= + +tiny-hashes@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tiny-hashes/-/tiny-hashes-1.0.1.tgz#ddbe9060312ddb4efe0a174bb3a27e1331c425a1" + integrity sha512-knIN5zj4fl7kW4EBU5sLP20DWUvi/rVouvJezV0UAym2DkQaqm365Nyc8F3QEiOvunNDMxR8UhcXd1d5g+Wg1g== tiny-invariant@^1.0.2: version "1.1.0" @@ -12421,15 +13264,15 @@ tsconfig-paths@^3.9.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" - integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== +tslib@^2.1.0, tslib@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== tsutils@^3.17.1: version "3.21.0" @@ -12530,9 +13373,9 @@ typescript@4.2.3: integrity sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw== typescript@^4.1.2: - version "4.2.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" - integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg== + version "4.4.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" + integrity sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA== unbox-primitive@^1.0.1: version "1.0.1" @@ -12544,6 +13387,16 @@ unbox-primitive@^1.0.1: has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" +unfetch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-3.1.2.tgz#dc271ef77a2800768f7b459673c5604b5101ef77" + integrity sha512-L0qrK7ZeAudGiKYw6nzFjnJ2D5WHblUBwmHIqtPS6oKUd+Hcpk7/hKsSmcHsTlpd1TbTNsiRBUKRq3bHLNIqIw== + +unfetch@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" + integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -12639,11 +13492,28 @@ unzip-crx-3@^0.2.0: mkdirp "^0.5.1" yaku "^0.16.6" +unzip-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" + integrity sha1-uYTwh3/AqJwsdzzB73tbIytbBv4= + upath@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== +update-notifier@^0.6.0: + version "0.6.3" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-0.6.3.tgz#776dec8daa13e962a341e8a1d98354306b67ae08" + integrity sha1-d23sjaoT6WKjQeih2YNUMGtnrgg= + dependencies: + boxen "^0.3.1" + chalk "^1.0.0" + configstore "^2.0.0" + is-npm "^1.0.0" + latest-version "^2.0.0" + semver-diff "^2.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" @@ -12690,6 +13560,13 @@ url-loader@4.1.1: mime-types "^2.1.27" schema-utils "^3.0.0" +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + 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" @@ -12767,11 +13644,30 @@ util@^0.12.0: safe-buffer "^5.1.2" which-typed-array "^1.1.2" +utils-define-read-only-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-define-read-only-property/-/utils-define-read-only-property-1.0.0.tgz#2e5db55acb0a9f06f5c81bad9f426d0e24f8e16f" + integrity sha1-Ll21WssKnwb1yButn0JtDiT44W8= + +utils-is-little-endian@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-is-little-endian/-/utils-is-little-endian-1.0.0.tgz#a111d6e23593d3d228b0254664cd35c56dd5ad27" + integrity sha1-oRHW4jWT09IosCVGZM01xW3VrSc= + dependencies: + minimist "^1.2.0" + pkginfo "^0.3.1" + update-notifier "^0.6.0" + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= +uuid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + integrity sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho= + uuid@^3.3.2, uuid@^3.3.3, uuid@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" @@ -12809,6 +13705,11 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +validate.io-infinite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-infinite/-/validate.io-infinite-1.0.0.tgz#9076cf0b41f7ac201a42d58697c461142b4afcfb" + integrity sha1-kHbPC0H3rCAaQtWGl8RhFCtK/Ps= + value-equal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" @@ -13160,6 +14061,13 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" +widest-line@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" + integrity sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw= + dependencies: + string-width "^1.0.1" + widest-line@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" @@ -13209,6 +14117,15 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +write-file-atomic@^1.1.2: + version "1.3.4" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" + integrity sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8= + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + write-file-atomic@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" @@ -13241,6 +14158,13 @@ ws@~7.4.2: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== +xdg-basedir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" + integrity sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I= + dependencies: + os-homedir "^1.0.0" + xdg-basedir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"