diff --git a/.codecov.yml b/.codecov.yml new file mode 100644 index 0000000000..a125444121 --- /dev/null +++ b/.codecov.yml @@ -0,0 +1,21 @@ +coverage: + precision: 2 + round: down + range: '50...85' # Will lift this number as coverage increases + + status: + project: + default: + # basic + target: auto + threshold: 1% + base: auto + patch: + default: + # basic + target: 80% + threshold: 1% + base: auto + +ignore: + - 'packages/sdk/.*' # Waiting for sdk tests diff --git a/.github/workflows/jest.yml b/.github/workflows/jest.yml new file mode 100644 index 0000000000..9cb5ac80b3 --- /dev/null +++ b/.github/workflows/jest.yml @@ -0,0 +1,42 @@ +name: 'Jest' +on: + push: + branches: + - master + pull_request: + +jobs: + sentry_release: + name: Jest tests + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Setup Node.js environment + uses: actions/setup-node@v3 + with: + node-version: 16.x + + - uses: pnpm/action-setup@v2 + name: Install pnpm + id: pnpm-install + with: + version: 8 + run_install: false + + - name: Install dependencies + run: pnpm i + + - name: Run tests + run: cd packages/app && pnpm run test:jest + env: + NEXT_PUBLIC_WALLETCONNECT_V2_ID: ${{ secrets.NEXT_PUBLIC_WALLETCONNECT_V2_ID }} + + - name: Upload coverage to codecov.io + uses: codecov/codecov-action@v3 + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/sentry.yml b/.github/workflows/sentry.yml index f7cfd19ff1..87a2f06cba 100644 --- a/.github/workflows/sentry.yml +++ b/.github/workflows/sentry.yml @@ -29,6 +29,8 @@ jobs: - name: Build code run: pnpm i && cd packages/app && pnpm build + env: + NEXT_PUBLIC_WALLETCONNECT_V2_ID: ${{ secrets.NEXT_PUBLIC_WALLETCONNECT_V2_ID }} - name: Create Sentry release uses: getsentry/action-release@v1 diff --git a/package.json b/package.json index ea3df1643d..c60fa0e5ac 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "kwenta", - "version": "7.3.3", + "version": "7.3.4", "description": "Kwenta", "main": "index.js", "scripts": { @@ -32,9 +32,9 @@ ] }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "5.60.1", - "@typescript-eslint/parser": "5.60.1", - "eslint": "8.43.0", + "@typescript-eslint/eslint-plugin": "5.61.0", + "@typescript-eslint/parser": "5.61.0", + "eslint": "8.44.0", "eslint-config-prettier": "8.8.0", "eslint-config-react-app": "7.0.1", "eslint-plugin-cypress": "2.13.3", diff --git a/packages/app/__tests__/pages/market.test.tsx b/packages/app/__tests__/pages/market.test.tsx deleted file mode 100644 index 805bd15dd2..0000000000 --- a/packages/app/__tests__/pages/market.test.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { render } from '@testing-library/react' - -import Market from 'pages/market' - -import { TEST_ADDR } from '../../testing/unit/constants' -import mockConnector from '../../testing/unit/mocks/mockConnector' -import MockProviders from '../../testing/unit/mocks/MockProviders' -import { mockGrapqhlRequest, mockReactQuery } from '../../testing/unit/mocks/mockQueries' - -describe('Futures market page - cross margin', () => { - beforeAll(() => { - // TODO: remove this when we return to writing tests - jest.spyOn(console, 'error').mockImplementation(() => {}) - mockReactQuery() - }) - test('Displays cross margin not available when unsupported network', async () => { - mockGrapqhlRequest({ crossMarginAccounts: [] }) - mockConnector({ network: { id: 1, name: 'ethereum' } }) - - const { findAllByTestId } = render( - - - - ) - - const components = await findAllByTestId('cross-margin-unsupported-network') - // Mobile and Desktop both get rendered - expect(components.length).toEqual(2) - }) - test('Displays cross margin onboard prompt when no cross margin account', async () => { - mockGrapqhlRequest({ crossMarginAccounts: [] }) - mockConnector() - - const { findAllByTestId } = render( - - - - ) - - const components = await findAllByTestId('cross-margin-create-account') - // Mobile and Desktop both get rendered - expect(components.length).toEqual(2) - }) - test('Trade panel input is disabled when wallet not connected', async () => { - mockGrapqhlRequest({ crossMarginAccounts: [{ id: TEST_ADDR }] }) - mockConnector() - - const { findByTestId } = render( - - - - ) - - const component = await findByTestId('set-order-size-amount-susd-desktop') - expect(component.hasAttribute('disabled')) - }) -}) diff --git a/packages/app/jest.config.js b/packages/app/jest.config.js index 9fb8226eaa..8236e81b7e 100644 --- a/packages/app/jest.config.js +++ b/packages/app/jest.config.js @@ -1,25 +1,30 @@ -const nextJest = require('next/jest'); +const nextJest = require('next/jest') -const createJestConfig = nextJest({ dir: './' }); +const createJestConfig = nextJest({ dir: './' }) const customJestConfig = { - roots: [''], - modulePaths: [''], - moduleDirectories: ['node_modules'], + roots: ['', 'src'], + modulePaths: ['', 'src'], + moduleDirectories: ['node_modules', 'src'], + moduleNameMapper: { + '@kwenta/sdk/(.+)$': '/../sdk/dist/$1', + '@kwenta/sdk': '/../sdk/dist/index.js', + }, globalSetup: './testing/unit/setup/global.js', setupFilesAfterEnv: ['./testing/unit/setup/setup.js'], testEnvironment: 'jest-environment-jsdom', transform: { '^.+\\.(svg)$': `jest-transformer-svg`, }, -}; +} const getCustomConfig = async () => { // Delete next js module name mapper transform and use above svg // transformer to avoid errors with svg and styled components - const config = await createJestConfig(customJestConfig)(); - delete config['moduleNameMapper']['^.+\\.(svg)$']; - return config; -}; + const config = await createJestConfig(customJestConfig)() + delete config['moduleNameMapper']['^.+\\.(svg)$'] + config.transformIgnorePatterns = [] + return config +} -module.exports = getCustomConfig(); +module.exports = getCustomConfig() diff --git a/packages/app/package.json b/packages/app/package.json index 881e58f5f8..2382c454ff 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "@kwenta/app", - "version": "7.3.3", + "version": "7.3.4", "scripts": { "dev": "next", "build": "next build", @@ -8,7 +8,7 @@ "export": "next export", "check-types": "tsc --noEmit", "jest-preview": "jest-preview", - "test:unit": "jest --coverage --detectOpenHandles", + "test:jest": "jest --coverage --detectOpenHandles", "test:e2e": "start-server-and-test 'pnpm build && pnpm start' http-get://localhost:3000 'synpress run'", "test:e2e:only:tests": "synpress run", "test:e2e:open:testrunner": "synpress open", @@ -43,7 +43,7 @@ "cors": "^2.8.5", "crypto-browserify": "^3.12.0", "date-fns": "2.21.3", - "date-fns-tz": "1.3.7", + "date-fns-tz": "2.0.0", "echarts": "5.4.2", "eslint-config-next": "^13.4.6", "ethcall": "4.7.2", @@ -82,10 +82,9 @@ "zrender": "^5.4.3" }, "devDependencies": { - "@microsoft/eslint-formatter-sarif": "2.1.7", "@next/eslint-plugin-next": "13.4.7", "@storybook/addon-actions": "7.0.24", - "@storybook/addon-essentials": "7.0.24", + "@storybook/addon-essentials": "7.0.25", "@storybook/addon-links": "7.0.24", "@storybook/nextjs": "7.0.24", "@storybook/react": "7.0.24", diff --git a/packages/app/src/__tests__/pages/market.test.tsx b/packages/app/src/__tests__/pages/market.test.tsx new file mode 100644 index 0000000000..6cfeb239a9 --- /dev/null +++ b/packages/app/src/__tests__/pages/market.test.tsx @@ -0,0 +1,196 @@ +import { FuturesMarket } from '@kwenta/sdk/dist/types' +import { wei } from '@synthetixio/wei' +import { fireEvent, render, waitFor } from '@testing-library/react' +import { ReactNode } from 'react' + +import { fetchMarkets } from 'state/futures/actions' + +import { mockResizeObserver } from '../../../testing/unit/mocks/app' +import { PRELOADED_STATE } from '../../../testing/unit/mocks/data/app' +import { + mockSmartMarginAccount, + preloadedStateWithSmartMarginAccount, + SDK_MARKETS, +} from '../../../testing/unit/mocks/data/futures' +import { mockUseWindowSize } from '../../../testing/unit/mocks/hooks' +import mockConnector from '../../../testing/unit/mocks/mockConnector' +import MockProviders from '../../../testing/unit/mocks/MockProviders' +import { mockReactQuery } from '../../../testing/unit/mocks/queries' +import Market from '../../pages/market' +import { selectTradePreview } from '../../state/futures/selectors' +import sdk from '../../state/sdk' +import { setupStore } from '../../state/store' + +jest.mock('../../state/sdk') + +jest.mock('../../queries/futures/useGetFuturesTrades', () => { + return jest.fn(() => ({ + data: [], + isLoading: false, + fetchNextPage: () => {}, + })) +}) + +jest.mock('../../components/Media', () => ({ + ...jest.requireActual('../../components/Media'), + DesktopOnlyView: ({ children }: { children: ReactNode }) =>
{children}
, + MobileOnlyView: ({ children }: { children: ReactNode }) =>
{children}
, +})) + +describe('Futures market page - smart margin', () => { + beforeAll(() => { + jest.setTimeout(60000) + mockUseWindowSize() + mockReactQuery() + mockResizeObserver() + mockConnector() + }) + + test('Calculates correct fees from trade preview', async () => { + const { findByTestId, findByText } = render( + + + + ) + + const marginInput = await findByTestId('set-order-margin-susd-desktop') + fireEvent.change(marginInput, { target: { value: '100' } }) + + const sizeInput = await findByTestId('set-order-size-amount-susd-desktop') + fireEvent.change(sizeInput, { target: { value: '1000' } }) + + const fees = await findByText('$1.69') + expect(fees).toBeTruthy() + }) + + test('Submits LONG order with correct desired fill price', async () => { + const store = setupStore(preloadedStateWithSmartMarginAccount()) + const { findByTestId, findByText } = render( + + + + ) + + const marginInput = await findByTestId('set-order-margin-susd-desktop') + fireEvent.change(marginInput, { target: { value: '100' } }) + + const sizeInput = await findByTestId('set-order-size-amount-susd-desktop') + fireEvent.change(sizeInput, { target: { value: '1000' } }) + + const fees = await findByText('$1.69') + expect(fees).toBeTruthy() + + const submitButton = await findByTestId('trade-panel-submit-button') + fireEvent.click(submitButton) + + const confirmButton = await findByTestId('trade-confirm-order-button') + fireEvent.click(confirmButton) + + // Preview generated fill price displayed in confirmation view + const fillPrice = await findByText('$1,847.76') + expect(fillPrice).toBeTruthy() + + // Desired fill price is higher than fill price by 1% + // (as a long order the price is worse to account for slippage in delayed order) + expect(selectTradePreview(store.getState())?.desiredFillPrice.toString()).toBe( + '1866.234411491951332934' + ) + }) + + test('Submits SHORT order with correct desired fill price', async () => { + const store = setupStore(preloadedStateWithSmartMarginAccount()) + const { findByTestId, findByText } = render( + + + + ) + + const shortToggle = await findByTestId('position-side-short-button') + fireEvent.click(shortToggle) + + const marginInput = await findByTestId('set-order-margin-susd-desktop') + fireEvent.change(marginInput, { target: { value: '100' } }) + + const sizeInput = await findByTestId('set-order-size-amount-susd-desktop') + fireEvent.change(sizeInput, { target: { value: '1000' } }) + + const fees = await findByText('$1.69') + expect(fees).toBeTruthy() + + const submitButton = await findByTestId('trade-panel-submit-button') + fireEvent.click(submitButton) + + const confirmButton = await findByTestId('trade-confirm-order-button') + fireEvent.click(confirmButton) + + // Preview generated fill price displayed in confirmation view + const fillPrice = await findByText('$1,847.76') + expect(fillPrice).toBeTruthy() + + // Desired fill price is lower than fill price by 1% + // (as a short order the price is worse to account for slippage in delayed order) + expect(selectTradePreview(store.getState())?.desiredFillPrice.toString()).toBe( + '1829.279274630724573866' + ) + }) + + test('Displays error when trade exceeds max OI', async () => { + // Update the mock to return some different data + sdk.futures.getMarkets = () => + Promise.resolve([{ ...SDK_MARKETS[1], marketLimitUsd: wei(100000) } as FuturesMarket]) + + const store = setupStore( + preloadedStateWithSmartMarginAccount(mockSmartMarginAccount('1000000')) + ) + const { findByTestId, findByText } = render( + + + + ) + + const marginInput = await findByTestId('set-order-margin-susd-desktop') + fireEvent.change(marginInput, { target: { value: '100000' } }) + + const sizeInput = await findByTestId('set-order-size-amount-susd-desktop') + fireEvent.change(sizeInput, { target: { value: '1000000' } }) + + // OI limit warning displayed + const fillPrice = await findByText('Open interest limit exceeded') + expect(fillPrice).toBeTruthy() + }) + + test('Trade panel is disabled when market is closed', async () => { + sdk.futures.getMarkets = () => Promise.resolve([...SDK_MARKETS] as FuturesMarket[]) + const store = setupStore(preloadedStateWithSmartMarginAccount()) + const { findByTestId, findByText } = render( + + + + ) + + const marginInput = await findByTestId('set-order-margin-susd-desktop') + fireEvent.change(marginInput, { target: { value: '100' } }) + + const sizeInput = await findByTestId('set-order-size-amount-susd-desktop') + fireEvent.change(sizeInput, { target: { value: '1000' } }) + + const fees = await findByText('$1.69') + expect(fees).toBeTruthy() + + const submitButton = await findByTestId('trade-panel-submit-button') + expect(submitButton).toBeEnabled() + + sdk.futures.getMarkets = () => + Promise.resolve([{ ...SDK_MARKETS[1], isSuspended: true } as FuturesMarket]) + + waitFor(() => store.dispatch(fetchMarkets())) + + const message = await findByText('Market suspended') + expect(message).toBeTruthy() + + expect(submitButton).toBeDisabled() + }) +}) diff --git a/packages/app/src/components/InfoBox.tsx b/packages/app/src/components/InfoBox.tsx index 20b76cd9ef..7d081cad0c 100644 --- a/packages/app/src/components/InfoBox.tsx +++ b/packages/app/src/components/InfoBox.tsx @@ -9,9 +9,10 @@ import { NO_VALUE } from 'constants/placeholder' type InfoBoxRowProps = { children?: React.ReactNode title: string - value: React.ReactNode keyNode?: React.ReactNode - valueNode?: React.ReactNode + textValue?: string + textValueIcon?: React.ReactNode + nodeValue?: React.ReactNode spaceBeneath?: boolean compactBox?: boolean color?: BodyProps['color'] @@ -27,8 +28,10 @@ type InfoBoxRowProps = { export const InfoBoxRow: FC = memo( ({ title, - value, keyNode, + textValueIcon, + textValue, + nodeValue, compactBox, disabled, dataTestId, @@ -38,7 +41,6 @@ export const InfoBoxRow: FC = memo( onToggleExpand, children, color, - valueNode, spaceBeneath, boldValue, }) => ( @@ -53,16 +55,20 @@ export const InfoBoxRow: FC = memo( {title}: {keyNode} {expandable ? expanded ? : : null} - - {disabled ? NO_VALUE : value} - {valueNode} - + {nodeValue ? ( + nodeValue + ) : ( + + {disabled ? NO_VALUE : textValue} + {textValueIcon} + + )} )} {spaceBeneath &&
} diff --git a/packages/app/src/components/Input/NumericInput.test.tsx b/packages/app/src/components/Input/__tests__/NumericInput.test.tsx similarity index 59% rename from packages/app/src/components/Input/NumericInput.test.tsx rename to packages/app/src/components/Input/__tests__/NumericInput.test.tsx index 477e8e6e75..7008143a5e 100644 --- a/packages/app/src/components/Input/NumericInput.test.tsx +++ b/packages/app/src/components/Input/__tests__/NumericInput.test.tsx @@ -1,9 +1,9 @@ -import { render } from '@testing-library/react' -import userEvent from '@testing-library/user-event' +import { fireEvent, render } from '@testing-library/react' +import { ThemeProvider } from 'styled-components' -import ContextProvider from '../../../testing/unit/mocks/MockProviders' +import { themes } from 'styles/theme' -import NumericInput from './NumericInput' +import NumericInput from '../NumericInput' const wait = (ms: number) => { return new Promise((resolve) => setTimeout(resolve, ms)) @@ -14,31 +14,31 @@ describe('NumericInput', () => { const onChangeMock = jest.fn() const result = render( - + - + ) await wait(1000) const input = result.getByPlaceholderText('MyNumericInput') expect(input).toBeInTheDocument() - expect(input).toHaveValue(null) - userEvent.type(input, '1') + expect(input).toHaveValue('') + fireEvent.change(input, { target: { value: '1' } }) expect(onChangeMock).toBeCalledWith(expect.any(Object), '1') }) test('ignores non number', async () => { const onChangeMock = jest.fn() const result = render( - + - + ) await wait(1000) const input = result.getByPlaceholderText('MyNumericInput') expect(input).toBeInTheDocument() - expect(input).toHaveValue(null) - userEvent.type(input, 'abc') - expect(onChangeMock).not.toBeCalled() + expect(input).toHaveValue('') + fireEvent.change(input, { target: { value: 'abc' } }) + expect(onChangeMock).toBeCalledWith(expect.any(Object), '') }) }) diff --git a/packages/app/src/components/TVChart/DataFeed.ts b/packages/app/src/components/TVChart/DataFeed.ts index 72c33a0d64..5c6c1217f8 100644 --- a/packages/app/src/components/TVChart/DataFeed.ts +++ b/packages/app/src/components/TVChart/DataFeed.ts @@ -12,7 +12,7 @@ import { } from 'charting_library/charting_library' import { requestCandlesticks } from 'queries/rates/useCandlesticksQuery' -import { sdk } from 'state/config' +import sdk from 'state/sdk' import { ChartBar } from './types' import { resolutionToSeconds } from './utils' diff --git a/packages/app/src/components/TVChart/TVChart.tsx b/packages/app/src/components/TVChart/TVChart.tsx index dfdc5d6d94..0cebc6bdec 100644 --- a/packages/app/src/components/TVChart/TVChart.tsx +++ b/packages/app/src/components/TVChart/TVChart.tsx @@ -15,9 +15,9 @@ import { ThemeContext } from 'styled-components' import Connector from 'containers/Connector' import { chain } from 'containers/Connector/config' import { ChartBody } from 'sections/exchange/TradeCard/Charts/common/styles' -import { sdk } from 'state/config' import { useAppSelector } from 'state/hooks' import { selectCurrentTheme } from 'state/preferences/selectors' +import sdk from 'state/sdk' import darkTheme from 'styles/theme/colors/dark' import { DEFAULT_RESOLUTION } from './constants' diff --git a/packages/app/src/components/Text/Body.tsx b/packages/app/src/components/Text/Body.tsx index 70d68aaf83..fd04b8733a 100644 --- a/packages/app/src/components/Text/Body.tsx +++ b/packages/app/src/components/Text/Body.tsx @@ -5,6 +5,7 @@ export type BodyProps = React.HTMLAttributes & { size?: 'xsmall' | 'small' | 'medium' | 'large' weight?: 'regular' | 'bold' | 'black' color?: 'primary' | 'secondary' | 'tertiary' | 'positive' | 'negative' | 'preview' + type?: 'p' | 'span' className?: string fontSize?: number mono?: boolean @@ -18,23 +19,36 @@ const Body: React.FC = memo( size = 'medium', weight = 'regular', color = 'primary', + type = 'p', fontSize, mono, capitalized, inline, ...props - }) => ( - - ) + }) => + type === 'p' ? ( + + ) : ( + + ) ) const sizeMap = { xsmall: 10, small: 12, medium: 13, large: 15 } as const @@ -43,7 +57,7 @@ const getFontFamily = (weight: NonNullable, mono?: boolean) return mono ? (weight !== 'regular' ? 'monoBold' : 'mono') : weight } -const StyledBody = styled.p<{ +type StyledBodyProps = { $size: NonNullable $weight: NonNullable $color: NonNullable @@ -51,7 +65,9 @@ const StyledBody = styled.p<{ $mono?: boolean $capitalized?: boolean $inline?: boolean -}>` +} + +const BODY_STYLE = css` line-height: 1.2; margin: 0; @@ -70,4 +86,12 @@ const StyledBody = styled.p<{ `} ` +const StyledBody = styled.p` + ${BODY_STYLE} +` + +const StyledBodySpan = styled.span` + ${BODY_STYLE} +` + export default Body diff --git a/packages/app/src/components/Text/NumericValue.tsx b/packages/app/src/components/Text/NumericValue.tsx index a08663ebff..f43999d50d 100644 --- a/packages/app/src/components/Text/NumericValue.tsx +++ b/packages/app/src/components/Text/NumericValue.tsx @@ -15,7 +15,7 @@ type NumericValueProps = BodyProps & { } const NumericValue: FC = memo( - ({ value, preview, colored, options, suffix, color, ...props }) => { + ({ value, preview, colored, options, suffix, color, type = 'p', ...props }) => { const numberColor = useMemo(() => { if (color) { return color @@ -33,7 +33,7 @@ const NumericValue: FC = memo( }, [color, preview, colored, value]) return ( - + {props.children ?? formatNumber(value, options)} {suffix} diff --git a/packages/app/src/containers/Connector/Connector.tsx b/packages/app/src/containers/Connector/Connector.tsx index 76fd9ff33d..b521a8742d 100644 --- a/packages/app/src/containers/Connector/Connector.tsx +++ b/packages/app/src/containers/Connector/Connector.tsx @@ -4,8 +4,8 @@ import { createContainer } from 'unstated-next' import { useAccount, useNetwork, useSigner, useProvider } from 'wagmi' import { SUPPORTED_NETWORKS } from 'constants/network' -import { sdk } from 'state/config' import { useAppDispatch } from 'state/hooks' +import sdk from 'state/sdk' import { setSigner } from 'state/wallet/actions' import { setNetwork } from 'state/wallet/reducer' diff --git a/packages/app/src/containers/Connector/config.ts b/packages/app/src/containers/Connector/config.ts index a8aea848fa..59e65ee4dd 100644 --- a/packages/app/src/containers/Connector/config.ts +++ b/packages/app/src/containers/Connector/config.ts @@ -6,7 +6,6 @@ import { ledgerWallet, metaMaskWallet, rainbowWallet, - trustWallet, walletConnectWallet, } from '@rainbow-me/rainbowkit/wallets' import { configureChains, createClient } from 'wagmi' @@ -25,10 +24,11 @@ import { jsonRpcProvider } from 'wagmi/providers/jsonRpc' import { publicProvider } from 'wagmi/providers/public' import BinanceIcon from 'assets/png/rainbowkit/binance.png' -import Frame from 'components/Rainbowkit/Frame' -import Safe from 'components/Rainbowkit/Gnosis' -import Tally from 'components/Rainbowkit/Tally' -import { BLAST_NETWORK_LOOKUP, STALL_TIMEOUT } from 'constants/network' + +import Frame from '../../components/Rainbowkit/Frame' +import Safe from '../../components/Rainbowkit/Gnosis' +import Tally from '../../components/Rainbowkit/Tally' +import { BLAST_NETWORK_LOOKUP, STALL_TIMEOUT } from '../../constants/network' const bscWithIcon: Chain = { ...bsc, @@ -84,7 +84,6 @@ const connectors = connectorsForWallets([ wallets: [ ledgerWallet({ projectId, chains }), braveWallet({ chains, shimDisconnect: true }), - trustWallet({ projectId, chains }), Tally({ chains, shimDisconnect: true }), Frame({ chains, shimDisconnect: true }), injectedWallet({ chains, shimDisconnect: true }), diff --git a/packages/app/src/contexts/RelayerContext.tsx b/packages/app/src/contexts/RelayerContext.tsx index 77fb30bee5..f571b0bc72 100644 --- a/packages/app/src/contexts/RelayerContext.tsx +++ b/packages/app/src/contexts/RelayerContext.tsx @@ -7,7 +7,7 @@ import { NotificationError, } from 'components/TransactionNotification' import { blockExplorer } from 'containers/Connector/Connector' -import { sdk } from 'state/config' +import sdk from 'state/sdk' export const monitorTransaction = ({ txHash, @@ -27,12 +27,12 @@ export const monitorTransaction = ({ } const emitter = sdk.transactions.hash(txHash) emitter.on('txSent', () => { - toast(NotificationPending, { ...toastProps, toastId: txHash }) + toast(, { ...toastProps, toastId: txHash }) }) emitter.on('txConfirmed', ({ transactionHash }) => { toast.update(transactionHash, { ...toastProps, - render: NotificationSuccess, + render: , autoClose: 10000, }) if (onTxConfirmed != null) { diff --git a/packages/app/src/sections/dashboard/Overview.tsx b/packages/app/src/sections/dashboard/Overview.tsx index 4d8991891f..38a024710a 100644 --- a/packages/app/src/sections/dashboard/Overview.tsx +++ b/packages/app/src/sections/dashboard/Overview.tsx @@ -15,7 +15,6 @@ import * as Text from 'components/Text' import Connector from 'containers/Connector' import { FuturesAccountTypes } from 'queries/futures/types' import { selectBalances } from 'state/balances/selectors' -import { sdk } from 'state/config' import { fetchTokenList } from 'state/exchange/actions' import { setFuturesAccountType } from 'state/futures/reducer' import { @@ -24,6 +23,7 @@ import { selectFuturesType, } from 'state/futures/selectors' import { useAppDispatch, useAppSelector, useFetchAction } from 'state/hooks' +import sdk from 'state/sdk' import { selectSynthsMap } from 'state/wallet/selectors' import logError from 'utils/logError' diff --git a/packages/app/src/sections/exchange/MobileSwap/SwapInfoBox.tsx b/packages/app/src/sections/exchange/MobileSwap/SwapInfoBox.tsx index bfd6df9b29..cc5b628125 100644 --- a/packages/app/src/sections/exchange/MobileSwap/SwapInfoBox.tsx +++ b/packages/app/src/sections/exchange/MobileSwap/SwapInfoBox.tsx @@ -26,7 +26,7 @@ const PriceImpactRow = () => { return ( ) } @@ -38,7 +38,7 @@ const FeeCostRow = () => { return ( ) } @@ -53,8 +53,7 @@ const FeeRow = () => { return ( {formatPercent(baseFeeRate ?? ZERO_WEI)} {exchangeFeeRate != null && baseFeeRate != null ? ( @@ -106,7 +105,7 @@ const GasPriceRow = () => { ? t('common.summary.gas-prices.max-fee') : t('common.summary.gas-prices.gas-price') } - value={gasPriceItem} + textValue={gasPriceItem} /> ) } diff --git a/packages/app/src/sections/futures/ClosePositionModal/ClosePositionModal.tsx b/packages/app/src/sections/futures/ClosePositionModal/ClosePositionModal.tsx index e4c9d8ceaf..06398e7556 100644 --- a/packages/app/src/sections/futures/ClosePositionModal/ClosePositionModal.tsx +++ b/packages/app/src/sections/futures/ClosePositionModal/ClosePositionModal.tsx @@ -192,19 +192,19 @@ export default function ClosePositionModal() { {previewTrade.leverage.toString(2)}x ) } title={t('futures.market.trade.edit-position.leverage-change')} - value={position?.position ? position?.position?.leverage.toString(2) + 'x' : '-'} + textValue={position?.position ? position?.position?.leverage.toString(2) + 'x' : '-'} /> {previewTrade?.size @@ -214,25 +214,25 @@ export default function ClosePositionModal() { ) } title={t('futures.market.trade.edit-position.position-size')} - value={formatNumber(position?.position?.size || 0, { suggestDecimals: true })} + textValue={formatNumber(position?.position?.size || 0, { suggestDecimals: true })} /> {formatDollars(previewTrade?.liqPrice)} ) } title={t('futures.market.trade.edit-position.liquidation')} - value={formatDollars(position?.position?.liquidationPrice || 0)} + textValue={formatDollars(position?.position?.liquidationPrice || 0)} /> {previewTrade?.exceedsPriceProtection && ( diff --git a/packages/app/src/sections/futures/EditPositionModal/EditPositionMarginModal.tsx b/packages/app/src/sections/futures/EditPositionModal/EditPositionMarginModal.tsx index 4b434b88ec..43d5fa2621 100644 --- a/packages/app/src/sections/futures/EditPositionModal/EditPositionMarginModal.tsx +++ b/packages/app/src/sections/futures/EditPositionModal/EditPositionMarginModal.tsx @@ -15,7 +15,6 @@ import PreviewArrow from 'components/PreviewArrow' import SegmentedControl from 'components/SegmentedControl' import Spacer from 'components/Spacer' import { Body } from 'components/Text' -import { previewErrorI18n } from 'queries/futures/constants' import { setShowPositionModal } from 'state/app/reducer' import { selectShowPositionModal, selectTransaction } from 'state/app/selectors' import { @@ -157,19 +156,19 @@ export default function EditPositionMarginModal() { {preview.leverage.toString(2)}x ) } title={t('futures.market.trade.edit-position.leverage-change')} - value={position?.position?.leverage.toString(2) + 'x'} + textValue={position?.position?.leverage.toString(2) + 'x'} /> {position?.remainingMargin @@ -179,10 +178,10 @@ export default function EditPositionMarginModal() { ) } title={t('futures.market.trade.edit-position.margin-change')} - value={formatDollars(position?.remainingMargin || 0)} + textValue={formatDollars(position?.remainingMargin || 0)} /> {preview ? formatDollars(preview.liqPrice) : '-'} @@ -190,7 +189,7 @@ export default function EditPositionMarginModal() { ) } title={t('futures.market.trade.edit-position.liquidation')} - value={formatDollars(position?.position?.liquidationPrice || 0)} + textValue={formatDollars(position?.position?.liquidationPrice || 0)} /> diff --git a/packages/app/src/sections/futures/EditPositionModal/EditPositionSizeModal.tsx b/packages/app/src/sections/futures/EditPositionModal/EditPositionSizeModal.tsx index dfb604ee96..8f63da57ce 100644 --- a/packages/app/src/sections/futures/EditPositionModal/EditPositionSizeModal.tsx +++ b/packages/app/src/sections/futures/EditPositionModal/EditPositionSizeModal.tsx @@ -182,19 +182,19 @@ export default function EditPositionSizeModal() { {resultingLeverage.toString(2)}x ) } title={t('futures.market.trade.edit-position.leverage-change')} - value={position?.position ? position?.position?.leverage.toString(2) + 'x' : '-'} + textValue={position?.position ? position?.position?.leverage.toString(2) + 'x' : '-'} /> {position?.remainingMargin @@ -204,10 +204,10 @@ export default function EditPositionSizeModal() { ) } title={t('futures.market.trade.edit-position.position-size')} - value={formatNumber(position?.position?.size || 0, { suggestDecimals: true })} + textValue={formatNumber(position?.position?.size || 0, { suggestDecimals: true })} /> {preview ? formatDollars(preview.liqPrice, { suggestDecimals: true }) : '-'} @@ -215,18 +215,18 @@ export default function EditPositionSizeModal() { ) } title={t('futures.market.trade.edit-position.liquidation')} - value={formatDollars(position?.position?.liquidationPrice || 0, { + textValue={formatDollars(position?.position?.liquidationPrice || 0, { suggestDecimals: true, })} /> {preview?.exceedsPriceProtection && ( diff --git a/packages/app/src/sections/futures/EditPositionModal/EditStopLossAndTakeProfitModal.tsx b/packages/app/src/sections/futures/EditPositionModal/EditStopLossAndTakeProfitModal.tsx index 37cb860638..4b034e45d3 100644 --- a/packages/app/src/sections/futures/EditPositionModal/EditStopLossAndTakeProfitModal.tsx +++ b/packages/app/src/sections/futures/EditPositionModal/EditStopLossAndTakeProfitModal.tsx @@ -12,6 +12,7 @@ import { InfoBoxRow } from 'components/InfoBox' import { FlexDivRowCentered } from 'components/layout/flex' import SelectorButtons from 'components/SelectorButtons' import Spacer from 'components/Spacer' +import { Body } from 'components/Text' import { NO_VALUE } from 'constants/placeholder' import { setShowPositionModal } from 'state/app/reducer' import { selectAckedOrdersWarning, selectTransaction } from 'state/app/selectors' @@ -213,9 +214,9 @@ export default function EditStopLossAndTakeProfitModal() { - {market?.marketName} + {market?.marketName} {' '} diff --git a/packages/app/src/sections/futures/FeeInfoBox/FeesRow.tsx b/packages/app/src/sections/futures/FeeInfoBox/FeesRow.tsx index a1fa0d238a..34b009f5bd 100644 --- a/packages/app/src/sections/futures/FeeInfoBox/FeesRow.tsx +++ b/packages/app/src/sections/futures/FeeInfoBox/FeesRow.tsx @@ -31,7 +31,7 @@ const ExecutionFeeRow = memo(({ executionFee }: { executionFee: Wei }) => { return ( } isSubItem /> @@ -50,7 +50,7 @@ export const KeeperDepositRow = memo( } isSubItem /> @@ -111,7 +111,7 @@ const FeesRow = memo( return ( { @@ -90,7 +89,7 @@ const LiquidationRow = memo(() => { { return ( { return ( {formatDollars(previewTradeData?.availableMargin)} @@ -43,8 +43,8 @@ const BuyingPowerRow = memo(() => { return ( {formatDollars(previewTradeData?.buyingPower)} @@ -65,8 +65,8 @@ const MarginUsageRow = memo(() => { return ( {formatPercent(previewTradeData?.marginUsage)} diff --git a/packages/app/src/sections/futures/PositionType.tsx b/packages/app/src/sections/futures/PositionType.tsx index bcf6ea81d2..a83e185d3b 100644 --- a/packages/app/src/sections/futures/PositionType.tsx +++ b/packages/app/src/sections/futures/PositionType.tsx @@ -1,7 +1,7 @@ import { PositionSide } from '@kwenta/sdk/types' import styled, { css } from 'styled-components' -import { Body } from 'components/Text' +import Body from 'components/Text/Body' type PositionProps = { side: PositionSide @@ -16,12 +16,13 @@ const PositionType: React.FC = ({ side = PositionSide.LONG, mobil ) } -const StyledText = styled(Body).attrs({ weight: 'bold', capitalized: true })<{ +const StyledText = styled(Body).attrs({ weight: 'bold', capitalized: true, type: 'span' })<{ side: PositionSide }>` padding: 3px 5px; border-radius: 4px; + ${(props) => props.side === PositionSide.LONG ? css` diff --git a/packages/app/src/sections/futures/Trade/ManagePosition.tsx b/packages/app/src/sections/futures/Trade/ManagePosition.tsx index 7d4215a556..594d9286bb 100644 --- a/packages/app/src/sections/futures/Trade/ManagePosition.tsx +++ b/packages/app/src/sections/futures/Trade/ManagePosition.tsx @@ -187,7 +187,7 @@ const ManagePosition: React.FC = () => {
)} - + {formatCurrency( getDisplayAsset(marketAsset) || '', nativeSizeDelta.abs() ?? ZERO_WEI, @@ -54,12 +53,12 @@ export default function TradeConfirmationSummary({ {leverage.toString(2)}X} + textValue={leverage.toString(2) + 'X'} /> {OrderNameByType[orderType]}} + textValue={OrderNameByType[orderType]} /> diff --git a/packages/app/src/sections/futures/TradeCrossMargin/CrossMarginInfoBox.tsx b/packages/app/src/sections/futures/TradeCrossMargin/CrossMarginInfoBox.tsx index 434041fa6e..fe4d3eafb1 100644 --- a/packages/app/src/sections/futures/TradeCrossMargin/CrossMarginInfoBox.tsx +++ b/packages/app/src/sections/futures/TradeCrossMargin/CrossMarginInfoBox.tsx @@ -28,8 +28,8 @@ function MarginInfoBox() { <> {keeperEthBal.gt(0) && ( } /> - - + + {openModal === 'futures_withdraw_keeper_balance' && ( diff --git a/packages/app/src/sections/futures/UserInfo/UserInfo.tsx b/packages/app/src/sections/futures/UserInfo/UserInfo.tsx index 309bead9af..98eb1b9290 100644 --- a/packages/app/src/sections/futures/UserInfo/UserInfo.tsx +++ b/packages/app/src/sections/futures/UserInfo/UserInfo.tsx @@ -232,6 +232,7 @@ const TabButtonsContainer = styled.div` display: grid; grid-gap: 15px; grid-template-columns: repeat(2, 1fr); + height: 40px; button { font-size: 13px; diff --git a/packages/app/src/state/__mocks__/sdk.ts b/packages/app/src/state/__mocks__/sdk.ts new file mode 100644 index 0000000000..c5a0ea1196 --- /dev/null +++ b/packages/app/src/state/__mocks__/sdk.ts @@ -0,0 +1,47 @@ +import { wei } from '@synthetixio/wei' + +import { MOCK_TRADE_PREVIEW, SDK_MARKETS } from '../../../testing/unit/mocks/data/futures' + +export const mockSetProvider = () => Promise.resolve('10') +export const mockSetSigner = () => Promise.resolve() +export const mockSubmitCrossMarginOrder = jest.fn(() => ({ test: 'THE TX' })) + +const mockFuturesService = { + getCrossMarginAccounts: () => ['0x7bCe4eF9d95129011528E502357C7772'], + getPreviousDayPrices: () => [], + getCrossMarginTradePreview: () => { + return { ...MOCK_TRADE_PREVIEW } + }, + getFuturesPositions: () => [], + getTradesForMarkets: () => [], + getAllTrades: () => [], + getConditionalOrders: () => [], + getIsolatedMarginTransfers: () => [], + getDelayedOrders: () => [], + getCrossMarginTransfers: () => [], + getCrossMarginBalanceInfo: () => ({ + freeMargin: wei('1000'), + keeperEthBal: wei('0.1'), + walletEthBal: wei('1'), + allowance: wei('1000'), + }), + getMarkets: () => { + return [...SDK_MARKETS] + }, + submitCrossMarginOrder: mockSubmitCrossMarginOrder, +} + +const mockSdk = { + context: {}, + exchange: {}, + futures: { ...mockFuturesService }, + prices: {}, + synths: {}, + transactions: {}, + kwentaToken: {}, + system: {}, + setProvider: mockSetProvider, + setSigner: mockSetSigner, +} + +export default mockSdk diff --git a/packages/app/src/state/app/hooks.ts b/packages/app/src/state/app/hooks.ts index a60e1867d6..cc7fb8814d 100644 --- a/packages/app/src/state/app/hooks.ts +++ b/packages/app/src/state/app/hooks.ts @@ -1,12 +1,12 @@ import { useEffect } from 'react' import { fetchBalances } from 'state/balances/actions' -import { sdk } from 'state/config' import { fetchEarnTokenPrices } from 'state/earn/actions' import { selectMarkets } from 'state/futures/selectors' import { useAppDispatch, useAppSelector, usePollAction } from 'state/hooks' import { fetchPreviousDayPrices, updatePrices } from 'state/prices/actions' import { setConnectionError } from 'state/prices/reducer' +import sdk from 'state/sdk' import { selectNetwork, selectWallet } from 'state/wallet/selectors' import { serializePrices } from 'utils/futures' diff --git a/packages/app/src/state/exchange/selectors.ts b/packages/app/src/state/exchange/selectors.ts index 245e314564..02030478fa 100644 --- a/packages/app/src/state/exchange/selectors.ts +++ b/packages/app/src/state/exchange/selectors.ts @@ -4,8 +4,8 @@ import { createSelector } from '@reduxjs/toolkit' import { wei } from '@synthetixio/wei' import { selectTotalUSDBalanceWei } from 'state/balances/selectors' -import { sdk } from 'state/config' import { selectPrices } from 'state/prices/selectors' +import sdk from 'state/sdk' import type { RootState } from 'state/store' import { FetchStatus } from 'state/types' import { selectIsWalletConnected } from 'state/wallet/selectors' diff --git a/packages/app/src/state/futures/actions.ts b/packages/app/src/state/futures/actions.ts index 126979ea96..36555bed8b 100644 --- a/packages/app/src/state/futures/actions.ts +++ b/packages/app/src/state/futures/actions.ts @@ -154,6 +154,7 @@ export const fetchMarkets = createAsyncThunk< >('futures/fetchMarkets', async (_, { getState, extra: { sdk } }) => { const supportedNetwork = selectFuturesSupportedNetwork(getState()) const networkId = selectNetwork(getState()) + if (!supportedNetwork) return try { const markets = await sdk.futures.getMarkets() diff --git a/packages/app/src/state/futures/selectors.ts b/packages/app/src/state/futures/selectors.ts index 589fe9aa63..e353ed2f6f 100644 --- a/packages/app/src/state/futures/selectors.ts +++ b/packages/app/src/state/futures/selectors.ts @@ -79,8 +79,10 @@ export const selectLeverageInput = createSelector( (futures, type) => futures[accountType(type)].leverageInput ) -export const selectCrossMarginMarginDelta = (state: RootState) => - wei(state.futures.crossMargin.marginDelta || 0) +export const selectCrossMarginMarginDelta = createSelector( + (state: RootState) => state.futures, + (futures) => wei(futures.crossMargin.marginDelta || 0) +) export const selectMarginDeltaInputValue = (state: RootState) => state.futures.crossMargin.marginDelta diff --git a/packages/app/src/state/config.ts b/packages/app/src/state/sdk.ts similarity index 55% rename from packages/app/src/state/config.ts rename to packages/app/src/state/sdk.ts index 3691b25cf8..e2cbe9f93c 100644 --- a/packages/app/src/state/config.ts +++ b/packages/app/src/state/sdk.ts @@ -3,4 +3,6 @@ import KwentaSDK from '@kwenta/sdk' import { wagmiClient } from 'containers/Connector/config' import logError from 'utils/logError' -export const sdk = new KwentaSDK({ networkId: 10, provider: wagmiClient.provider, logError }) +const sdk = new KwentaSDK({ networkId: 10, provider: wagmiClient.provider, logError }) + +export default sdk diff --git a/packages/app/src/state/store.ts b/packages/app/src/state/store.ts index fb4148ecdc..436e181372 100644 --- a/packages/app/src/state/store.ts +++ b/packages/app/src/state/store.ts @@ -1,5 +1,5 @@ import KwentaSDK from '@kwenta/sdk' -import { combineReducers, configureStore } from '@reduxjs/toolkit' +import { combineReducers, configureStore, PreloadedState } from '@reduxjs/toolkit' import type { AnyAction, ThunkAction } from '@reduxjs/toolkit' import logger from 'redux-logger' import { @@ -17,7 +17,6 @@ import storage from 'redux-persist/lib/storage' import appReducer from './app/reducer' import balancesReducer from './balances/reducer' -import { sdk } from './config' import earnReducer from './earn/reducer' import exchangeReducer from './exchange/reducer' import futuresReducer from './futures/reducer' @@ -25,6 +24,7 @@ import homeReducer from './home/reducer' import migrations from './migrations' import preferencesReducer from './preferences/reducer' import pricesReducer from './prices/reducer' +import sdk from './sdk' import stakingReducer from './staking/reducer' import statsReducer from './stats/reducer' import walletReducer from './wallet/reducer' @@ -55,21 +55,26 @@ const combinedReducers = combineReducers({ const persistedReducer = persistReducer(persistConfig, combinedReducers) -const store = configureStore({ - reducer: persistedReducer, - middleware: (getDefaultMiddleware) => { - const baseMiddleware = getDefaultMiddleware({ - serializableCheck: { - ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER], - }, - thunk: { extraArgument: { sdk } }, - }) - return LOG_REDUX ? baseMiddleware.concat(logger) : baseMiddleware - }, -}) +export const setupStore = (preloadedState?: PreloadedState) => + configureStore({ + reducer: persistedReducer, + middleware: (getDefaultMiddleware) => { + const baseMiddleware = getDefaultMiddleware({ + serializableCheck: { + ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER], + }, + thunk: { extraArgument: { sdk } }, + }) + return LOG_REDUX ? baseMiddleware.concat(logger) : baseMiddleware + }, + preloadedState, + }) + +const store = setupStore() export type RootState = ReturnType export type AppDispatch = typeof store.dispatch +export type AppStore = typeof store export type ThunkConfig = { dispatch: AppDispatch state: RootState diff --git a/packages/app/stories/AccountStats.stories.tsx b/packages/app/stories/AccountStats.stories.tsx index 1d092e4151..6321c3b110 100644 --- a/packages/app/stories/AccountStats.stories.tsx +++ b/packages/app/stories/AccountStats.stories.tsx @@ -9,9 +9,9 @@ export const Default = () => { return (
- - - + + +
) diff --git a/packages/app/stories/FeeInfoBox.stories.tsx b/packages/app/stories/FeeInfoBox.stories.tsx index 91d498f055..dbd14335ec 100644 --- a/packages/app/stories/FeeInfoBox.stories.tsx +++ b/packages/app/stories/FeeInfoBox.stories.tsx @@ -17,11 +17,11 @@ export default { export const Default = () => { return ( - - - - - + + + + + ) } @@ -33,17 +33,17 @@ export const ExpandedRow = () => { - - - - + + + + - + ) } diff --git a/packages/app/stories/InfoBox.stories.tsx b/packages/app/stories/InfoBox.stories.tsx index e6ffa85097..eb2ae012d5 100644 --- a/packages/app/stories/InfoBox.stories.tsx +++ b/packages/app/stories/InfoBox.stories.tsx @@ -16,8 +16,8 @@ export default { export const Default = () => { return ( - - + + ) } @@ -25,9 +25,9 @@ export const Default = () => { export const Spaced = () => { return ( - - - + + + ) } diff --git a/packages/app/testing/lint.js b/packages/app/testing/lint.js deleted file mode 100644 index 5b5ecf96c9..0000000000 --- a/packages/app/testing/lint.js +++ /dev/null @@ -1,40 +0,0 @@ -/* eslint-disable */ -const fs = require('fs') - -const CLIEngine = require('eslint').CLIEngine - -const argv = process.argv.slice(2) -const cli = new CLIEngine({ - fix: false, - extensions: argv[2].split(','), - useEslintrc: true, -}) - -console.log('Starting to lint..') - -// Lint all files -const report = cli.executeOnFiles(argv[0]) - -// get the default formatter -const consoleFormatter = cli.getFormatter() - -console.log('Lint finished') - -// output to console -console.log(consoleFormatter(report.results)) - -// Output to sarif format -const otherFormatter = cli.getFormatter('@microsoft/eslint-formatter-sarif/sarif.js') - -console.log('Saving sarif report..') - -fs.writeFile('lint-results.sarif', otherFormatter(report.results), 'utf8', () => { - console.log('Sarif report saved') - if (report.errorCount > 0) { - console.log('Errors found, exiting..') - process.exit(1) - } else { - console.log('No errors found') - process.exit(0) - } -}) diff --git a/packages/app/testing/unit/mocks/MockProviders.tsx b/packages/app/testing/unit/mocks/MockProviders.tsx index af21914e80..7a0a3ecdce 100644 --- a/packages/app/testing/unit/mocks/MockProviders.tsx +++ b/packages/app/testing/unit/mocks/MockProviders.tsx @@ -1,29 +1,17 @@ +import type { PreloadedState } from '@reduxjs/toolkit' +import i18n from 'i18n' import mockRouter from 'next-router-mock' import { ReactNode } from 'react' +import { I18nextProvider } from 'react-i18next' import { QueryClient, QueryClientProvider } from 'react-query' +import { Provider as ReduxProvider } from 'react-redux' import { ThemeProvider } from 'styled-components' import { WagmiConfig } from 'wagmi' -import Connector from 'containers/Connector' import { wagmiClient } from 'containers/Connector/config' +import { AppStore, RootState, setupStore } from 'state/store' import { themes } from 'styles/theme' -jest.mock('@rainbow-me/rainbowkit', () => ({ - wallet: { - metaMask: () => {}, - rainbow: () => {}, - coinbase: () => {}, - walletConnect: () => {}, - ledger: () => {}, - brave: () => {}, - trust: () => {}, - }, - connectorsForWallets: () => {}, - useConnectModal: () => ({ - openConnectModal: () => {}, - }), -})) - jest.mock('next/router', () => require('next-router-mock')) // This is needed for mocking 'next/link': jest.mock('next/dist/client/router', () => require('next-router-mock')) @@ -33,13 +21,7 @@ jest.mock('next/dist/client/router', () => require('next-router-mock')) jest.mock('axios', () => ({ get: Promise.resolve(), post: Promise.resolve(), -})) - -jest.mock('queries/futures/subgraph', () => ({ - __esModule: true, - getFuturesTrades: () => Promise.resolve([]), - getFuturesAggregateStats: () => Promise.resolve([]), - getFuturesPositions: () => Promise.resolve([]), + create: jest.fn(), })) const queryClient = new QueryClient({ @@ -53,20 +35,29 @@ const queryClient = new QueryClient({ type Props = { children: ReactNode route?: string + store?: AppStore + preloadedState?: Partial> } process.env.GIT_HASH_ID = '12345' -const MockProviders = ({ children, route }: Props) => { +const MockProviders = ({ + children, + route, + preloadedState, + store = setupStore(preloadedState), +}: Props) => { mockRouter.setCurrentUrl(route || '/') return ( - - - {children} - - + + + + {children} + + + ) } diff --git a/packages/app/testing/unit/mocks/app.ts b/packages/app/testing/unit/mocks/app.ts new file mode 100644 index 0000000000..e4767b8902 --- /dev/null +++ b/packages/app/testing/unit/mocks/app.ts @@ -0,0 +1,9 @@ +export const mockResizeObserver = () => { + // @ts-ignore + delete window.ResizeObserver + window.ResizeObserver = jest.fn().mockImplementation(() => ({ + observe: jest.fn(), + unobserve: jest.fn(), + disconnect: jest.fn(), + })) +} diff --git a/packages/app/testing/unit/constants.ts b/packages/app/testing/unit/mocks/data/app.ts similarity index 86% rename from packages/app/testing/unit/constants.ts rename to packages/app/testing/unit/mocks/data/app.ts index 90f74476b6..8cc9163dd3 100644 --- a/packages/app/testing/unit/constants.ts +++ b/packages/app/testing/unit/mocks/data/app.ts @@ -1,5 +1,9 @@ +import { NetworkId } from '@kwenta/sdk/dist/types' import { Wallet } from 'ethers' +import { PRICES_INITIAL_STATE } from 'state/prices/reducer' +import { PricesInfoMap } from 'state/prices/types' + export const TEST_ADDR = '0x1c099210997E5C5689189A256C6145ca743B2610' export const TEST_PK = 'b826c22c04853f6ba05575275494a3a5c9eff298c36cb58d11370f83c87574e4' @@ -136,3 +140,12 @@ export const CHAINS = [ testnet: true, }, ] + +export const PRELOADED_STATE = { + wallet: { networkId: 10 as NetworkId, walletAddress: TEST_ADDR }, + prices: { + ...PRICES_INITIAL_STATE, + onChainPrices: { sETH: { price: '1810.50', change: 'up' } } as PricesInfoMap, + offChainPrices: { sETH: { price: '1810.50', change: 'up' } } as PricesInfoMap, + }, +} diff --git a/packages/app/testing/unit/mocks/data/futures.ts b/packages/app/testing/unit/mocks/data/futures.ts new file mode 100644 index 0000000000..e8d66bfc8b --- /dev/null +++ b/packages/app/testing/unit/mocks/data/futures.ts @@ -0,0 +1,200 @@ +import { + FuturesMarketAsset, + FuturesMarketKey, + NetworkId, + SynthSuspensionReason, +} from '@kwenta/sdk/dist/types' +import { wei } from '@synthetixio/wei' + +import { FUTURES_INITIAL_STATE } from 'state/futures/reducer' + +import { PRELOADED_STATE, TEST_ADDR } from './app' + +export const mockSmartMarginAccount = (freeMargin: string = '1000') => ({ + account: '0xe1ba3B0A962FbC525a9f9503AEE3310940Bb2a6F', + positionHistory: [], + trades: [], + marginTransfers: [], + idleTransfers: [], + balanceInfo: { + freeMargin: freeMargin, + keeperEthBal: '0.05', + allowance: freeMargin, + walletEthBal: '1', + }, + delayedOrders: [], + conditionalOrders: [], +}) + +export const SDK_MARKETS = [ + { + market: '0x0940B0A96C5e1ba33AEE331a9f950Bb2a6F2Fb25', + marketKey: 'sBNBPERP' as FuturesMarketKey, + marketName: 'BNB/sUSD', + asset: 'BNB' as FuturesMarketAsset, + assetHex: '0x424e420000000000000000000000000000000000000000000000000000000000', + currentFundingRate: wei('0.000006647524972557'), + currentFundingVelocity: wei('0.000007031227025059'), + feeRates: { + makerFee: wei('0.300000000000000000'), + takerFee: wei('0.300000000000000000'), + makerFeeDelayedOrder: wei('0.300000000000000000'), + takerFeeDelayedOrder: wei('0.300000000000000000'), + makerFeeOffchainDelayedOrder: wei('0.000200000000000000'), + takerFeeOffchainDelayedOrder: wei('0.000800000000000000'), + }, + openInterest: { + shortPct: 0.4783525165655898, + longPct: 0.5216474834344103, + shortUSD: wei('925695.596442819678463907'), + longUSD: wei('1009478.912701613579629876'), + long: wei('4066.418411201914495882'), + short: wei('3728.919513999078804517'), + }, + marketDebt: wei('861660.108202170990537641'), + marketSkew: wei('337.498897202835691365'), + contractMaxLeverage: wei('27.500000000000000000'), + appMaxLeverage: wei('25.000000000000000000'), + marketSize: wei('7795.337925200993300399'), + marketLimitUsd: wei('4964953.483000000000000000'), + marketLimitNative: wei('20000.000000000000000000'), + minInitialMargin: wei('40.000000000000000000'), + keeperDeposit: wei('1.490641175532237679'), + isSuspended: false, + marketClosureReason: 'market-closure' as SynthSuspensionReason, + settings: { + maxMarketValue: wei('20000.000000000000000000'), + skewScale: wei('750000.000000000000000000'), + delayedOrderConfirmWindow: 120, + offchainDelayedOrderMinAge: 4, + offchainDelayedOrderMaxAge: 60, + minDelayTimeDelta: 60, + maxDelayTimeDelta: 6000, + }, + }, + + { + market: '0x2B3bb4c683BFc5239B029131EEf3B1d214478d93', + marketKey: 'sETHPERP', + marketName: 'ETH/sUSD' as FuturesMarketKey, + asset: 'sETH' as FuturesMarketAsset, + assetHex: '0x7345544800000000000000000000000000000000000000000000000000000000', + currentFundingRate: wei('-0.000025743917111574'), + currentFundingVelocity: wei('-0.000000709004693224'), + feeRates: { + makerFee: wei('0.300000000000000000'), + takerFee: wei('0.300000000000000000'), + makerFeeDelayedOrder: wei('0.300000000000000000'), + takerFeeDelayedOrder: wei('0.300000000000000000'), + makerFeeOffchainDelayedOrder: wei('0.000200000000000000'), + takerFeeOffchainDelayedOrder: wei('0.000600000000000000'), + }, + openInterest: { + shortPct: 0.5015705899969076, + longPct: 0.4984294100030924, + shortUSD: wei('13142288.928936562683740571'), + longUSD: wei('13059982.876947410778757960'), + long: wei('7200.123095223081871052'), + short: wei('7245.499395589429634136'), + }, + marketDebt: wei('9564940.585953458555968058'), + marketSkew: wei('-45.376300366347763084'), + contractMaxLeverage: wei('55.000000000000000000'), + appMaxLeverage: wei('50.000000000000000000'), + marketSize: wei('14445.622490812511505188'), + marketLimitUsd: wei('36277110.000000000000000000'), + marketLimitNative: wei('20000.000000000000000000'), + minInitialMargin: wei('40.000000000000000000'), + keeperDeposit: wei('1.490641175532237679'), + isSuspended: false, + marketClosureReason: 'market-closure' as SynthSuspensionReason, + settings: { + maxMarketValue: wei('20000.000000000000000000'), + skewScale: wei('1000000.000000000000000000'), + delayedOrderConfirmWindow: 120, + offchainDelayedOrderMinAge: 4, + offchainDelayedOrderMaxAge: 60, + minDelayTimeDelta: 60, + maxDelayTimeDelta: 6000, + }, + }, + { + market: '0x59b007E9ea8F89b069c43F8f45834d30853e3699', + marketKey: 'sBTCPERP' as FuturesMarketKey, + marketName: 'BTC/sUSD', + asset: 'sBTC' as FuturesMarketAsset, + assetHex: '0x7342544300000000000000000000000000000000000000000000000000000000', + currentFundingRate: wei('0.000048566384344668'), + currentFundingVelocity: wei('-0.000000151964222070'), + feeRates: { + makerFee: wei('0.300000000000000000'), + takerFee: wei('0.300000000000000000'), + makerFeeDelayedOrder: wei('0.300000000000000000'), + takerFeeDelayedOrder: wei('0.300000000000000000'), + makerFeeOffchainDelayedOrder: wei('0.000200000000000000'), + takerFeeOffchainDelayedOrder: wei('0.000600000000000000'), + }, + openInterest: { + shortPct: 0.5002984445053714, + longPct: 0.4997015554946286, + shortUSD: wei('23569324.160750116734578584'), + longUSD: wei('23541204.403959554931944732'), + long: wei('814.213770734233251071'), + short: wei('815.186341755481507078'), + }, + marketDebt: wei('8746498.919374243549025556'), + marketSkew: wei('-0.972571021248256007'), + contractMaxLeverage: wei('55.000000000000000000'), + appMaxLeverage: wei('50.000000000000000000'), + marketSize: wei('1629.400112489714758149'), + marketLimitUsd: wei('57825611.037580000000000000'), + marketLimitNative: wei('2000.000000000000000000'), + minInitialMargin: wei('40.000000000000000000'), + keeperDeposit: wei('1.490641175532237679'), + isSuspended: false, + marketClosureReason: 'market-closure' as SynthSuspensionReason, + settings: { + maxMarketValue: wei('2000.000000000000000000'), + skewScale: wei('100000.000000000000000000'), + delayedOrderConfirmWindow: 120, + offchainDelayedOrderMinAge: 4, + offchainDelayedOrderMaxAge: 60, + minDelayTimeDelta: 60, + maxDelayTimeDelta: 6000, + }, + }, +] + +export const MOCK_TRADE_PREVIEW = { + fee: wei('0.199964245556097993'), + liqPrice: wei('1684.972418555525651097'), + margin: wei('99.800035754443902007'), + price: wei('1847.756843061337953400'), + size: '0.541100000000000000', + sizeDelta: '0.541100000000000000', + side: 'long', + leverage: '10.018245186209463524', + notionalValue: '999.821227780489966584', + status: 0, + showStatus: false, + statusMessage: 'Success', + priceImpact: '0.000000270556392273', + exceedsPriceProtection: false, +} + +export const preloadedStateWithSmartMarginAccount = (mockAccount = mockSmartMarginAccount()) => { + return { + ...PRELOADED_STATE, + futures: { + ...FUTURES_INITIAL_STATE, + crossMargin: { + ...FUTURES_INITIAL_STATE.crossMargin, + accounts: { + [10 as NetworkId]: { + [TEST_ADDR]: mockAccount, + }, + }, + }, + }, + } +} diff --git a/packages/app/testing/unit/mocks/hooks.ts b/packages/app/testing/unit/mocks/hooks.ts new file mode 100644 index 0000000000..8fea6bc2ba --- /dev/null +++ b/packages/app/testing/unit/mocks/hooks.ts @@ -0,0 +1,24 @@ +import { Breakpoint, BREAKPOINTS } from '../../../src/styles/media' + +export const mockUseWindowSize = ( + mockedWidth: number = 1000, + deviceType: 'mobile' | 'tablet' | 'desktop' = 'desktop' +) => { + const lessThanWidth = (breakpoint: Breakpoint) => { + const bpSize = BREAKPOINTS[breakpoint] + return mockedWidth < bpSize + } + + const greaterThanWidth = (breakpoint: Breakpoint) => { + const bpSize = BREAKPOINTS[breakpoint] + return mockedWidth > bpSize + } + + jest.mock('hooks/useWindowSize', () => { + return { + lessThanWidth: jest.fn(() => greaterThanWidth), + greaterThanWidth: jest.fn(() => lessThanWidth), + deviceType: deviceType, + } + }) +} diff --git a/packages/app/testing/unit/mocks/mockConnector.ts b/packages/app/testing/unit/mocks/mockConnector.ts index 8b25fcfaf0..43e9ac9fb6 100644 --- a/packages/app/testing/unit/mocks/mockConnector.ts +++ b/packages/app/testing/unit/mocks/mockConnector.ts @@ -1,10 +1,37 @@ +import { BigNumber } from '@ethersproject/bignumber' +import { weiFromEth } from '@kwenta/sdk/utils' + import Connector from 'containers/Connector/Connector' -import { DEFAULT_NETWORK, MOCK_SIGNER, TEST_ADDR } from '../constants' +import { DEFAULT_NETWORK, MOCK_SIGNER, TEST_ADDR } from './data/app' + +export type MockEthProvider = Record + +const DEFAULT_PROVIDER = { + network: DEFAULT_NETWORK, + blockNumber: 5000, + getNetwork: () => DEFAULT_NETWORK, + waitForTransaction: () => {}, + getBlockNumber: () => 5000, + getGasPrice: () => BigNumber.from('2000000000'), + getBalance: () => BigNumber.from(weiFromEth('10')), + estimateGas: () => BigNumber.from('100000'), + sendTransaction: () => {}, + getLogs: () => [], + getEtherPrice: () => 1000, + getTransactionCount: () => 1, + getAvatar: () => '', + lookupAddress: () => 'name', +} -import { mockProvider } from './mockEthersProvider' +export const mockProvider = (overrides: MockEthProvider = {}) => { + return { + ...DEFAULT_PROVIDER, + ...overrides, + } +} -const DEFAULT_CONNECTOR = { +export const DEFAULT_CONNECTOR = { activeChain: { id: DEFAULT_NETWORK.id, name: DEFAULT_NETWORK.name, @@ -24,9 +51,8 @@ const DEFAULT_CONNECTOR = { synthsMap: {}, tokensMap: {}, staticMainnetProvider: null, - defaultSynthetixjs: null, - l2Synthetixjs: null, l2SynthsMap: {}, + providerReady: true, } const mockConnector = (overrides?: Record) => { diff --git a/packages/app/testing/unit/mocks/mockEthersProvider.ts b/packages/app/testing/unit/mocks/mockEthersProvider.ts deleted file mode 100644 index 4dde3e264f..0000000000 --- a/packages/app/testing/unit/mocks/mockEthersProvider.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { BigNumber } from '@ethersproject/bignumber' -import { weiFromEth } from '@kwenta/sdk/utils' - -import { DEFAULT_NETWORK } from '../constants' - -export type MockEthProvider = Record - -const DEFAULT_PROVIDER = { - network: DEFAULT_NETWORK, - blockNumber: 5000, - getNetwork: () => DEFAULT_NETWORK, - waitForTransaction: () => {}, - getBlockNumber: () => 5000, - getGasPrice: () => BigNumber.from('2000000000'), - getBalance: () => BigNumber.from(weiFromEth('10')), - estimateGas: () => BigNumber.from('100000'), - sendTransaction: () => {}, - getLogs: () => [], - getEtherPrice: () => 1000, - getTransactionCount: () => 1, - getAvatar: () => '', - lookupAddress: () => 'name', -} - -export const mockProvider = (overrides: MockEthProvider = {}) => { - return { - ...DEFAULT_PROVIDER, - ...overrides, - } -} diff --git a/packages/app/testing/unit/mocks/mockQueries.ts b/packages/app/testing/unit/mocks/queries.ts similarity index 100% rename from packages/app/testing/unit/mocks/mockQueries.ts rename to packages/app/testing/unit/mocks/queries.ts diff --git a/packages/app/testing/unit/setup/global.js b/packages/app/testing/unit/setup/global.js index 10af2f936d..cadfa9903e 100644 --- a/packages/app/testing/unit/setup/global.js +++ b/packages/app/testing/unit/setup/global.js @@ -1,3 +1,3 @@ module.exports = async () => { - process.env.TZ = 'UTC'; -}; + process.env.TZ = 'UTC' +} diff --git a/packages/app/testing/unit/setup/setup.js b/packages/app/testing/unit/setup/setup.js index a1b1ef96b1..4193784ce0 100644 --- a/packages/app/testing/unit/setup/setup.js +++ b/packages/app/testing/unit/setup/setup.js @@ -2,5 +2,20 @@ import '@testing-library/jest-dom' import { TextEncoder, TextDecoder } from 'util' global.TextEncoder = TextEncoder global.TextDecoder = TextDecoder -jest.mock('src/components/Slider/ValueLabel') jest.setTimeout(30000) + +jest.mock('@rainbow-me/rainbowkit', () => ({ + wallet: { + metaMask: () => {}, + rainbow: () => {}, + coinbase: () => {}, + walletConnect: () => {}, + ledger: () => {}, + brave: () => {}, + trust: () => {}, + }, + connectorsForWallets: () => {}, + useConnectModal: () => ({ + openConnectModal: () => {}, + }), +})) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 08cc926b47..ab1ccdd83a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,47 +9,47 @@ importers: .: devDependencies: '@typescript-eslint/eslint-plugin': - specifier: 5.60.1 - version: 5.60.1(@typescript-eslint/parser@5.60.1)(eslint@8.43.0)(typescript@5.1.6) + specifier: 5.61.0 + version: 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.44.0)(typescript@5.1.6) '@typescript-eslint/parser': - specifier: 5.60.1 - version: 5.60.1(eslint@8.43.0)(typescript@5.1.6) + specifier: 5.61.0 + version: 5.61.0(eslint@8.44.0)(typescript@5.1.6) eslint: - specifier: 8.43.0 - version: 8.43.0 + specifier: 8.44.0 + version: 8.44.0 eslint-config-prettier: specifier: 8.8.0 - version: 8.8.0(eslint@8.43.0) + version: 8.8.0(eslint@8.44.0) eslint-config-react-app: specifier: 7.0.1 - version: 7.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(eslint@8.43.0)(typescript@5.1.6) + version: 7.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(eslint@8.44.0)(typescript@5.1.6) eslint-plugin-cypress: specifier: 2.13.3 - version: 2.13.3(eslint@8.43.0) + version: 2.13.3(eslint@8.44.0) eslint-plugin-flowtype: specifier: 8.0.3 - version: 8.0.3(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(eslint@8.43.0) + version: 8.0.3(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(eslint@8.44.0) eslint-plugin-import: specifier: 2.27.5 - version: 2.27.5(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) + version: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0) eslint-plugin-jsx-a11y: specifier: 6.7.1 - version: 6.7.1(eslint@8.43.0) + version: 6.7.1(eslint@8.44.0) eslint-plugin-prettier: specifier: 4.2.1 - version: 4.2.1(eslint-config-prettier@8.8.0)(eslint@8.43.0)(prettier@2.8.8) + version: 4.2.1(eslint-config-prettier@8.8.0)(eslint@8.44.0)(prettier@2.8.8) eslint-plugin-react: specifier: 7.32.2 - version: 7.32.2(eslint@8.43.0) + version: 7.32.2(eslint@8.44.0) eslint-plugin-react-hooks: specifier: 4.6.0 - version: 4.6.0(eslint@8.43.0) + version: 4.6.0(eslint@8.44.0) eslint-plugin-testing-library: specifier: 5.11.0 - version: 5.11.0(eslint@8.43.0)(typescript@5.1.6) + version: 5.11.0(eslint@8.44.0)(typescript@5.1.6) eslint-plugin-ui-testing: specifier: 2.0.1 - version: 2.0.1(eslint@8.43.0)(typescript@5.1.6) + version: 2.0.1(eslint@8.44.0)(typescript@5.1.6) husky: specifier: 8.0.3 version: 8.0.3 @@ -135,14 +135,14 @@ importers: specifier: 2.21.3 version: 2.21.3 date-fns-tz: - specifier: 1.3.7 - version: 1.3.7(date-fns@2.21.3) + specifier: 2.0.0 + version: 2.0.0(date-fns@2.21.3) echarts: specifier: 5.4.2 version: 5.4.2 eslint-config-next: specifier: ^13.4.6 - version: 13.4.7(eslint@8.43.0)(typescript@5.1.6) + version: 13.4.7(eslint@8.44.0)(typescript@5.1.6) ethcall: specifier: 4.7.2 version: 4.7.2 @@ -246,9 +246,6 @@ importers: specifier: ^5.4.3 version: 5.4.3 devDependencies: - '@microsoft/eslint-formatter-sarif': - specifier: 2.1.7 - version: 2.1.7 '@next/eslint-plugin-next': specifier: 13.4.7 version: 13.4.7 @@ -256,8 +253,8 @@ importers: specifier: 7.0.24 version: 7.0.24(react-dom@18.2.0)(react@18.2.0) '@storybook/addon-essentials': - specifier: 7.0.24 - version: 7.0.24(react-dom@18.2.0)(react@18.2.0) + specifier: 7.0.25 + version: 7.0.25(react-dom@18.2.0)(react@18.2.0) '@storybook/addon-links': specifier: 7.0.24 version: 7.0.24(react-dom@18.2.0)(react@18.2.0) @@ -347,7 +344,7 @@ importers: version: 6.8.1(webpack@5.88.0) eslint-config-turbo: specifier: 1.10.6 - version: 1.10.6(eslint@8.43.0) + version: 1.10.6(eslint@8.44.0) html-to-image: specifier: 1.11.11 version: 1.11.11 @@ -463,6 +460,10 @@ importers: packages: + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + /@adobe/css-tools@4.2.0: resolution: {integrity: sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==} dev: true @@ -544,7 +545,7 @@ packages: transitivePeerDependencies: - supports-color - /@babel/eslint-parser@7.22.5(@babel/core@7.22.5)(eslint@8.43.0): + /@babel/eslint-parser@7.22.5(@babel/core@7.22.5)(eslint@8.44.0): resolution: {integrity: sha512-C69RWYNYtrgIRE5CmTd77ZiLDXqgBipahJc/jHP3sLcAGj6AJzxNIuKNpVnICqbyK7X3pFUfEvL++rvtbQpZkQ==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: @@ -553,7 +554,7 @@ packages: dependencies: '@babel/core': 7.22.5 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.43.0 + eslint: 8.44.0 eslint-visitor-keys: 2.1.0 semver: 6.3.0 dev: true @@ -3441,26 +3442,26 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.43.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.44.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.43.0 + eslint: 8.44.0 eslint-visitor-keys: 3.4.1 /@eslint-community/regexpp@4.5.1: resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - /@eslint/eslintrc@2.0.3: - resolution: {integrity: sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==} + /@eslint/eslintrc@2.1.0: + resolution: {integrity: sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4(supports-color@5.5.0) - espree: 9.5.2 + espree: 9.6.0 globals: 13.20.0 ignore: 5.2.4 import-fresh: 3.3.0 @@ -3470,8 +3471,8 @@ packages: transitivePeerDependencies: - supports-color - /@eslint/js@8.43.0: - resolution: {integrity: sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==} + /@eslint/js@8.44.0: + resolution: {integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} /@eth-optimism/contracts@0.5.37(ethers@5.7.2): @@ -4434,17 +4435,6 @@ packages: - supports-color dev: false - /@microsoft/eslint-formatter-sarif@2.1.7: - resolution: {integrity: sha512-gDNc2elHjX0eqk34HxxRxEwEL49SrvXImOoK1bZHq7IDYfuY1xY/CUx8/gOWgvwf6Qv2Yy3HirzjIvKXKH82vQ==} - dependencies: - eslint: 8.43.0 - jschardet: 3.0.0 - lodash: 4.17.21 - utf8: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - /@motionone/animation@10.15.1: resolution: {integrity: sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==} dependencies: @@ -5272,8 +5262,8 @@ packages: uuid: 9.0.0 dev: true - /@storybook/addon-backgrounds@7.0.24(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-vThKkrSj+J7matGowxIJ4eV+kAF8iUHGQjlaW0J7vhzmVkNnxBvNn/DGOWWQLAJPCTmLVelLaBZEWcMNoKJiVA==} + /@storybook/addon-actions@7.0.25(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-UgqNz7Sqr8v2KyIZlQKcysULIExCLRwmHc+O+QJqeKhz/MD89hFTsH612XaIJMwBqfcdKvxLBL6euaUbziUzlQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5283,22 +5273,53 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.0.24 - '@storybook/components': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.0.24 + '@storybook/client-logger': 7.0.25 + '@storybook/components': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 7.0.25 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.24 - '@storybook/theming': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.24 + '@storybook/manager-api': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.25 + '@storybook/theming': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.25 + dequal: 2.0.3 + lodash: 4.17.21 + polished: 4.2.2 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-inspector: 6.0.2(react@18.2.0) + telejson: 7.1.0 + ts-dedent: 2.2.0 + uuid: 9.0.0 + dev: true + + /@storybook/addon-backgrounds@7.0.25(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-KfZntItpQwDicj/cef6cXXcfhosdmE7oOl3yxra9O8aO21k9fR9Tuux6WFAg3PSpV4fENqkUnVryLmqq+kYoJw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@storybook/client-logger': 7.0.25 + '@storybook/components': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 7.0.25 + '@storybook/global': 5.0.0 + '@storybook/manager-api': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.25 + '@storybook/theming': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.25 memoizerific: 1.11.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) ts-dedent: 2.2.0 dev: true - /@storybook/addon-controls@7.0.24(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-x05Ng4wyBRkrupgSkBHKZSGPyUbvIDGiBseA/AjA/BNAMUMWy3t8ll9f7tlKzyDPaUeBSv8peP21r/Ry26Eqhw==} + /@storybook/addon-controls@7.0.25(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-bldiCQWDz9e+xseWdjcRW0/1CR2cA3H5dHk7L8KoEJiVzBAARNcLJgNOnCIxuwAlNJqlRCCxo9PfVRfBtyU75g==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5308,15 +5329,15 @@ packages: react-dom: optional: true dependencies: - '@storybook/blocks': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/client-logger': 7.0.24 - '@storybook/components': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-common': 7.0.24 - '@storybook/manager-api': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/node-logger': 7.0.24 - '@storybook/preview-api': 7.0.24 - '@storybook/theming': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.24 + '@storybook/blocks': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 7.0.25 + '@storybook/components': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-common': 7.0.25 + '@storybook/manager-api': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/node-logger': 7.0.25 + '@storybook/preview-api': 7.0.25 + '@storybook/theming': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.25 lodash: 4.17.21 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -5326,8 +5347,8 @@ packages: - supports-color dev: true - /@storybook/addon-docs@7.0.24(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-O5S+E6+8c/EHEQc5WcrNQ8dOVg9Q2ONIOYxlbSAcfMUA/d+tRR9xXTZog7nv1tj4U0G29+Vr4pKgsGh3Ya5qcw==} + /@storybook/addon-docs@7.0.25(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-fCLjk9AzNDIB9DsmU4YIhlPtqQQ0e4EEC/XrA2DXIkjBgMtEwM2DEj3My/FKz1plZ/V6qZFTa5MkMbF0H/cuAA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5336,19 +5357,19 @@ packages: '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.5) '@jest/transform': 29.5.0 '@mdx-js/react': 2.3.0(react@18.2.0) - '@storybook/blocks': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/client-logger': 7.0.24 - '@storybook/components': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/csf-plugin': 7.0.24 - '@storybook/csf-tools': 7.0.24 + '@storybook/blocks': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 7.0.25 + '@storybook/components': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/csf-plugin': 7.0.25 + '@storybook/csf-tools': 7.0.25 '@storybook/global': 5.0.0 '@storybook/mdx2-csf': 1.1.0 - '@storybook/node-logger': 7.0.24 - '@storybook/postinstall': 7.0.24 - '@storybook/preview-api': 7.0.24 - '@storybook/react-dom-shim': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/theming': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.24 + '@storybook/node-logger': 7.0.25 + '@storybook/postinstall': 7.0.25 + '@storybook/preview-api': 7.0.25 + '@storybook/react-dom-shim': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/theming': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.25 fs-extra: 11.1.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -5360,25 +5381,25 @@ packages: - supports-color dev: true - /@storybook/addon-essentials@7.0.24(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-OL27TNQYUJv/FprFCU7Q9RQYrgGdM+4SH+XmsQCcuQuGa67s6/eRKyERwOdy4Pli3Payo76+Vz1DAeJZJ0F8oA==} + /@storybook/addon-essentials@7.0.25(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-PQGTiCqMMUJGK9Cschy1R7SrNivwZtDfwaVA2lGPDtWEaFqhCkfhtB8cUyGtZWu+i8ryQwZ5MlhpyTQpm1vMPQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/addon-actions': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-backgrounds': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-controls': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-docs': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-highlight': 7.0.24 - '@storybook/addon-measure': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-outline': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-toolbars': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/addon-viewport': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-common': 7.0.24 - '@storybook/manager-api': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/node-logger': 7.0.24 - '@storybook/preview-api': 7.0.24 + '@storybook/addon-actions': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-backgrounds': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-controls': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-docs': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-highlight': 7.0.25 + '@storybook/addon-measure': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-outline': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-toolbars': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-viewport': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-common': 7.0.25 + '@storybook/manager-api': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/node-logger': 7.0.25 + '@storybook/preview-api': 7.0.25 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) ts-dedent: 2.2.0 @@ -5387,12 +5408,12 @@ packages: - supports-color dev: true - /@storybook/addon-highlight@7.0.24: - resolution: {integrity: sha512-IoCJHiX5Ai+7S08isxt7BH4baNF2RsjuGUA/iMoJtto/rMc5u0xftVeIjh6oVqV3tjckowXpezI3oStnrLWuRw==} + /@storybook/addon-highlight@7.0.25: + resolution: {integrity: sha512-m93DWSWRXkiSTTSATNhOLV2dTGPO5ACT81VeE7ffRzOqFcWsOR2d1RivKNQs2zRlPzjZQEz3UTFuaqjyTfr45Q==} dependencies: - '@storybook/core-events': 7.0.24 + '@storybook/core-events': 7.0.25 '@storybook/global': 5.0.0 - '@storybook/preview-api': 7.0.24 + '@storybook/preview-api': 7.0.25 dev: true /@storybook/addon-links@7.0.24(react-dom@18.2.0)(react@18.2.0): @@ -5420,8 +5441,8 @@ packages: ts-dedent: 2.2.0 dev: true - /@storybook/addon-measure@7.0.24(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-4VNs4rjdz+YFiJCz9DfCmBJwFuoa3pLhcEsAAdT3B+Hrkae+hvLtnQWIvAMsOlSWdl4tiuEWssDf4cjCEne87w==} + /@storybook/addon-measure@7.0.25(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-2pa9P0sRqieh9v8d5eJslB2vBwAuRFVedEcK4WYhwT6fK2ALZFdVBB78/K1NX9/Vmhhq+yT+vKA1veam06QDtg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5431,19 +5452,19 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.0.24 - '@storybook/components': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.0.24 + '@storybook/client-logger': 7.0.25 + '@storybook/components': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 7.0.25 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.24 - '@storybook/types': 7.0.24 + '@storybook/manager-api': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.25 + '@storybook/types': 7.0.25 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/addon-outline@7.0.24(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-YwSfs8bsmh7mEF+rlmL7zBsebWA5e/Rsf09vVqt6/k3fpopgBrq44zQlMwo1dCWV/0YhhXQF21OGzeJ1dSb8fA==} + /@storybook/addon-outline@7.0.25(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-f8DN7RQO6vgamqfJ96C8lG3btrKbwbIfyFjJMTrmnZhi2miMXpTAJnGZQSaNwdtPDvpf1Rxsx0bHRRUn6ko56g==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5453,20 +5474,20 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.0.24 - '@storybook/components': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.0.24 + '@storybook/client-logger': 7.0.25 + '@storybook/components': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 7.0.25 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.24 - '@storybook/types': 7.0.24 + '@storybook/manager-api': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.25 + '@storybook/types': 7.0.25 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) ts-dedent: 2.2.0 dev: true - /@storybook/addon-toolbars@7.0.24(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-+nDVahs2kAojzF6RbChowJmN0z7cyD/5BGMEhBemhBWSuMVnQLLEgtQi/kOY5fUxq3z1BkqcE4LV98u5CIKgKg==} + /@storybook/addon-toolbars@7.0.25(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Vy5FOIJKfJlTuD96XJTB8smA2+R5u+VtSwE+nHtiU66hwXtwj2YeZibL1acALlxDerYYwJw23k02R+DoGdxpIA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5476,17 +5497,17 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.0.24 - '@storybook/components': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/manager-api': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.24 - '@storybook/theming': 7.0.24(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 7.0.25 + '@storybook/components': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/manager-api': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.25 + '@storybook/theming': 7.0.25(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/addon-viewport@7.0.24(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-bc3TR+feemGxVP1QQT6OsFSldHjLToJNuQAGd5EEBsDFhcMTsmitiGVoxIylqIhfioL9zauLIsk5eLZ/TYxuXQ==} + /@storybook/addon-viewport@7.0.25(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-MOc03NGA2emcGMbEaCFsacgKTowzUNGxcHBlmXtKv0h1T9GvQKUMzXbiwOkY/DExcqcYdU+5Ch5XrxmW9Ld2VQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5496,13 +5517,13 @@ packages: react-dom: optional: true dependencies: - '@storybook/client-logger': 7.0.24 - '@storybook/components': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.0.24 + '@storybook/client-logger': 7.0.25 + '@storybook/components': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 7.0.25 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.24 - '@storybook/theming': 7.0.24(react-dom@18.2.0)(react@18.2.0) + '@storybook/manager-api': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.25 + '@storybook/theming': 7.0.25(react-dom@18.2.0)(react@18.2.0) memoizerific: 1.11.3 prop-types: 15.8.1 react: 18.2.0 @@ -5539,23 +5560,23 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/blocks@7.0.24(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-76pe4QC3WZBVxBt/RomGubW5xzbh4uF7LVn1Vonfujf4GaHgIDzu7KtLIjgM3NmDJCsp3PNfbgA1EKzWrPQz2A==} + /@storybook/blocks@7.0.25(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-R0On6JMPPqtLI7yXzKWC3wFbbW2MmHZBlY4bMNH/PYoyY2u7mSCM+49Qwsulja8I/bG8mAraueVWTNbyEunQyg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@storybook/channels': 7.0.24 - '@storybook/client-logger': 7.0.24 - '@storybook/components': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/core-events': 7.0.24 + '@storybook/channels': 7.0.25 + '@storybook/client-logger': 7.0.25 + '@storybook/components': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 7.0.25 '@storybook/csf': 0.1.1 - '@storybook/docs-tools': 7.0.24 + '@storybook/docs-tools': 7.0.25 '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/preview-api': 7.0.24 - '@storybook/theming': 7.0.24(react-dom@18.2.0)(react@18.2.0) - '@storybook/types': 7.0.24 + '@storybook/manager-api': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.0.25 + '@storybook/theming': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.25 '@types/lodash': 4.14.195 color-convert: 2.0.1 dequal: 2.0.3 @@ -5675,6 +5696,17 @@ packages: telejson: 7.1.0 dev: true + /@storybook/channel-postmessage@7.0.25: + resolution: {integrity: sha512-h4AHsgaGNcTJD8gzHAOAA6L9oxg4fVOw0LVO1L6Jd0CJ0jDV1jc3UPqh+i3bkTOB/4xjaT5xSr1h+eCUAA+N+w==} + dependencies: + '@storybook/channels': 7.0.25 + '@storybook/client-logger': 7.0.25 + '@storybook/core-events': 7.0.25 + '@storybook/global': 5.0.0 + qs: 6.11.2 + telejson: 7.1.0 + dev: true + /@storybook/channel-websocket@7.0.24: resolution: {integrity: sha512-GKSlWx5FgMQM0TKRCSGNTxLh0YU7xmg7m6FH8b/mvhH0Uido487qcJap2Ma/WOLe8aRiZo9jJpfcbUsKBWhuMg==} dependencies: @@ -5688,6 +5720,10 @@ packages: resolution: {integrity: sha512-NZVLwMhtzy6cZrNRjshFvMAD9mQTmJDNwhohodSkM/YFCDVFhmxQk9tgizVGh9MwY3CYGJ1SI96RUejGosb49Q==} dev: true + /@storybook/channels@7.0.25: + resolution: {integrity: sha512-FLuXysj0uHBQNHpfiggtyaV0EFCMVWgEQjJLeBysqB/+sBCtpjrD7kUKrgJFF+N/IEhJq/dlWt7jOpxT2bffQA==} + dev: true + /@storybook/cli@7.0.24: resolution: {integrity: sha512-TmHPJrcqUMAGpPKqw0PHI82m+Tyh6J8LgWjyZENpOGJlQH6SJ5caA/ho9R3pqVuMRRcnGgWt0xq1YJtDlYBN9g==} hasBin: true @@ -5750,6 +5786,12 @@ packages: '@storybook/global': 5.0.0 dev: true + /@storybook/client-logger@7.0.25: + resolution: {integrity: sha512-jPUH38qA+FFiEkeA6vzo2Uq2tbgJolII2nKcKw6K6KMSv+/lJNElQ4extEvXHjmPe7TqPIZVDlh8QMh5DlZO5Q==} + dependencies: + '@storybook/global': 5.0.0 + dev: true + /@storybook/codemod@7.0.24: resolution: {integrity: sha512-PukV4GRPIISuVxpMMlTilwlGXdZ7E+JZWHNVb1tTwntmxMNcby8UxyWSHjbOpA2fxXGeUCjgCpcfTymJ+hxoYw==} dependencies: @@ -5788,6 +5830,24 @@ packages: util-deprecate: 1.0.2 dev: true + /@storybook/components@7.0.25(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-eY6R8P7HRisamVed/HwsgLerhDvL3UKdg9KsgBMoGLc7//lC2Zf9qYnDSMWutCdXJh0Te+gJS/i4Jv63YP3mDQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@storybook/client-logger': 7.0.25 + '@storybook/csf': 0.1.1 + '@storybook/global': 5.0.0 + '@storybook/theming': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.25 + memoizerific: 1.11.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-resize-observer: 9.1.0(react-dom@18.2.0)(react@18.2.0) + util-deprecate: 1.0.2 + dev: true + /@storybook/core-client@7.0.24: resolution: {integrity: sha512-uToMHbi5EnOk+8Z941j0hrRE1h9u/QWqCmqS2FBIWrBOeREwy0AAib1/hqihzhO7OzekY5mtLTANiCpIpLHAHQ==} dependencies: @@ -5824,10 +5884,43 @@ packages: - supports-color dev: true + /@storybook/core-common@7.0.25: + resolution: {integrity: sha512-ohnYWhsDgOC23CMFeRlR4OM/Y5l7qq0wQiM3KtCYqFUnRwNkHZJ+rj7s6wkKKGUDy4pebvApeW7HFm/sLWaJgw==} + dependencies: + '@storybook/node-logger': 7.0.25 + '@storybook/types': 7.0.25 + '@types/node': 16.18.36 + '@types/node-fetch': 2.6.4 + '@types/pretty-hrtime': 1.0.1 + chalk: 4.1.2 + esbuild: 0.17.19 + esbuild-register: 3.4.2(esbuild@0.17.19) + file-system-cache: 2.3.0 + find-up: 5.0.0 + fs-extra: 11.1.1 + glob: 8.1.0 + glob-promise: 6.0.3(glob@8.1.0) + handlebars: 4.7.7 + lazy-universal-dotenv: 4.0.0 + node-fetch: 2.6.11 + picomatch: 2.3.1 + pkg-dir: 5.0.0 + pretty-hrtime: 1.0.3 + resolve-from: 5.0.0 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /@storybook/core-events@7.0.24: resolution: {integrity: sha512-xkf/rihCkhqMeh5EA8lVp90/mzbb2gcg6I3oeFWw2hognVcTnPXg6llhWdU4Spqd0cals7GEFmQugIILCmH8GA==} dev: true + /@storybook/core-events@7.0.25: + resolution: {integrity: sha512-abM0M+H19eZu0dRK+/2PB0W9b7xXFhiPddXpFCjIfJQFGPIwGBWVAFot1bKR5Mu4IB9OftkJYMRtYEEBrNep3A==} + dev: true + /@storybook/core-server@7.0.24: resolution: {integrity: sha512-FJgdbtLgppFMd/RedF728I+v45TRG7s5/3RJfwgRgbq4ZEhKFzZN66MwWFeq3i5Q8ETHVwAxyVvC/JrRqAJxoA==} dependencies: @@ -5892,10 +5985,10 @@ packages: - supports-color dev: true - /@storybook/csf-plugin@7.0.24: - resolution: {integrity: sha512-+oIZCIhrRFbvplXUwJn671ZM0kgNqZ59jM9RmehJGgu5N5h1JSbBcz1edXgStNsMk9e2NJopuOKrzZGTGyi0XA==} + /@storybook/csf-plugin@7.0.25: + resolution: {integrity: sha512-ncy6X4jsnQj7O0huDpYIRXJwkqMYcomfNQhhohLfoUNi0YIozVqYis3H6JxPGUtErJUPxJZmxnvUf4ox2jdITA==} dependencies: - '@storybook/csf-tools': 7.0.24 + '@storybook/csf-tools': 7.0.25 unplugin: 0.10.2 transitivePeerDependencies: - supports-color @@ -5917,6 +6010,22 @@ packages: - supports-color dev: true + /@storybook/csf-tools@7.0.25: + resolution: {integrity: sha512-ybxHmnQDEoqZZnc1DtsFuRmQG6va3eSo/eZeH6ixzTmuA5QWVx1UE7lA97c1wgbipa17+Jo1hJaMkoMPeKc7ew==} + dependencies: + '@babel/generator': 7.21.9 + '@babel/parser': 7.21.9 + '@babel/traverse': 7.21.5 + '@babel/types': 7.21.5 + '@storybook/csf': 0.1.1 + '@storybook/types': 7.0.25 + fs-extra: 11.1.1 + recast: 0.23.2 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - supports-color + dev: true + /@storybook/csf@0.1.1: resolution: {integrity: sha512-4hE3AlNVxR60Wc5KSC68ASYzUobjPqtSKyhV6G+ge0FIXU55N5nTY7dXGRZHQGDBPq+XqchMkIdlkHPRs8nTHg==} dependencies: @@ -5942,6 +6051,21 @@ packages: - supports-color dev: true + /@storybook/docs-tools@7.0.25: + resolution: {integrity: sha512-8JCQ+pFSbXNOdiCcQsfEW1A9u1CuwI/bgP0/xbw5Odl7H4ZQHwdJKOSH3qP5fBnSGIU9j2Leiaka8Kn49e7DOg==} + dependencies: + '@babel/core': 7.22.5 + '@storybook/core-common': 7.0.25 + '@storybook/preview-api': 7.0.25 + '@storybook/types': 7.0.25 + '@types/doctrine': 0.0.3 + doctrine: 3.0.0 + lodash: 4.17.21 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + /@storybook/global@5.0.0: resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} dev: true @@ -5971,6 +6095,31 @@ packages: ts-dedent: 2.2.0 dev: true + /@storybook/manager-api@7.0.25(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ZuimeFd9jUlYip1TLa+Q+CoU7xfHk7ZrCeuPSWG3QGodgt0L1gSwRbQnoS8ZN895Y3i0WQX32nnRWwwSWGrjgA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@storybook/channels': 7.0.25 + '@storybook/client-logger': 7.0.25 + '@storybook/core-events': 7.0.25 + '@storybook/csf': 0.1.1 + '@storybook/global': 5.0.0 + '@storybook/router': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/theming': 7.0.25(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.0.25 + dequal: 2.0.3 + lodash: 4.17.21 + memoizerific: 1.11.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + semver: 7.5.2 + store2: 2.14.2 + telejson: 7.1.0 + ts-dedent: 2.2.0 + dev: true + /@storybook/manager@7.0.24: resolution: {integrity: sha512-LsQd2cFJViwoPJ7K0A/XBWrBBhJv7F0J6+aa7qHszNmIZHVbMXyZfiX7JS3RHVs4I2kLuNpSk4X+iDG0QAafEQ==} dev: true @@ -6075,8 +6224,17 @@ packages: pretty-hrtime: 1.0.3 dev: true - /@storybook/postinstall@7.0.24: - resolution: {integrity: sha512-UYMXyEU4nVIKyrlUdIs3NHQmILzrN+EkEDbmeQC2WMMPw+t4GY2cDVmpx90JYYZcn7gY+cNDgQ55iiqbvlamLQ==} + /@storybook/node-logger@7.0.25: + resolution: {integrity: sha512-ZzglyuEuYgged6xHhupQ3a4N2icvQq+4GL5UXNlMWgSMwthO7yeJERJHavvjjFIukQIF8d5plTy27/LCueIX3g==} + dependencies: + '@types/npmlog': 4.1.4 + chalk: 4.1.2 + npmlog: 5.0.1 + pretty-hrtime: 1.0.3 + dev: true + + /@storybook/postinstall@7.0.25: + resolution: {integrity: sha512-y4PM5x6C5oGKNd7TnCpomFHlPKTorPl/rGTGR5aJsuj6qeY2rmKvvBb+q2XBEgePjgEli39j9CGCmAdS2B0yWQ==} dev: true /@storybook/preset-react-webpack@7.0.24(@babel/core@7.22.5)(esbuild@0.17.19)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6): @@ -6148,6 +6306,26 @@ packages: util-deprecate: 1.0.2 dev: true + /@storybook/preview-api@7.0.25: + resolution: {integrity: sha512-/KiCKMOFGSc9LaQxuNDEeWqqn/GRROCWeg4wyhm4bsxhd/DsQfTmLaB/rW0+GZpMMZoOfSITkSYETNCPzNhO9g==} + dependencies: + '@storybook/channel-postmessage': 7.0.25 + '@storybook/channels': 7.0.25 + '@storybook/client-logger': 7.0.25 + '@storybook/core-events': 7.0.25 + '@storybook/csf': 0.1.1 + '@storybook/global': 5.0.0 + '@storybook/types': 7.0.25 + '@types/qs': 6.9.7 + dequal: 2.0.3 + lodash: 4.17.21 + memoizerific: 1.11.3 + qs: 6.11.2 + synchronous-promise: 2.0.17 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + dev: true + /@storybook/preview@7.0.24: resolution: {integrity: sha512-rej4Wz8Qy4gVuyvg4cpQGkR4wJc3b+0Uv6EYylbmpdj2585cOhFtRBykagDVZteVU4xaLMT7YHIZRnoLmJKIgw==} dev: true @@ -6181,6 +6359,16 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true + /@storybook/react-dom-shim@7.0.25(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-kSwGNqchGVOGP77zFdghN+td6aDgo4VRButnqao6hHnDAGtppMky8AET3jkEgeT8wU01R9TOk5QmEs5JaDHTfA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + /@storybook/react@7.0.24(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6): resolution: {integrity: sha512-JAgSs8ANysBl3+cOAjFSVG3bA2V/wP6jyu7oK0jSATRQhHRjRS/tHFMA82j0j98G2sr3JXQUxNt55Qq3k2mUcg==} engines: {node: '>=16.0.0'} @@ -6234,6 +6422,19 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true + /@storybook/router@7.0.25(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-RcTe407o9m2KvDv+vKG3Qd2zdkswGSa6rIGKvvF/N1wEjB9pyu+HBW5PjAwlXWwPeWpfaz2du/KmXk+dxEFfug==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@storybook/client-logger': 7.0.25 + memoizerific: 1.11.3 + qs: 6.11.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + /@storybook/store@7.0.24: resolution: {integrity: sha512-T6BOXpiIAiGpQcfe0Hyu3d+8Gd0sUaVTSDXJLadfr7tqC6qmMpOuyApFu1qRfgJqh4aykUb75ESCvYWoEjwm+A==} dependencies: @@ -6272,6 +6473,20 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true + /@storybook/theming@7.0.25(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OaLtP4jjN6NGvdZpfQq3FO2IE/uZDxcXJdEXCf8azzAyhwvFU5kMA8huCE1KvOGJfAR5lPfDMQDKMXTlkV7frg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@storybook/client-logger': 7.0.25 + '@storybook/global': 5.0.0 + memoizerific: 1.11.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + /@storybook/types@7.0.24: resolution: {integrity: sha512-SZh/XBHP1TT5bmEk0W52nT0v6fUnYwmZVls3da5noutdgOAiwL7TANtl41XrNjG+UDr8x0OE3PVVJi+LhwUaNA==} dependencies: @@ -6281,6 +6496,15 @@ packages: file-system-cache: 2.3.0 dev: true + /@storybook/types@7.0.25: + resolution: {integrity: sha512-18Mn8IRbgsR+QXRa25wbNRJiKapKvODVx6rbBIH9Kim30gbTCgukYKJQlus27IODMMzMr86LiXKgnGpFv6NQ5w==} + dependencies: + '@storybook/channels': 7.0.25 + '@types/babel__core': 7.20.1 + '@types/express': 4.17.17 + file-system-cache: 2.3.0 + dev: true + /@svgr/babel-plugin-add-jsx-attribute@5.4.0: resolution: {integrity: sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==} engines: {node: '>=10'} @@ -7471,8 +7695,8 @@ packages: dev: true optional: true - /@typescript-eslint/eslint-plugin@5.60.1(@typescript-eslint/parser@5.60.1)(eslint@8.43.0)(typescript@5.1.6): - resolution: {integrity: sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==} + /@typescript-eslint/eslint-plugin@5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.44.0)(typescript@5.1.6): + resolution: {integrity: sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -7483,13 +7707,13 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.5.1 - '@typescript-eslint/parser': 5.60.1(eslint@8.43.0)(typescript@5.1.6) - '@typescript-eslint/scope-manager': 5.60.1 - '@typescript-eslint/type-utils': 5.60.1(eslint@8.43.0)(typescript@5.1.6) - '@typescript-eslint/utils': 5.60.1(eslint@8.43.0)(typescript@5.1.6) + '@typescript-eslint/parser': 5.61.0(eslint@8.44.0)(typescript@5.1.6) + '@typescript-eslint/scope-manager': 5.61.0 + '@typescript-eslint/type-utils': 5.61.0(eslint@8.44.0)(typescript@5.1.6) + '@typescript-eslint/utils': 5.61.0(eslint@8.44.0)(typescript@5.1.6) debug: 4.3.4(supports-color@5.5.0) - eslint: 8.43.0 - grapheme-splitter: 1.0.4 + eslint: 8.44.0 + graphemer: 1.4.0 ignore: 5.2.4 natural-compare-lite: 1.4.0 semver: 7.5.2 @@ -7499,21 +7723,21 @@ packages: - supports-color dev: true - /@typescript-eslint/experimental-utils@5.60.0(eslint@8.43.0)(typescript@5.1.6): + /@typescript-eslint/experimental-utils@5.60.0(eslint@8.44.0)(typescript@5.1.6): resolution: {integrity: sha512-ovid3u7CNBrr0Ct35LUPkNYH4e+z4Kc6dPfSG99oMmH9SfoEoefq09uSnJI4mUb/UM7a/peVM03G+MzLxrD16g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.60.0(eslint@8.43.0)(typescript@5.1.6) - eslint: 8.43.0 + '@typescript-eslint/utils': 5.60.0(eslint@8.44.0)(typescript@5.1.6) + eslint: 8.44.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/parser@5.60.1(eslint@8.43.0)(typescript@5.1.6): - resolution: {integrity: sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q==} + /@typescript-eslint/parser@5.61.0(eslint@8.44.0)(typescript@5.1.6): + resolution: {integrity: sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -7522,11 +7746,11 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.60.1 - '@typescript-eslint/types': 5.60.1 - '@typescript-eslint/typescript-estree': 5.60.1(typescript@5.1.6) + '@typescript-eslint/scope-manager': 5.61.0 + '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.1.6) debug: 4.3.4(supports-color@5.5.0) - eslint: 8.43.0 + eslint: 8.44.0 typescript: 5.1.6 transitivePeerDependencies: - supports-color @@ -7545,9 +7769,17 @@ packages: dependencies: '@typescript-eslint/types': 5.60.1 '@typescript-eslint/visitor-keys': 5.60.1 + dev: true + + /@typescript-eslint/scope-manager@5.61.0: + resolution: {integrity: sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/visitor-keys': 5.61.0 - /@typescript-eslint/type-utils@5.60.1(eslint@8.43.0)(typescript@5.1.6): - resolution: {integrity: sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A==} + /@typescript-eslint/type-utils@5.61.0(eslint@8.44.0)(typescript@5.1.6): + resolution: {integrity: sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -7556,10 +7788,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.60.1(typescript@5.1.6) - '@typescript-eslint/utils': 5.60.1(eslint@8.43.0)(typescript@5.1.6) + '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.1.6) + '@typescript-eslint/utils': 5.61.0(eslint@8.44.0)(typescript@5.1.6) debug: 4.3.4(supports-color@5.5.0) - eslint: 8.43.0 + eslint: 8.44.0 tsutils: 3.21.0(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: @@ -7574,6 +7806,11 @@ packages: /@typescript-eslint/types@5.60.1: resolution: {integrity: sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/types@5.61.0: + resolution: {integrity: sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} /@typescript-eslint/typescript-estree@5.60.0(typescript@5.1.6): resolution: {integrity: sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==} @@ -7615,20 +7852,41 @@ packages: typescript: 5.1.6 transitivePeerDependencies: - supports-color + dev: true + + /@typescript-eslint/typescript-estree@5.61.0(typescript@5.1.6): + resolution: {integrity: sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/visitor-keys': 5.61.0 + debug: 4.3.4(supports-color@5.5.0) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.2 + tsutils: 3.21.0(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color - /@typescript-eslint/utils@5.60.0(eslint@8.43.0)(typescript@5.1.6): + /@typescript-eslint/utils@5.60.0(eslint@8.44.0)(typescript@5.1.6): resolution: {integrity: sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 '@typescript-eslint/scope-manager': 5.60.0 '@typescript-eslint/types': 5.60.0 '@typescript-eslint/typescript-estree': 5.60.0(typescript@5.1.6) - eslint: 8.43.0 + eslint: 8.44.0 eslint-scope: 5.1.1 semver: 7.5.2 transitivePeerDependencies: @@ -7636,19 +7894,39 @@ packages: - typescript dev: true - /@typescript-eslint/utils@5.60.1(eslint@8.43.0)(typescript@5.1.6): + /@typescript-eslint/utils@5.60.1(eslint@8.44.0)(typescript@5.1.6): resolution: {integrity: sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 '@typescript-eslint/scope-manager': 5.60.1 '@typescript-eslint/types': 5.60.1 '@typescript-eslint/typescript-estree': 5.60.1(typescript@5.1.6) - eslint: 8.43.0 + eslint: 8.44.0 + eslint-scope: 5.1.1 + semver: 7.5.2 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils@5.61.0(eslint@8.44.0)(typescript@5.1.6): + resolution: {integrity: sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 5.61.0 + '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.1.6) + eslint: 8.44.0 eslint-scope: 5.1.1 semver: 7.5.2 transitivePeerDependencies: @@ -7670,6 +7948,14 @@ packages: dependencies: '@typescript-eslint/types': 5.60.1 eslint-visitor-keys: 3.4.1 + dev: true + + /@typescript-eslint/visitor-keys@5.61.0: + resolution: {integrity: sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.61.0 + eslint-visitor-keys: 3.4.1 /@vanilla-extract/css@1.9.1: resolution: {integrity: sha512-pu2SFiff5jRhPwvGoj8cM5l/qIyLvigOmy22ss5DGjwV5pJYezRjDLxWumi2luIwioMWvh9EozCjyfH8nq+7fQ==} @@ -10660,8 +10946,8 @@ packages: whatwg-url: 12.0.1 dev: false - /date-fns-tz@1.3.7(date-fns@2.21.3): - resolution: {integrity: sha512-1t1b8zyJo+UI8aR+g3iqr5fkUHWpd58VBx8J/ZSQ+w7YrGlw80Ag4sA86qkfCXRBLmMc4I2US+aPMd4uKvwj5g==} + /date-fns-tz@2.0.0(date-fns@2.21.3): + resolution: {integrity: sha512-OAtcLdB9vxSXTWHdT8b398ARImVwQMyjfYGkKD2zaGpHseG2UPHbHjXELReErZFxWdSLph3c2zOaaTyHfOhERQ==} peerDependencies: date-fns: '>=2.0.0' dependencies: @@ -11567,7 +11853,7 @@ packages: optionalDependencies: source-map: 0.6.1 - /eslint-config-next@13.4.7(eslint@8.43.0)(typescript@5.1.6): + /eslint-config-next@13.4.7(eslint@8.44.0)(typescript@5.1.6): resolution: {integrity: sha512-+IRAyD0+J1MZaTi9RQMPUfr6Q+GCZ1wOkK6XM52Vokh7VI4R6YFGOFzdkEFHl4ZyIX4FKa5vcwUP2WscSFNjNQ==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 @@ -11578,30 +11864,30 @@ packages: dependencies: '@next/eslint-plugin-next': 13.4.7 '@rushstack/eslint-patch': 1.3.2 - '@typescript-eslint/parser': 5.60.1(eslint@8.43.0)(typescript@5.1.6) - eslint: 8.43.0 + '@typescript-eslint/parser': 5.61.0(eslint@8.44.0)(typescript@5.1.6) + eslint: 8.44.0 eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.43.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) - eslint-plugin-jsx-a11y: 6.7.1(eslint@8.43.0) - eslint-plugin-react: 7.32.2(eslint@8.43.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.43.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.44.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0) + eslint-plugin-jsx-a11y: 6.7.1(eslint@8.44.0) + eslint-plugin-react: 7.32.2(eslint@8.44.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.44.0) typescript: 5.1.6 transitivePeerDependencies: - eslint-import-resolver-webpack - supports-color dev: false - /eslint-config-prettier@8.8.0(eslint@8.43.0): + /eslint-config-prettier@8.8.0(eslint@8.44.0): resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.43.0 + eslint: 8.44.0 dev: true - /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(eslint@8.43.0)(typescript@5.1.6): + /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(eslint@8.44.0)(typescript@5.1.6): resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -11612,20 +11898,20 @@ packages: optional: true dependencies: '@babel/core': 7.22.5 - '@babel/eslint-parser': 7.22.5(@babel/core@7.22.5)(eslint@8.43.0) + '@babel/eslint-parser': 7.22.5(@babel/core@7.22.5)(eslint@8.44.0) '@rushstack/eslint-patch': 1.3.2 - '@typescript-eslint/eslint-plugin': 5.60.1(@typescript-eslint/parser@5.60.1)(eslint@8.43.0)(typescript@5.1.6) - '@typescript-eslint/parser': 5.60.1(eslint@8.43.0)(typescript@5.1.6) + '@typescript-eslint/eslint-plugin': 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.44.0)(typescript@5.1.6) + '@typescript-eslint/parser': 5.61.0(eslint@8.44.0)(typescript@5.1.6) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 - eslint: 8.43.0 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(eslint@8.43.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.60.1)(eslint@8.43.0)(typescript@5.1.6) - eslint-plugin-jsx-a11y: 6.7.1(eslint@8.43.0) - eslint-plugin-react: 7.32.2(eslint@8.43.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.43.0) - eslint-plugin-testing-library: 5.11.0(eslint@8.43.0)(typescript@5.1.6) + eslint: 8.44.0 + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(eslint@8.44.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.61.0)(eslint@8.44.0)(typescript@5.1.6) + eslint-plugin-jsx-a11y: 6.7.1(eslint@8.44.0) + eslint-plugin-react: 7.32.2(eslint@8.44.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.44.0) + eslint-plugin-testing-library: 5.11.0(eslint@8.44.0)(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - '@babel/plugin-syntax-flow' @@ -11636,13 +11922,13 @@ packages: - supports-color dev: true - /eslint-config-turbo@1.10.6(eslint@8.43.0): + /eslint-config-turbo@1.10.6(eslint@8.44.0): resolution: {integrity: sha512-iZ63etePRUdEIDY5MxdUhU2ekV9TDbVdHg0BK00QqVFgQTXUYuJ7rsQj/wUKTsw3jwhbLfaY6H5sknAgYyWZ2g==} peerDependencies: eslint: '>6.6.0' dependencies: - eslint: 8.43.0 - eslint-plugin-turbo: 1.10.6(eslint@8.43.0) + eslint: 8.44.0 + eslint-plugin-turbo: 1.10.6(eslint@8.44.0) dev: true /eslint-import-resolver-node@0.3.7: @@ -11654,7 +11940,7 @@ packages: transitivePeerDependencies: - supports-color - /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.43.0): + /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.44.0): resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -11663,9 +11949,9 @@ packages: dependencies: debug: 4.3.4(supports-color@5.5.0) enhanced-resolve: 5.15.0 - eslint: 8.43.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) + eslint: 8.44.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0) get-tsconfig: 4.6.0 globby: 13.2.0 is-core-module: 2.12.1 @@ -11677,7 +11963,7 @@ packages: - eslint-import-resolver-webpack - supports-color - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -11698,24 +11984,24 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.60.1(eslint@8.43.0)(typescript@5.1.6) + '@typescript-eslint/parser': 5.61.0(eslint@8.44.0)(typescript@5.1.6) debug: 3.2.7(supports-color@8.1.1) - eslint: 8.43.0 + eslint: 8.44.0 eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.43.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.44.0) transitivePeerDependencies: - supports-color - /eslint-plugin-cypress@2.13.3(eslint@8.43.0): + /eslint-plugin-cypress@2.13.3(eslint@8.44.0): resolution: {integrity: sha512-nAPjZE5WopCsgJwl3vHm5iafpV+ZRO76Z9hMyRygWhmg5ODXDPd+9MaPl7kdJ2azj+sO87H3P1PRnggIrz848g==} peerDependencies: eslint: '>= 3.2.1' dependencies: - eslint: 8.43.0 + eslint: 8.44.0 globals: 11.12.0 dev: true - /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(eslint@8.43.0): + /eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(eslint@8.44.0): resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -11725,12 +12011,12 @@ packages: dependencies: '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.5) '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.5) - eslint: 8.43.0 + eslint: 8.44.0 lodash: 4.17.21 string-natural-compare: 3.0.1 dev: true - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0): + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0): resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} engines: {node: '>=4'} peerDependencies: @@ -11740,15 +12026,15 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.60.1(eslint@8.43.0)(typescript@5.1.6) + '@typescript-eslint/parser': 5.61.0(eslint@8.44.0)(typescript@5.1.6) array-includes: 3.1.6 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 debug: 3.2.7(supports-color@8.1.1) doctrine: 2.1.0 - eslint: 8.43.0 + eslint: 8.44.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.43.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0) has: 1.0.3 is-core-module: 2.12.1 is-glob: 4.0.3 @@ -11762,7 +12048,7 @@ packages: - eslint-import-resolver-webpack - supports-color - /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.60.1)(eslint@8.43.0)(typescript@5.1.6): + /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.61.0)(eslint@8.44.0)(typescript@5.1.6): resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} peerDependencies: @@ -11775,15 +12061,15 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.60.1(@typescript-eslint/parser@5.60.1)(eslint@8.43.0)(typescript@5.1.6) - '@typescript-eslint/experimental-utils': 5.60.0(eslint@8.43.0)(typescript@5.1.6) - eslint: 8.43.0 + '@typescript-eslint/eslint-plugin': 5.61.0(@typescript-eslint/parser@5.61.0)(eslint@8.44.0)(typescript@5.1.6) + '@typescript-eslint/experimental-utils': 5.60.0(eslint@8.44.0)(typescript@5.1.6) + eslint: 8.44.0 transitivePeerDependencies: - supports-color - typescript dev: true - /eslint-plugin-jsx-a11y@6.7.1(eslint@8.43.0): + /eslint-plugin-jsx-a11y@6.7.1(eslint@8.44.0): resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} engines: {node: '>=4.0'} peerDependencies: @@ -11798,7 +12084,7 @@ packages: axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.43.0 + eslint: 8.44.0 has: 1.0.3 jsx-ast-utils: 3.3.3 language-tags: 1.0.5 @@ -11807,7 +12093,7 @@ packages: object.fromentries: 2.0.6 semver: 6.3.0 - /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.8.0)(eslint@8.43.0)(prettier@2.8.8): + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.8.0)(eslint@8.44.0)(prettier@2.8.8): resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -11818,21 +12104,21 @@ packages: eslint-config-prettier: optional: true dependencies: - eslint: 8.43.0 - eslint-config-prettier: 8.8.0(eslint@8.43.0) + eslint: 8.44.0 + eslint-config-prettier: 8.8.0(eslint@8.44.0) prettier: 2.8.8 prettier-linter-helpers: 1.0.0 dev: true - /eslint-plugin-react-hooks@4.6.0(eslint@8.43.0): + /eslint-plugin-react-hooks@4.6.0(eslint@8.44.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.43.0 + eslint: 8.44.0 - /eslint-plugin-react@7.32.2(eslint@8.43.0): + /eslint-plugin-react@7.32.2(eslint@8.44.0): resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} engines: {node: '>=4'} peerDependencies: @@ -11842,7 +12128,7 @@ packages: array.prototype.flatmap: 1.3.1 array.prototype.tosorted: 1.1.1 doctrine: 2.1.0 - eslint: 8.43.0 + eslint: 8.44.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.3 minimatch: 3.1.2 @@ -11855,36 +12141,36 @@ packages: semver: 6.3.0 string.prototype.matchall: 4.0.8 - /eslint-plugin-testing-library@5.11.0(eslint@8.43.0)(typescript@5.1.6): + /eslint-plugin-testing-library@5.11.0(eslint@8.44.0)(typescript@5.1.6): resolution: {integrity: sha512-ELY7Gefo+61OfXKlQeXNIDVVLPcvKTeiQOoMZG9TeuWa7Ln4dUNRv8JdRWBQI9Mbb427XGlVB1aa1QPZxBJM8Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} peerDependencies: eslint: ^7.5.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.60.1(eslint@8.43.0)(typescript@5.1.6) - eslint: 8.43.0 + '@typescript-eslint/utils': 5.60.1(eslint@8.44.0)(typescript@5.1.6) + eslint: 8.44.0 transitivePeerDependencies: - supports-color - typescript dev: true - /eslint-plugin-turbo@1.10.6(eslint@8.43.0): + /eslint-plugin-turbo@1.10.6(eslint@8.44.0): resolution: {integrity: sha512-jlzfxYaK8hcz1DTk8Glxxi1r0kgdy85191a4CbFOTiiBulmKHMLJgzhsyE9Ong796MA62n91KFpc20BiKjlHwg==} peerDependencies: eslint: '>6.6.0' dependencies: dotenv: 16.0.3 - eslint: 8.43.0 + eslint: 8.44.0 dev: true - /eslint-plugin-ui-testing@2.0.1(eslint@8.43.0)(typescript@5.1.6): + /eslint-plugin-ui-testing@2.0.1(eslint@8.44.0)(typescript@5.1.6): resolution: {integrity: sha512-GpvE0u03GSytsJ/K49C2dJlvDKQSfh+PX4lAEjBIc5RxUWEpGf9/jY3JTFd7F0gQ9ElGfYskJceVKyz7knbFFw==} engines: {node: ^10.12.0 || >=12.0.0, npm: '>=6'} peerDependencies: eslint: '>= 7' dependencies: - '@typescript-eslint/experimental-utils': 5.60.0(eslint@8.43.0)(typescript@5.1.6) - eslint: 8.43.0 + '@typescript-eslint/experimental-utils': 5.60.0(eslint@8.44.0)(typescript@5.1.6) + eslint: 8.44.0 transitivePeerDependencies: - supports-color - typescript @@ -11914,15 +12200,15 @@ packages: resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /eslint@8.43.0: - resolution: {integrity: sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==} + /eslint@8.44.0: + resolution: {integrity: sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) '@eslint-community/regexpp': 4.5.1 - '@eslint/eslintrc': 2.0.3 - '@eslint/js': 8.43.0 + '@eslint/eslintrc': 2.1.0 + '@eslint/js': 8.44.0 '@humanwhocodes/config-array': 0.11.10 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -11934,7 +12220,7 @@ packages: escape-string-regexp: 4.0.0 eslint-scope: 7.2.0 eslint-visitor-keys: 3.4.1 - espree: 9.5.2 + espree: 9.6.0 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -11954,15 +12240,15 @@ packages: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.1 + optionator: 0.9.3 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 text-table: 0.2.0 transitivePeerDependencies: - supports-color - /espree@9.5.2: - resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==} + /espree@9.6.0: + resolution: {integrity: sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: acorn: 8.9.0 @@ -13320,10 +13606,6 @@ packages: /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - dev: true - /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} @@ -15055,11 +15337,6 @@ packages: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} dev: true - /jschardet@3.0.0: - resolution: {integrity: sha512-lJH6tJ77V8Nzd5QWRkFYCLc13a3vADkh3r/Fi8HupZGWk2OVVDfnZP8V/VgQgZ+lzW0kG2UGb5hFgt3V3ndotQ==} - engines: {node: '>=0.1.90'} - dev: true - /jscodeshift@0.14.0(@babel/preset-env@7.21.5): resolution: {integrity: sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==} hasBin: true @@ -16604,16 +16881,16 @@ packages: type-check: 0.3.2 word-wrap: 1.2.3 - /optionator@0.9.1: - resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - word-wrap: 1.2.3 /ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}