diff --git a/.changeset/afraid-terms-push.md b/.changeset/afraid-terms-push.md new file mode 100644 index 000000000..8b1ba8f92 --- /dev/null +++ b/.changeset/afraid-terms-push.md @@ -0,0 +1,7 @@ +--- +'@fuel-wallet/sdk': minor +--- + +feat: add hooks `useAddAssets`, `useAddNetwork`, `useAssets` and `useNetwork`. +feat: improve hooks `useWallet` `useConnect` and `useAccounts`. +feat: remove `FuelConnectorProvider` and consolidate into `FuelProvider`. diff --git a/.changeset/angry-eggs-rest.md b/.changeset/angry-eggs-rest.md new file mode 100644 index 000000000..a845151cc --- /dev/null +++ b/.changeset/angry-eggs-rest.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/.changeset/config.json b/.changeset/config.json index 477b7ab55..8a4be3a77 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -14,12 +14,7 @@ "access": "public", "baseBranch": "master", "updateInternalDependencies": "patch", - "ignore": [ - "docs", - "@fuel-wallet/sdk-v2", - "@fuel-wallet/e2e-contract-tests", - "@fuels/update-sdk" - ], + "ignore": ["docs", "@fuel-wallet/e2e-contract-tests", "@fuels/update-sdk"], "snapshot": { "useCalculatedVersion": true, "prereleaseTemplate": "{tag}-{commit}" diff --git a/.changeset/itchy-ducks-juggle.md b/.changeset/itchy-ducks-juggle.md new file mode 100644 index 000000000..997103229 --- /dev/null +++ b/.changeset/itchy-ducks-juggle.md @@ -0,0 +1,5 @@ +--- +'@fuel-wallet/react': patch +--- + +Feat support for image from connector metadata diff --git a/.changeset/large-shoes-fail.md b/.changeset/large-shoes-fail.md new file mode 100644 index 000000000..a845151cc --- /dev/null +++ b/.changeset/large-shoes-fail.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/.changeset/tasty-insects-admire.md b/.changeset/tasty-insects-admire.md new file mode 100644 index 000000000..e26453b81 --- /dev/null +++ b/.changeset/tasty-insects-admire.md @@ -0,0 +1,9 @@ +--- +'@fuel-wallet/connections': minor +'@fuel-wallet/react': minor +'@fuel-wallet/types': minor +'fuels-wallet': minor +'@fuel-wallet/sdk': minor +--- + +feat: update sdk for the new connectors standard. diff --git a/.changeset/ten-snails-smoke.md b/.changeset/ten-snails-smoke.md new file mode 100644 index 000000000..102bbb880 --- /dev/null +++ b/.changeset/ten-snails-smoke.md @@ -0,0 +1,10 @@ +--- +'@fuel-wallet/connections': minor +'@fuel-wallet/playwright-utils': minor +'@fuel-wallet/react': minor +'@fuel-wallet/types': minor +'fuels-wallet': minor +'@fuel-wallet/sdk': minor +--- + +feat: remove fuel-ui from connectors ui and update to the new connectors api. diff --git a/.changeset/tender-yaks-warn.md b/.changeset/tender-yaks-warn.md new file mode 100644 index 000000000..a845151cc --- /dev/null +++ b/.changeset/tender-yaks-warn.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/.github/workflows/pr-tests.yml b/.github/workflows/pr-tests.yml index 15448e592..b31290388 100644 --- a/.github/workflows/pr-tests.yml +++ b/.github/workflows/pr-tests.yml @@ -2,7 +2,7 @@ name: Tests on: pull_request: - branches: [main, master] + branches: [main, master, sdk-v2] types: [opened, synchronize, reopened] concurrency: diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index f9bb5a05a..f52348512 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -49,7 +49,7 @@ jobs: uses: FuelLabs/github-actions/setups/node@master - name: Validate Changeset - run: pnpm changeset status --since=origin/master + run: pnpm changeset status --since=origin/${{ github.base_ref }} audit: name: Audit diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 03c56c6ba..49723b50e 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -5,6 +5,7 @@ services: platform: linux/amd64 container_name: '${PROJECT:-fuel-node}_fuel-core' environment: + NETWORK_NAME: '${PROJECT} local' MIN_GAS_PRICE: ${MIN_GAS_PRICE} # This is the private key of the consensus.PoA.signing_key in the chainConfig.json # this key is responsible for validating the transactions diff --git a/docker/fuel-core/Dockerfile b/docker/fuel-core/Dockerfile index 51fa09f1a..94310a552 100644 --- a/docker/fuel-core/Dockerfile +++ b/docker/fuel-core/Dockerfile @@ -2,6 +2,7 @@ FROM ghcr.io/fuellabs/fuel-core:v0.22.0 ENV MIN_GAS_PRICE="${MIN_GAS_PRICE}" ENV CONSENSUS_KEY="${CONSENSUS_KEY}" +ENV NETWORK_NAME="${NETWORK_NAME}" # Install curl to use on # healthcheck config @@ -11,17 +12,7 @@ RUN apt install curl -y WORKDIR /root/ COPY chainConfig.json . - -# https://stackoverflow.com/a/44671685 -# https://stackoverflow.com/a/40454758 -# hadolint ignore=DL3025 -CMD ./fuel-core run \ - --ip 0.0.0.0 \ - --port 4000 \ - --db-path ./mnt/db/ \ - --utxo-validation \ - --min-gas-price ${MIN_GAS_PRICE} \ - --consensus-key ${CONSENSUS_KEY} \ - --chain ./chainConfig.json - +COPY run.sh . EXPOSE ${PORT} + +CMD ["sh", "./run.sh"] diff --git a/docker/fuel-core/accounts.json b/docker/fuel-core/accounts.json new file mode 100644 index 000000000..51825697c --- /dev/null +++ b/docker/fuel-core/accounts.json @@ -0,0 +1,10 @@ +[ + { + "account": "0xc8e615a4089466174459ef19cfd257d2e17adfabff3b8f219dbb5fb4eca87c50", + "privateKey": "0xba9e8401405cd4327119548bccf0cd8b195c3fb716c848d9571c60bb230c6978" + }, + { + "account": "0x92dffc873b56f219329ed03bb69bebe8c3d8b041088574882f7a6404f02e2f28", + "privateKey": "0xa349d39f614a3085b7f7f8cef63fd5189136924fc1238e6d25ccdaa43a901cd0" + } +] diff --git a/docker/fuel-core/chainConfig.json b/docker/fuel-core/chainConfig.json index 697ba4ccc..d3b1d5268 100644 --- a/docker/fuel-core/chainConfig.json +++ b/docker/fuel-core/chainConfig.json @@ -194,7 +194,17 @@ }, { "owner": "0x6684dd7bb61364e1ac458e9241f969178c4a2e302bbc23e143c49d8b6dba701a", - "amount": "0xFFFFFFFFFFFFFFFF", + "amount": "0x00000000FFFFFFFF", + "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "owner": "0xc8e615a4089466174459ef19cfd257d2e17adfabff3b8f219dbb5fb4eca87c50", + "amount": "0x00000000FFFFFFFF", + "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "owner": "0x92dffc873b56f219329ed03bb69bebe8c3d8b041088574882f7a6404f02e2f28", + "amount": "0x00000000FFFFFFFF", "asset_id": "0x0000000000000000000000000000000000000000000000000000000000000000" } ] diff --git a/docker/fuel-core/run.sh b/docker/fuel-core/run.sh new file mode 100644 index 000000000..9dbb11922 --- /dev/null +++ b/docker/fuel-core/run.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# Change the network name +sed -i "s/local_testnet/$NETWORK_NAME/g" ./chainConfig.json + +# Start the Fuel Core node +/root/fuel-core run \ + --ip 0.0.0.0 \ + --port 4000 \ + --db-path ./mnt/db/ \ + --utxo-validation \ + --min-gas-price ${MIN_GAS_PRICE} \ + --consensus-key ${CONSENSUS_KEY} \ + --chain ./chainConfig.json diff --git a/examples/cra-dapp/.gitignore b/examples/cra-dapp/.gitignore new file mode 100644 index 000000000..4d29575de --- /dev/null +++ b/examples/cra-dapp/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/examples/cra-dapp/README.md b/examples/cra-dapp/README.md new file mode 100644 index 000000000..b87cb0044 --- /dev/null +++ b/examples/cra-dapp/README.md @@ -0,0 +1,46 @@ +# Getting Started with Create React App + +This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). + +## Available Scripts + +In the project directory, you can run: + +### `npm start` + +Runs the app in the development mode.\ +Open [http://localhost:3000](http://localhost:3000) to view it in the browser. + +The page will reload if you make edits.\ +You will also see any lint errors in the console. + +### `npm test` + +Launches the test runner in the interactive watch mode.\ +See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. + +### `npm run build` + +Builds the app for production to the `build` folder.\ +It correctly bundles React in production mode and optimizes the build for the best performance. + +The build is minified and the filenames include the hashes.\ +Your app is ready to be deployed! + +See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. + +### `npm run eject` + +**Note: this is a one-way operation. Once you `eject`, you can’t go back!** + +If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. + +Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. + +You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. + +## Learn More + +You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). + +To learn React, check out the [React documentation](https://reactjs.org/). diff --git a/examples/cra-dapp/package.json b/examples/cra-dapp/package.json new file mode 100644 index 000000000..9d139e4f8 --- /dev/null +++ b/examples/cra-dapp/package.json @@ -0,0 +1,33 @@ +{ + "name": "cra-dapp", + "version": "0.1.0", + "private": true, + "dependencies": { + "@fuel-wallet/react": "workspace:*", + "@types/node": "^16.18.61", + "@types/react": "^18.2.37", + "@types/react-dom": "^18.2.15", + "fuels": "0.67.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-scripts": "5.0.1", + "typescript": "^4.9.5", + "web-vitals": "^2.1.4" + }, + "scripts": { + "start": "react-scripts start", + "eject": "react-scripts eject" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/examples/cra-dapp/public/favicon.ico b/examples/cra-dapp/public/favicon.ico new file mode 100644 index 000000000..a11777cc4 Binary files /dev/null and b/examples/cra-dapp/public/favicon.ico differ diff --git a/examples/cra-dapp/public/index.html b/examples/cra-dapp/public/index.html new file mode 100644 index 000000000..e65acb3de --- /dev/null +++ b/examples/cra-dapp/public/index.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + React App + + + +
+ + + diff --git a/examples/cra-dapp/public/manifest.json b/examples/cra-dapp/public/manifest.json new file mode 100644 index 000000000..1f2f141fa --- /dev/null +++ b/examples/cra-dapp/public/manifest.json @@ -0,0 +1,15 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/examples/cra-dapp/public/robots.txt b/examples/cra-dapp/public/robots.txt new file mode 100644 index 000000000..e9e57dc4d --- /dev/null +++ b/examples/cra-dapp/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/examples/cra-dapp/src/App.css b/examples/cra-dapp/src/App.css new file mode 100644 index 000000000..47536b0c3 --- /dev/null +++ b/examples/cra-dapp/src/App.css @@ -0,0 +1,49 @@ +.App { + display: flex; + flex-direction: column; + align-items: center; + padding-top: 100px; + height: 100vh; + width: 100vw; +} + +.App[data-theme='dark'] { + background-color: #282c34; + color: white; +} + +button { + all: unset; + border: 1px solid black; + padding: 10px 20px; + border-radius: 4px; + box-shadow: 1px 1px 1px 1px rgba(0, 0, 0, 0.2); + transition: box-shadow 0.2s ease-in-out; + cursor: pointer; +} + +button:active { + box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2); +} + +.Actions { + display: flex; + flex-direction: row; + align-items: center; + gap: 10px; +} + +.Accounts { + margin-top: 20px; + text-align: center; +} + +.Accounts > div { + font-style: italic; +} + +.Error { + color: #d60000; + width: 100%; + text-align: center; +} diff --git a/examples/cra-dapp/src/App.tsx b/examples/cra-dapp/src/App.tsx new file mode 100644 index 000000000..e886747cf --- /dev/null +++ b/examples/cra-dapp/src/App.tsx @@ -0,0 +1,51 @@ +/* eslint-disable no-console */ +import { + useAccounts, + useDisconnect, + useConnectUI, + useIsConnected, +} from '@fuel-wallet/react'; +import './App.css'; + +function App() { + const { connect, error, isError, theme, setTheme, isConnecting } = + useConnectUI(); + const { disconnect } = useDisconnect(); + const { isConnected } = useIsConnected(); + const { accounts } = useAccounts(); + const lightTheme = theme === 'light'; + + return ( +
+
+ + {isConnected && ( + + )} + +
+ {isError &&

{error?.message}

} + {isConnected && ( +
+

Connected accounts

+ {accounts?.map((account) => ( +
+ Account: {account} +
+ ))} +
+ )} +
+ ); +} + +export default App; diff --git a/examples/cra-dapp/src/index.css b/examples/cra-dapp/src/index.css new file mode 100644 index 000000000..15320741a --- /dev/null +++ b/examples/cra-dapp/src/index.css @@ -0,0 +1,8 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/examples/cra-dapp/src/index.tsx b/examples/cra-dapp/src/index.tsx new file mode 100644 index 000000000..422f440a6 --- /dev/null +++ b/examples/cra-dapp/src/index.tsx @@ -0,0 +1,29 @@ +import { FuelProvider } from '@fuel-wallet/react'; +import React from 'react'; +import ReactDOM from 'react-dom/client'; + +import './index.css'; +import App from './App'; +import reportWebVitals from './reportWebVitals'; + +const root = ReactDOM.createRoot( + document.getElementById('root') as HTMLElement +); +root.render( + + + + + +); + +// If you want to start measuring performance in your app, pass a function +// to log results (for example: reportWebVitals(console.log)) +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals +reportWebVitals(); diff --git a/examples/cra-dapp/src/react-app-env.d.ts b/examples/cra-dapp/src/react-app-env.d.ts new file mode 100644 index 000000000..6431bc5fc --- /dev/null +++ b/examples/cra-dapp/src/react-app-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/examples/cra-dapp/src/reportWebVitals.ts b/examples/cra-dapp/src/reportWebVitals.ts new file mode 100644 index 000000000..6071e230d --- /dev/null +++ b/examples/cra-dapp/src/reportWebVitals.ts @@ -0,0 +1,15 @@ +import type { ReportHandler } from 'web-vitals'; + +const reportWebVitals = (onPerfEntry?: ReportHandler) => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry); + getFID(onPerfEntry); + getFCP(onPerfEntry); + getLCP(onPerfEntry); + getTTFB(onPerfEntry); + }); + } +}; + +export default reportWebVitals; diff --git a/examples/cra-dapp/tsconfig.json b/examples/cra-dapp/tsconfig.json new file mode 100644 index 000000000..9d379a3c4 --- /dev/null +++ b/examples/cra-dapp/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": ["src"] +} diff --git a/package.json b/package.json index e2679a1b9..ad92c69f6 100644 --- a/package.json +++ b/package.json @@ -120,6 +120,7 @@ ] }, "overrides": { + "follow-redirects": ">=1.15.4", "glob-parent@<5.1.2": ">=5.1.2", "json5": ">=2.2.2", "trim-newlines@<3.0.1": ">=3.0.1", @@ -134,6 +135,7 @@ "@adobe/css-tools": ">=4.3.1", "postcss@<8.4.31": ">=8.4.31", "zod@<=3.22.2": ">=3.22.3", + "nth-check": ">=2.1.1", "@adobe/css-tools@<4.3.2": ">=4.3.2", "@babel/traverse@<7.23.2": ">=7.23.2" } diff --git a/packages/app/.storybook/main.ts b/packages/app/.storybook/main.ts index ddfb70593..96eddc93a 100644 --- a/packages/app/.storybook/main.ts +++ b/packages/app/.storybook/main.ts @@ -6,7 +6,11 @@ import { join } from 'node:path'; import { resolveLinkDeps } from '../vite-utils/vite.base.config'; const config: StorybookConfig = { - stories: ['../src/**/*.stories.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'], + stories: [ + '../src/**/*.stories.mdx', + '../src/**/*.stories.@(js|jsx|ts|tsx)', + '../connect/**/*.stories.@(js|jsx|ts|tsx)', + ], addons: [ '@storybook/addon-links', '@storybook/addon-essentials', diff --git a/packages/app/connect/connect.stories.tsx b/packages/app/connect/connect.stories.tsx new file mode 100644 index 000000000..e35a6f4b6 --- /dev/null +++ b/packages/app/connect/connect.stories.tsx @@ -0,0 +1,47 @@ +import { cssObj } from '@fuel-ui/css'; +import { Box, Button, Text } from '@fuel-ui/react'; +import { FuelProvider, useAccount, useConnectUI } from '@fuel-wallet/react'; +import { useDarkMode } from 'storybook-dark-mode'; + +export default { + component: FuelProvider, + title: 'Connect', + parameters: { + layout: 'fullscreen', + }, +}; + +const App = () => { + const { account } = useAccount(); + const { connect, isConnecting } = useConnectUI(); + + return ( + <> + + {account} + + ); +}; + +export const Usage = () => { + const isDark = useDarkMode(); + return ( + + + + + + + + ); +}; + +const styles = { + box: cssObj({ + '.DialogContent': { + backgroundColor: 'red !important', + }, + }), +}; diff --git a/packages/app/e2e.html b/packages/app/e2e.html index 63f85f42e..b0446600a 100644 --- a/packages/app/e2e.html +++ b/packages/app/e2e.html @@ -14,4 +14,5 @@ + diff --git a/packages/app/package.json b/packages/app/package.json index 69ca44ec3..f15bf3875 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -27,6 +27,7 @@ "@fuel-ui/react": "0.23.0", "@fuel-ui/test-utils": "0.17.0", "@fuel-wallet/sdk": "workspace:*", + "@fuel-wallet/connections": "workspace:*", "@fuel-wallet/types": "workspace:*", "@fuels/assets": "0.1.4", "@fuels/local-storage": "0.1.4", @@ -68,6 +69,7 @@ "yup": "^1.3.2" }, "devDependencies": { + "@fuel-wallet/react": "workspace:*", "@crxjs/vite-plugin": "^1.0.14", "@graphql-codegen/cli": "^5.0.0", "@graphql-codegen/named-operations-object": "^2.3.1", diff --git a/packages/app/playwright/crx/crx.test.ts b/packages/app/playwright/crx/crx.test.ts index 6cf4cabcc..ec7189dfc 100644 --- a/packages/app/playwright/crx/crx.test.ts +++ b/packages/app/playwright/crx/crx.test.ts @@ -1,4 +1,4 @@ -import type { Account, Asset, Network } from '@fuel-wallet/types'; +import type { Account, Asset } from '@fuel-wallet/sdk'; import { expect } from '@playwright/test'; import { Signer, bn, hashMessage, Wallet, Provider } from 'fuels'; @@ -12,8 +12,8 @@ import { getElementByText, } from '../commons'; import { - CUSTOM_ASSET, - CUSTOM_ASSET_2, + CUSTOM_ASSET_INPUT, + CUSTOM_ASSET_INPUT_2, FUEL_NETWORK, PRIVATE_KEY, } from '../mocks'; @@ -68,22 +68,6 @@ test.describe('FuelWallet Extension', () => { // the page. await blankPage.goto(new URL('e2e.html', baseURL).href); - await test.step('Should trigger event FuelLoaded', async () => { - // Reload and don't wait for loadstate to go to evaluate - // This is required in order to get the `FuelLoaded` event - await blankPage.reload({ - waitUntil: 'commit', - }); - const hasTriggerFuelLoaded = await blankPage.evaluate(async () => { - return new Promise((resolve) => { - document.addEventListener('FuelLoaded', () => { - resolve(typeof window.fuel !== 'undefined'); - }); - }); - }); - expect(hasTriggerFuelLoaded).toBeTruthy(); - }); - await test.step('Has window.fuel', async () => { const hasFuel = await blankPage.evaluate(async () => { return typeof window.fuel === 'object'; @@ -396,9 +380,7 @@ test.describe('FuelWallet Extension', () => { ) { return blankPage.evaluate( async ([senderAddress, receiverAddress, amount]) => { - const receiver = window.fuel.utils.createAddress( - receiverAddress as string - ); + const receiver = window.createAddress(receiverAddress as string); const wallet = await window.fuel!.getWallet( senderAddress as string ); @@ -526,7 +508,7 @@ test.describe('FuelWallet Extension', () => { ); } - const addingAsset = addAsset(CUSTOM_ASSET); + const addingAsset = addAsset(CUSTOM_ASSET_INPUT); const addAssetPage = await context.waitForEvent('page', { predicate: (page) => page.url().includes(extensionId), @@ -546,7 +528,7 @@ test.describe('FuelWallet Extension', () => { ); } - const addingAsset = addAssets([CUSTOM_ASSET, CUSTOM_ASSET_2]); + const addingAsset = addAssets([CUSTOM_ASSET_INPUT, CUSTOM_ASSET_INPUT_2]); const addAssetPage = await context.waitForEvent('page', { predicate: (page) => page.url().includes(extensionId), @@ -557,7 +539,7 @@ test.describe('FuelWallet Extension', () => { }); await test.step('window.fuel.addNetwork()', async () => { - function addNetwork(network: Network) { + function addNetwork(network: string) { return blankPage.evaluate( async ([network]) => { return window.fuel.addNetwork(network); @@ -567,7 +549,7 @@ test.describe('FuelWallet Extension', () => { } async function testAddNetwork() { - const addingNetwork = addNetwork(FUEL_NETWORK); + const addingNetwork = addNetwork(FUEL_NETWORK.url); const addNetworkPage = await context.waitForEvent('page', { predicate: (page) => page.url().includes(extensionId), @@ -584,7 +566,7 @@ test.describe('FuelWallet Extension', () => { // Check if added network is selected let networkSelector = getByAriaLabel(popupPage, 'Selected Network'); - await expect(networkSelector).toHaveText(/Fuel Testnet/); + await expect(networkSelector).toHaveText(/Testnet Beta 5/); // Remove added network await networkSelector.click(); @@ -610,7 +592,7 @@ test.describe('FuelWallet Extension', () => { // Check if re-added network is selected networkSelector = getByAriaLabel(popupPage, 'Selected Network'); - await expect(networkSelector).toHaveText(/Fuel Testnet/); + await expect(networkSelector).toHaveText(/Testnet Beta 5/); }); await test.step('window.fuel.on("currentAccount") to a connected account', async () => { diff --git a/packages/app/playwright/e2e.ts b/packages/app/playwright/e2e.ts new file mode 100644 index 000000000..7a107494e --- /dev/null +++ b/packages/app/playwright/e2e.ts @@ -0,0 +1,11 @@ +import { + Fuel, + FuelWalletConnector, + FuelWalletDevelopmentConnector, +} from '@fuel-wallet/sdk'; +import { Address } from 'fuels'; + +window.fuel = new Fuel({ + connectors: [new FuelWalletConnector(), new FuelWalletDevelopmentConnector()], +}); +window.createAddress = (address: string) => Address.fromString(address); diff --git a/packages/app/playwright/mocks/database.ts b/packages/app/playwright/mocks/database.ts index 940a4f30f..eff41e1dd 100644 --- a/packages/app/playwright/mocks/database.ts +++ b/packages/app/playwright/mocks/database.ts @@ -1,6 +1,12 @@ import type { Account as WalletAccount } from '@fuel-ts/wallet-manager'; import { WalletManager } from '@fuel-ts/wallet-manager'; -import type { Account, Asset, Connection, Network } from '@fuel-wallet/types'; +import type { + Account, + Asset, + AssetData, + Connection, + NetworkData, +} from '@fuel-wallet/sdk'; import type { Page } from '@playwright/test'; import { Mnemonic, encrypt, Address } from 'fuels'; @@ -14,7 +20,7 @@ export const WALLET_PASSWORD = 'Qwe1234567$'; export const PRIVATE_KEY = '0xa449b1ffee0e2205fa924c6740cc48b3b473aa28587df6dab12abc245d1f5291'; -export const DEFAULT_NETWORKS: Array = [ +export const DEFAULT_NETWORKS: Array = [ { id: '1', isSelected: true, @@ -29,6 +35,35 @@ export const DEFAULT_NETWORKS: Array = [ }, ]; +export const CUSTOM_ASSET_INPUT: Asset = { + name: 'New', + symbol: 'NEW', + icon: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/46/Bitcoin.svg/1200px-Bitcoin.svg.png', + networks: [ + { + type: 'fuel', + assetId: + '0x566012155ae253353c7df01f36c8f6249c94131a69a3484bdb0234e3822b5d90', + decimals: 2, + chainId: 0, + }, + ], +}; +export const CUSTOM_ASSET_INPUT_2: Asset = { + name: 'New1', + symbol: 'NEW1', + icon: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/46/Bitcoin.svg/1200px-Bitcoin.svg.png', + networks: [ + { + type: 'fuel', + assetId: + '0x566012155ae253353c7df01f36c8f6249c94131a69a3484bdb0234e3822b5d91', + decimals: 2, + chainId: 0, + }, + ], +}; + export const CUSTOM_ASSET = { assetId: '0x566012155ae253353c7df01f36c8f6249c94131a69a3484bdb0234e3822b5d90', name: 'New', @@ -148,7 +183,7 @@ export async function serializeVault( export async function mockData( page: Page, numberOfAccounts: number = 1, - networks: Array = DEFAULT_NETWORKS + networks: Array = DEFAULT_NETWORKS ) { await visit(page, '/'); const mnemonic = Mnemonic.generate(16); @@ -162,9 +197,9 @@ export async function mockData( await page.evaluate( ([accounts, networks, connections, assets, vault, password]: [ Array, - Array, + Array, Array, - Array, + Array, SerializedVault, string, ]) => { diff --git a/packages/app/playwright/types.d.ts b/packages/app/playwright/types.d.ts new file mode 100644 index 000000000..c7c11e4ed --- /dev/null +++ b/packages/app/playwright/types.d.ts @@ -0,0 +1,13 @@ +import type { Fuel } from '@fuel-wallet/sdk'; +import type { Address } from 'fuels'; + +declare global { + interface Window { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + fuel: Fuel; + createAddress: (string: string) => Address; + } +} + +export {}; diff --git a/packages/app/src/systems/Account/hooks/useAccounts.tsx b/packages/app/src/systems/Account/hooks/useAccounts.tsx index 3f44035d4..9038c084c 100644 --- a/packages/app/src/systems/Account/hooks/useAccounts.tsx +++ b/packages/app/src/systems/Account/hooks/useAccounts.tsx @@ -1,4 +1,4 @@ -import type { Asset } from '@fuel-wallet/types'; +import type { AssetData } from '@fuel-wallet/types'; import { bn } from 'fuels'; import { useEffect, useRef } from 'react'; import { store, Services } from '~/store'; @@ -32,7 +32,7 @@ const selectors = { account(state: AccountsMachineState) { return state.context.account; }, - balanceAssets(assets: Asset[]) { + balanceAssets(assets: AssetData[]) { return (state: AccountsMachineState) => state.context.account?.balances?.map((balance) => ({ ...balance, diff --git a/packages/app/src/systems/Asset/components/AssetRemoveDialog/AssetRemoveDialog.tsx b/packages/app/src/systems/Asset/components/AssetRemoveDialog/AssetRemoveDialog.tsx index a6523cce8..14caaa5f3 100644 --- a/packages/app/src/systems/Asset/components/AssetRemoveDialog/AssetRemoveDialog.tsx +++ b/packages/app/src/systems/Asset/components/AssetRemoveDialog/AssetRemoveDialog.tsx @@ -1,12 +1,12 @@ import { cssObj } from '@fuel-ui/css'; import { AlertDialog, Button } from '@fuel-ui/react'; -import type { Asset } from '@fuel-wallet/types'; +import type { AssetData } from '@fuel-wallet/types'; import type { ReactNode } from 'react'; import { useState } from 'react'; type AssetRemoveDialogProps = { children: ReactNode; - asset: Asset; + asset: AssetData; onConfirm: () => void; }; diff --git a/packages/app/src/systems/Asset/machines/assetsMachine.tsx b/packages/app/src/systems/Asset/machines/assetsMachine.tsx index d23e00761..b251bb704 100644 --- a/packages/app/src/systems/Asset/machines/assetsMachine.tsx +++ b/packages/app/src/systems/Asset/machines/assetsMachine.tsx @@ -1,5 +1,5 @@ import { toast } from '@fuel-ui/react'; -import type { Asset } from '@fuel-wallet/types'; +import type { AssetData } from '@fuel-wallet/types'; import type { InterpreterFrom, StateFrom } from 'xstate'; import { assign, createMachine } from 'xstate'; import { FetchMachine, fuelAssets } from '~/systems/Core'; @@ -15,12 +15,12 @@ export enum AssetsStatus { } export type MachineContext = { - assets?: Asset[]; + assets?: AssetData[]; }; type MachineServices = { fetchAssets: { - data: Asset[]; + data: AssetData[]; }; addAsset: { data: boolean; diff --git a/packages/app/src/systems/Asset/services/assets.ts b/packages/app/src/systems/Asset/services/assets.ts index 4c0fcee48..31933eadf 100644 --- a/packages/app/src/systems/Asset/services/assets.ts +++ b/packages/app/src/systems/Asset/services/assets.ts @@ -1,21 +1,21 @@ -import type { Asset } from '@fuel-wallet/types'; +import type { AssetData } from '@fuel-wallet/types'; import { isB256 } from 'fuels'; import { db } from '~/systems/Core/utils/database'; import { getUniqueString } from '~/systems/Core/utils/string'; export type AssetInputs = { upsertAsset: { - data: Asset; + data: AssetData; }; updateAsset: { id: string; - data: Partial; + data: Partial; }; addAsset: { - data: Asset; + data: AssetData; }; addAssets: { - data: Asset[]; + data: AssetData[]; }; removeAsset: { assetId: string; @@ -96,14 +96,14 @@ export class AssetService { }); } - static async getAssetsByFilter(filterFn: (asset: Asset) => boolean) { + static async getAssetsByFilter(filterFn: (asset: AssetData) => boolean) { return db.transaction('r', db.assets, async () => { const assets = db.assets.filter(filterFn).toArray(); return assets; }); } - static async validateAddAssets(assets: Asset[]) { + static async validateAddAssets(assets: AssetData[]) { // first validate has basic input if (!assets.length) { throw new Error('No assets to add'); @@ -183,7 +183,7 @@ export class AssetService { return { assetsToAdd }; } - static async avoidRepeatedFields(assets: Asset[]) { + static async avoidRepeatedFields(assets: AssetData[]) { const allAssets = await AssetService.getAssets(); const allNameValues = allAssets.map((a) => a.name); const allSymbolValues = allAssets.map((a) => a.symbol); @@ -203,7 +203,7 @@ export class AssetService { return [...assets, { ...asset, name, symbol, isCustom: true }]; }, - Promise.resolve([] as Asset[]) + Promise.resolve([] as AssetData[]) ); return assetsNotRepeated; diff --git a/packages/app/src/systems/CRX/background/services/CommunicationProtocol.ts b/packages/app/src/systems/CRX/background/services/CommunicationProtocol.ts index 479e39a79..a42bd5aa5 100644 --- a/packages/app/src/systems/CRX/background/services/CommunicationProtocol.ts +++ b/packages/app/src/systems/CRX/background/services/CommunicationProtocol.ts @@ -1,4 +1,4 @@ -import { BaseConnection, createUUID } from '@fuel-wallet/sdk'; +import { BaseConnection, createUUID } from '@fuel-wallet/connections'; import type { CommunicationEventArg, CommunicationMessage, diff --git a/packages/app/src/systems/CRX/background/services/DatabaseEvents.ts b/packages/app/src/systems/CRX/background/services/DatabaseEvents.ts index 53ec1f3f0..2e955f46f 100644 --- a/packages/app/src/systems/CRX/background/services/DatabaseEvents.ts +++ b/packages/app/src/systems/CRX/background/services/DatabaseEvents.ts @@ -5,7 +5,6 @@ import type { EventMessageEvents, } from '@fuel-wallet/types'; import { CONTENT_SCRIPT_NAME, MessageTypes } from '@fuel-wallet/types'; -import { AssetService } from '~/systems/Asset/services'; import { ConnectionService } from '~/systems/DApp/services'; import type { CommunicationProtocol } from './CommunicationProtocol'; @@ -13,7 +12,7 @@ import { DatabaseObservable } from './DatabaseObservable'; export class DatabaseEvents { readonly databaseObservable: DatabaseObservable< - ['networks', 'accounts', 'assets', 'connections'] + ['networks', 'accounts', 'connections'] >; readonly communicationProtocol: CommunicationProtocol; @@ -48,10 +47,9 @@ export class DatabaseEvents { origins, this.createEvents([ { - event: 'network', + event: 'currentNetwork', params: [ { - id: updateEvent.obj.id, url: updateEvent.obj.url, }, ], @@ -103,13 +101,6 @@ export class DatabaseEvents { } }); - this.databaseObservable.on( - 'assets:update', - (updateEvent) => updateEvent.obj.isCustom && this.broadcastAssets() - ); - this.databaseObservable.on('assets:delete', () => this.broadcastAssets()); - this.databaseObservable.on('assets:create', () => this.broadcastAssets()); - this.databaseObservable.on('connections:delete', async (updateEvent) => { const deletedConnection = updateEvent.oldObj as Connection; @@ -124,20 +115,4 @@ export class DatabaseEvents { ); }); } - - async broadcastAssets() { - const connections = await ConnectionService.getConnections(); - const origins = connections.map((connection) => connection.origin); - const assets = await AssetService.getAssets(); - - this.communicationProtocol.broadcast( - origins, - this.createEvents([ - { - event: 'assets', - params: [assets], - }, - ]) - ); - } } diff --git a/packages/app/src/systems/CRX/background/services/PopUpService.ts b/packages/app/src/systems/CRX/background/services/PopUpService.ts index 441e55c83..30465ed30 100644 --- a/packages/app/src/systems/CRX/background/services/PopUpService.ts +++ b/packages/app/src/systems/CRX/background/services/PopUpService.ts @@ -1,5 +1,5 @@ -import type { DeferPromise } from '@fuel-wallet/sdk'; import { deferPromise } from '@fuel-wallet/sdk'; +import type { DeferPromise } from '@fuel-wallet/sdk'; import { POPUP_SCRIPT_NAME, MessageTypes } from '@fuel-wallet/types'; import type { ResponseMessage, UIEventMessage } from '@fuel-wallet/types'; import type { JSONRPCRequest } from 'json-rpc-2.0'; @@ -83,7 +83,7 @@ export class PopUpService { } onUIEvent = (message: UIEventMessage) => { - if (this.session === message.session && message.ready) { + if (this.session === message.session && message.ready && message.sender) { const tab = getTabFromSender(message.sender); this.tab = tab!; this.tabId = tab!.id!; diff --git a/packages/app/src/systems/CRX/background/services/types.ts b/packages/app/src/systems/CRX/background/services/types.ts index ce4100840..6b7b171cf 100644 --- a/packages/app/src/systems/CRX/background/services/types.ts +++ b/packages/app/src/systems/CRX/background/services/types.ts @@ -1,8 +1,8 @@ import type { AbiMap, - Asset, + AssetData, FuelProviderConfig, - Network, + NetworkData, } from '@fuel-wallet/types'; export type MessageInputs = { @@ -21,11 +21,8 @@ export type MessageInputs = { provider: FuelProviderConfig; transaction: string; }; - addAsset: { - asset: Asset; - }; addAssets: { - assets: Asset[]; + assets: AssetData[]; origin: string; title?: string; favIconUrl?: string; @@ -43,7 +40,7 @@ export type MessageInputs = { contractId: string; }; addNetwork: { - network: Network; + network: NetworkData; origin: string; title?: string; favIconUrl?: string; diff --git a/packages/app/src/systems/CRX/scripts/contentScript.ts b/packages/app/src/systems/CRX/scripts/contentScript.ts index 79cd7a9e6..ff6736d4d 100644 --- a/packages/app/src/systems/CRX/scripts/contentScript.ts +++ b/packages/app/src/systems/CRX/scripts/contentScript.ts @@ -1,17 +1,4 @@ -import { ContentProxyConnection } from '@fuel-wallet/sdk'; +import { ContentProxyConnection } from '@fuel-wallet/connections'; import { WALLET_NAME } from '~/config'; -import fileName from './pageScript?script&module'; - ContentProxyConnection.start(WALLET_NAME); - -async function main() { - const script = document.createElement('script'); - script.src = chrome.runtime.getURL(fileName); - script.type = 'module'; - script.onload = () => { - script.remove(); - }; - (document.head || document.documentElement).appendChild(script); -} -main(); diff --git a/packages/app/src/systems/CRX/scripts/pageScript.ts b/packages/app/src/systems/CRX/scripts/pageScript.ts deleted file mode 100644 index 20f715462..000000000 --- a/packages/app/src/systems/CRX/scripts/pageScript.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { createConnector } from '@fuel-wallet/sdk'; -import { WALLET_NAME } from '~/config'; - -createConnector({ name: WALLET_NAME }); diff --git a/packages/app/src/systems/CRX/utils/utils.ts b/packages/app/src/systems/CRX/utils/utils.ts index 9551d6ee2..90d7b7ebb 100644 --- a/packages/app/src/systems/CRX/utils/utils.ts +++ b/packages/app/src/systems/CRX/utils/utils.ts @@ -1,13 +1,15 @@ +import type { MessageSender } from '@fuel-wallet/types'; + export function getTabIdFromPort(port: chrome.runtime.Port) { return port.sender?.tab?.id; } -export function getTabIdFromSender(sender: chrome.runtime.Port['sender']) { +export function getTabIdFromSender(sender: MessageSender) { return sender?.tab?.id; } -export function getTabFromSender(sender: chrome.runtime.Port['sender']) { - return sender?.tab; +export function getTabFromSender(sender: MessageSender) { + return sender?.tab as chrome.tabs.Tab; } export function getTabFromPort(port: chrome.runtime.Port) { diff --git a/packages/app/src/systems/Core/utils/assets.tsx b/packages/app/src/systems/Core/utils/assets.tsx index ca716491c..61ad0a9ea 100644 --- a/packages/app/src/systems/Core/utils/assets.tsx +++ b/packages/app/src/systems/Core/utils/assets.tsx @@ -1,10 +1,13 @@ -import type { AssetFuel } from '@fuels/assets'; -import assets, { getAssetFuel } from '@fuels/assets'; +import type { Fuel } from '@fuels/assets'; +import assets from '@fuels/assets'; -export const fuelAssets = assets.reduce((arr, asset) => { - const fuelAsset = getAssetFuel(asset); - if (fuelAsset) { - arr.push(fuelAsset); - } - return arr; -}, [] as AssetFuel[]); +export const fuelAssets = assets.map((asset) => { + const fuelNetworkAsset = asset.networks.find( + (n) => n.type === 'fuel' + ) as Fuel; + return { + ...asset, + assetId: fuelNetworkAsset.assetId, + decimals: fuelNetworkAsset.decimals, + }; +}); diff --git a/packages/app/src/systems/Core/utils/database.ts b/packages/app/src/systems/Core/utils/database.ts index da10d860a..76a968e50 100644 --- a/packages/app/src/systems/Core/utils/database.ts +++ b/packages/app/src/systems/Core/utils/database.ts @@ -1,10 +1,10 @@ -import { createUUID } from '@fuel-wallet/sdk'; +import { createUUID } from '@fuel-wallet/connections'; import type { Account, Vault, Connection, - Network, - Asset, + NetworkData, + AssetData, AbiTable, FuelWalletError, } from '@fuel-wallet/types'; @@ -17,10 +17,10 @@ import type { Transaction } from '~/systems/Transaction/types'; export class FuelDB extends Dexie { vaults!: Table; accounts!: Table; - networks!: Table; + networks!: Table; connections!: Table; transactions!: Table; - assets!: Table; + assets!: Table; abis!: Table; errors!: Table; diff --git a/packages/app/src/systems/DApp/machines/addAssetRequestMachine.tsx b/packages/app/src/systems/DApp/machines/addAssetRequestMachine.tsx index 0520ec656..be70e73be 100644 --- a/packages/app/src/systems/DApp/machines/addAssetRequestMachine.tsx +++ b/packages/app/src/systems/DApp/machines/addAssetRequestMachine.tsx @@ -1,4 +1,4 @@ -import type { Asset } from '@fuel-wallet/types'; +import type { AssetData } from '@fuel-wallet/types'; import type { InterpreterFrom, StateFrom } from 'xstate'; import { assign, createMachine } from 'xstate'; import type { AssetInputs } from '~/systems/Asset'; @@ -6,7 +6,7 @@ import { AssetService } from '~/systems/Asset'; import { assignErrorMessage, FetchMachine } from '~/systems/Core'; type MachineContext = { - assets?: Asset[]; + assets?: AssetData[]; origin?: string; title?: string; favIconUrl?: string; @@ -18,14 +18,14 @@ type MachineServices = { data: boolean; }; filterAssets: { - data: Asset[]; + data: AssetData[]; }; }; export type AddAssetInputs = { start: { origin: string; - assets: Asset[]; + assets: AssetData[]; favIconUrl?: string; title?: string; }; diff --git a/packages/app/src/systems/DApp/machines/addNetworkRequestMachine.tsx b/packages/app/src/systems/DApp/machines/addNetworkRequestMachine.tsx index 2e2f28622..89f31f569 100644 --- a/packages/app/src/systems/DApp/machines/addNetworkRequestMachine.tsx +++ b/packages/app/src/systems/DApp/machines/addNetworkRequestMachine.tsx @@ -1,4 +1,4 @@ -import type { Network } from '@fuel-wallet/types'; +import type { NetworkData } from '@fuel-wallet/types'; import type { InterpreterFrom, StateFrom } from 'xstate'; import { assign, createMachine } from 'xstate'; import { assignErrorMessage, FetchMachine } from '~/systems/Core'; @@ -7,7 +7,7 @@ import { NetworkService } from '~/systems/Network'; import { store } from '~/systems/Store'; type MachineContext = { - network?: Network; + network?: NetworkData; origin?: string; title?: string; favIconUrl?: string; @@ -16,14 +16,14 @@ type MachineContext = { type MachineServices = { saveNetwork: { - data: Network; + data: NetworkData; }; }; export type AddNetworkInputs = { start: { origin: string; - network: Network; + network: NetworkData; favIconUrl?: string; title?: string; }; diff --git a/packages/app/src/systems/DApp/methods.ts b/packages/app/src/systems/DApp/methods.ts index d98e203ab..83ddbc905 100644 --- a/packages/app/src/systems/DApp/methods.ts +++ b/packages/app/src/systems/DApp/methods.ts @@ -1,4 +1,4 @@ -import { ExtensionPageConnection } from '@fuel-wallet/sdk'; +import { ExtensionPageConnection } from '@fuel-wallet/connections'; import { transactionRequestify } from 'fuels'; import { IS_CRX } from '~/config'; import { Services, store } from '~/store'; diff --git a/packages/app/src/systems/Error/utils/parseFuelError.ts b/packages/app/src/systems/Error/utils/parseFuelError.ts index 43f71c81c..cd7709047 100644 --- a/packages/app/src/systems/Error/utils/parseFuelError.ts +++ b/packages/app/src/systems/Error/utils/parseFuelError.ts @@ -1,5 +1,5 @@ -import type { FuelWalletError } from '@fuel-wallet/sdk'; -import { createUUID } from '@fuel-wallet/sdk'; +import { createUUID } from '@fuel-wallet/connections'; +import type { FuelWalletError } from '@fuel-wallet/types'; // eslint-disable-next-line @typescript-eslint/no-explicit-any export function parseFuelError(error: any): FuelWalletError { diff --git a/packages/app/src/systems/Network/components/NetworkDropdown/NetworkDropdown.stories.tsx b/packages/app/src/systems/Network/components/NetworkDropdown/NetworkDropdown.stories.tsx index 96d6fb822..58e5a9c50 100644 --- a/packages/app/src/systems/Network/components/NetworkDropdown/NetworkDropdown.stories.tsx +++ b/packages/app/src/systems/Network/components/NetworkDropdown/NetworkDropdown.stories.tsx @@ -1,5 +1,5 @@ import { Box } from '@fuel-ui/react'; -import type { Network } from '@fuel-wallet/types'; +import type { NetworkData } from '@fuel-wallet/types'; import { useState } from 'react'; import { MOCK_NETWORKS } from '../../__mocks__/networks'; @@ -12,7 +12,7 @@ export default { }; export const Usage = () => { - const [network, setNetwork] = useState(() => MOCK_NETWORKS[0]); + const [network, setNetwork] = useState(() => MOCK_NETWORKS[0]); return ( setNetwork(i)} /> diff --git a/packages/app/src/systems/Network/components/NetworkDropdown/NetworkDropdown.tsx b/packages/app/src/systems/Network/components/NetworkDropdown/NetworkDropdown.tsx index ee2da5ab7..f882a4c8f 100644 --- a/packages/app/src/systems/Network/components/NetworkDropdown/NetworkDropdown.tsx +++ b/packages/app/src/systems/Network/components/NetworkDropdown/NetworkDropdown.tsx @@ -1,15 +1,15 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { cssObj } from '@fuel-ui/css'; import { Button } from '@fuel-ui/react'; -import type { Network } from '@fuel-wallet/types'; +import type { NetworkData } from '@fuel-wallet/types'; import { forwardRef } from 'react'; import { NetworkStatus } from '../NetworkItem'; export type NetworkDropdownProps = { - selected?: Network; + selected?: NetworkData; isDisabled?: boolean; - onPress?: (network: Network) => void; + onPress?: (network: NetworkData) => void; }; export const NetworkDropdown = forwardRef( diff --git a/packages/app/src/systems/Network/components/NetworkItem/NetworkItem.tsx b/packages/app/src/systems/Network/components/NetworkItem/NetworkItem.tsx index 46c206481..92a953c71 100644 --- a/packages/app/src/systems/Network/components/NetworkItem/NetworkItem.tsx +++ b/packages/app/src/systems/Network/components/NetworkItem/NetworkItem.tsx @@ -1,12 +1,12 @@ import type { ThemeUtilsCSS } from '@fuel-ui/css'; import { cssObj } from '@fuel-ui/css'; import { Text, CardList, IconButton, Icon, Box } from '@fuel-ui/react'; -import type { Network } from '@fuel-wallet/types'; +import type { NetworkData } from '@fuel-wallet/types'; import { forwardRef } from 'react'; import { NetworkRemoveDialog } from '../NetworkRemoveDialog/NetworkRemoveDialog'; -export function NetworkStatus({ network }: { network: Network }) { +export function NetworkStatus({ network }: { network: NetworkData }) { return ( Promise | void; - onRemove?: (network: Network) => Promise | void; + network: NetworkData; + onPress?: (network: NetworkData) => Promise | void; + onRemove?: (network: NetworkData) => Promise | void; onUpdate?: (id?: string) => Promise | void; }; diff --git a/packages/app/src/systems/Network/components/NetworkList/NetworkList.tsx b/packages/app/src/systems/Network/components/NetworkList/NetworkList.tsx index c5b459700..4f5d9a466 100644 --- a/packages/app/src/systems/Network/components/NetworkList/NetworkList.tsx +++ b/packages/app/src/systems/Network/components/NetworkList/NetworkList.tsx @@ -1,11 +1,11 @@ import { CardList } from '@fuel-ui/react'; -import type { Network } from '@fuel-wallet/types'; +import type { NetworkData } from '@fuel-wallet/types'; import type { NetworkItemProps } from '../NetworkItem'; import { NetworkItem } from '../NetworkItem'; export type NetworkListProps = Omit & { - networks: Network[]; + networks: NetworkData[]; }; export function NetworkList({ networks = [], ...props }: NetworkListProps) { diff --git a/packages/app/src/systems/Network/components/NetworkRemoveDialog/NetworkRemoveDialog.tsx b/packages/app/src/systems/Network/components/NetworkRemoveDialog/NetworkRemoveDialog.tsx index 039562353..3012a0846 100644 --- a/packages/app/src/systems/Network/components/NetworkRemoveDialog/NetworkRemoveDialog.tsx +++ b/packages/app/src/systems/Network/components/NetworkRemoveDialog/NetworkRemoveDialog.tsx @@ -1,11 +1,11 @@ import { AlertDialog, Button } from '@fuel-ui/react'; -import type { Network } from '@fuel-wallet/types'; +import type { NetworkData } from '@fuel-wallet/types'; import type { ReactNode } from 'react'; import { useState } from 'react'; type NetworkRemoveDialogProps = { children: ReactNode; - network: Network; + network: NetworkData; onConfirm: () => void; }; diff --git a/packages/app/src/systems/Network/components/NetworkSelector/NetworkSelector.stories.tsx b/packages/app/src/systems/Network/components/NetworkSelector/NetworkSelector.stories.tsx index 3b577ed6f..462316d03 100644 --- a/packages/app/src/systems/Network/components/NetworkSelector/NetworkSelector.stories.tsx +++ b/packages/app/src/systems/Network/components/NetworkSelector/NetworkSelector.stories.tsx @@ -1,5 +1,5 @@ import { Box } from '@fuel-ui/react'; -import type { Network } from '@fuel-wallet/types'; +import type { NetworkData } from '@fuel-wallet/types'; import { useState } from 'react'; import { MOCK_NETWORKS } from '~/systems/Network/__mocks__/networks'; @@ -12,7 +12,7 @@ export default { }; export const Usage = (args: NetworkSelectorProps) => { - const [network, setNetwork] = useState(() => MOCK_NETWORKS[0]); + const [network, setNetwork] = useState(() => MOCK_NETWORKS[0]); return ( void; + selected: NetworkData; + networks: NetworkData[]; + onSelectNetwork?: (network: NetworkData) => void; }; export function NetworkSelector({ diff --git a/packages/app/src/systems/Network/events.tsx b/packages/app/src/systems/Network/events.tsx index b082f7f61..7224fe5ee 100644 --- a/packages/app/src/systems/Network/events.tsx +++ b/packages/app/src/systems/Network/events.tsx @@ -1,4 +1,4 @@ -import type { Network } from '@fuel-wallet/types'; +import type { NetworkData } from '@fuel-wallet/types'; import type { Store } from '~/store'; import { Services } from '~/store'; @@ -24,13 +24,13 @@ export function networkEvents(store: Store) { input, }); }, - removeNetwork(network: Network) { + removeNetwork(network: NetworkData) { store.send(Services.networks, { type: 'REMOVE_NETWORK', input: { id: network.id! }, }); }, - selectNetwork(network: Network) { + selectNetwork(network: NetworkData) { store.send(Services.networks, { type: 'SELECT_NETWORK', input: { id: network.id! }, diff --git a/packages/app/src/systems/Network/hooks/useNetworks.ts b/packages/app/src/systems/Network/hooks/useNetworks.ts index 52a3ef2e2..398ba2ca5 100644 --- a/packages/app/src/systems/Network/hooks/useNetworks.ts +++ b/packages/app/src/systems/Network/hooks/useNetworks.ts @@ -1,4 +1,4 @@ -import type { Network } from '@fuel-wallet/types'; +import type { NetworkData } from '@fuel-wallet/types'; import { useEffect } from 'react'; import { store, Services } from '~/store'; import { useOverlay } from '~/systems/Overlay'; @@ -17,7 +17,7 @@ const selectors = { }, selectedNetwork: (state: NetworksMachineState) => { const networks = state.context?.networks || []; - return networks.find((n) => n.isSelected) as Network; + return networks.find((n) => n.isSelected) as NetworkData; }, }; diff --git a/packages/app/src/systems/Network/machines/networksMachine.test.ts b/packages/app/src/systems/Network/machines/networksMachine.test.ts index 48b8c0565..15dfe1074 100644 --- a/packages/app/src/systems/Network/machines/networksMachine.test.ts +++ b/packages/app/src/systems/Network/machines/networksMachine.test.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import type { Network } from '@fuel-wallet/types'; +import type { NetworkData } from '@fuel-wallet/types'; import { interpret } from 'xstate'; import { waitFor } from 'xstate/lib/waitFor'; import { expectStateMatch } from '~/systems/Core/__tests__/utils'; @@ -129,7 +129,7 @@ describe('networksMachine', () => { }); describe('update', () => { - let network: Network | undefined; + let network: NetworkData | undefined; let editEv: any; beforeEach(async () => { diff --git a/packages/app/src/systems/Network/machines/networksMachine.ts b/packages/app/src/systems/Network/machines/networksMachine.ts index 3cbddfdb7..718b2fb74 100644 --- a/packages/app/src/systems/Network/machines/networksMachine.ts +++ b/packages/app/src/systems/Network/machines/networksMachine.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/consistent-type-imports */ -import type { Network } from '@fuel-wallet/types'; +import type { NetworkData } from '@fuel-wallet/types'; import { assign, createMachine, InterpreterFrom, StateFrom } from 'xstate'; import { store } from '~/store'; import type { Maybe, FetchResponse } from '~/systems/Core'; @@ -8,30 +8,30 @@ import { FetchMachine } from '~/systems/Core'; import { NetworkInputs, NetworkService } from '../services'; type MachineContext = { - networks?: Network[]; + networks?: NetworkData[]; /** * Used as data on network update */ networkId?: string; - network?: Maybe; + network?: Maybe; error?: unknown; }; type MachineServices = { fetchNetworks: { - data: FetchResponse; + data: FetchResponse; }; addNetwork: { - data: FetchResponse; + data: FetchResponse; }; updateNetwork: { - data: FetchResponse; + data: FetchResponse; }; removeNetwork: { data: FetchResponse; }; selectNetwork: { - data: FetchResponse; + data: FetchResponse; }; }; @@ -190,29 +190,31 @@ export const networksMachine = createMachine( }, }, services: { - fetchNetworks: FetchMachine.create({ + fetchNetworks: FetchMachine.create({ showError: true, async fetch() { const networks = await NetworkService.getNetworks(); return networks; }, }), - addNetwork: FetchMachine.create({ - showError: true, - async fetch({ input }) { - if (!input?.data) { - throw new Error('Invalid network input'); - } - const createdNetwork = await NetworkService.addNetwork(input); - if (!createdNetwork) { - throw new Error('Failed to add network'); - } - return NetworkService.selectNetwork({ id: createdNetwork.id! }); - }, - }), + addNetwork: FetchMachine.create( + { + showError: true, + async fetch({ input }) { + if (!input?.data) { + throw new Error('Invalid network input'); + } + const createdNetwork = await NetworkService.addNetwork(input); + if (!createdNetwork) { + throw new Error('Failed to add network'); + } + return NetworkService.selectNetwork({ id: createdNetwork.id! }); + }, + } + ), updateNetwork: FetchMachine.create< NetworkInputs['updateNetwork'], - Network + NetworkData >({ showError: true, async fetch({ input }) { @@ -244,7 +246,7 @@ export const networksMachine = createMachine( }), selectNetwork: FetchMachine.create< NetworkInputs['selectNetwork'], - Network + NetworkData >({ async fetch({ input }) { if (!input?.id) { diff --git a/packages/app/src/systems/Network/services/network.ts b/packages/app/src/systems/Network/services/network.ts index a7fedd742..9b7491399 100644 --- a/packages/app/src/systems/Network/services/network.ts +++ b/packages/app/src/systems/Network/services/network.ts @@ -1,5 +1,5 @@ -import { createUUID } from '@fuel-wallet/sdk'; -import type { Network } from '@fuel-wallet/types'; +import { createUUID } from '@fuel-wallet/connections'; +import type { NetworkData } from '@fuel-wallet/types'; import { compare } from 'compare-versions'; import { Provider } from 'fuels'; import { MIN_NODE_VERSION } from '~/config'; @@ -22,7 +22,7 @@ export type NetworkInputs = { }; updateNetwork: { id: string; - data: Partial; + data: Partial; }; selectNetwork: { id: string; @@ -61,7 +61,7 @@ export class NetworkService { id: createUUID(), }; const id = await db.networks.add(inputToAdd); - return db.networks.get(id) as Promise; + return db.networks.get(id) as Promise; }); } @@ -115,7 +115,7 @@ export class NetworkService { id: input.id, data: { isSelected: true }, }); - return db.networks.get(input.id) as Promise; + return db.networks.get(input.id) as Promise; }); } diff --git a/packages/app/src/systems/Transaction/components/TxContent/TxContent.tsx b/packages/app/src/systems/Transaction/components/TxContent/TxContent.tsx index 0d62bb756..02d41ade2 100644 --- a/packages/app/src/systems/Transaction/components/TxContent/TxContent.tsx +++ b/packages/app/src/systems/Transaction/components/TxContent/TxContent.tsx @@ -1,5 +1,5 @@ import { Box } from '@fuel-ui/react'; -import type { Asset } from '@fuel-wallet/types'; +import type { AssetData } from '@fuel-wallet/types'; import type { TransactionStatus, TransactionSummary } from 'fuels'; import type { ReactNode } from 'react'; import type { Maybe } from '~/systems/Core'; @@ -26,7 +26,7 @@ type TxContentInfoProps = { tx?: Maybe; txStatus?: Maybe; showDetails?: boolean; - assets?: Maybe; + assets?: Maybe; isLoading?: boolean; }; diff --git a/packages/app/src/systems/Transaction/components/TxHeader/TxHeader.test.tsx b/packages/app/src/systems/Transaction/components/TxHeader/TxHeader.test.tsx index 0ac86bc04..c45072246 100644 --- a/packages/app/src/systems/Transaction/components/TxHeader/TxHeader.test.tsx +++ b/packages/app/src/systems/Transaction/components/TxHeader/TxHeader.test.tsx @@ -1,5 +1,4 @@ import { render, testA11y, screen, act, fireEvent } from '@fuel-ui/test-utils'; -import { BLOCK_EXPLORER_URL } from '@fuel-wallet/sdk'; import { TransactionStatus } from 'fuels'; import { @@ -83,7 +82,7 @@ describe('TxHeader', () => { await act(() => fireEvent.click(btn)); expect(await navigator.clipboard.readText()).toBe( - `${BLOCK_EXPLORER_URL}transaction/${ + `https://fuellabs.github.io/block-explorer-v2/transaction/${ MOCK_TRANSACTION_CREATE.id }?providerUrl=${encodeURIComponent( process.env.VITE_FUEL_PROVIDER_URL || '' diff --git a/packages/app/src/systems/Transaction/components/TxLink/TxLink.tsx b/packages/app/src/systems/Transaction/components/TxLink/TxLink.tsx index 2d46b7fd1..ac4c73981 100644 --- a/packages/app/src/systems/Transaction/components/TxLink/TxLink.tsx +++ b/packages/app/src/systems/Transaction/components/TxLink/TxLink.tsx @@ -1,6 +1,6 @@ import { cssObj } from '@fuel-ui/css'; import { Link } from '@fuel-ui/react'; -import { getBlockExplorerLink } from '@fuel-wallet/sdk'; +import { buildBlockExplorerUrl } from 'fuels'; export type TxLinkProps = { txHash?: string; @@ -12,8 +12,8 @@ export function TxLink({ txHash, providerUrl }: TxLinkProps) { diff --git a/packages/app/src/systems/Transaction/components/TxOperation/TxOperation.tsx b/packages/app/src/systems/Transaction/components/TxOperation/TxOperation.tsx index ee26693da..4b86190bf 100644 --- a/packages/app/src/systems/Transaction/components/TxOperation/TxOperation.tsx +++ b/packages/app/src/systems/Transaction/components/TxOperation/TxOperation.tsx @@ -1,6 +1,6 @@ import { cssObj } from '@fuel-ui/css'; import { Card } from '@fuel-ui/react'; -import type { Asset } from '@fuel-wallet/types'; +import type { AssetData } from '@fuel-wallet/types'; import type { Operation, TransactionStatus } from 'fuels'; import { AssetsAmount } from '~/systems/Asset'; import type { Maybe } from '~/systems/Core'; @@ -11,7 +11,7 @@ import { TxFromTo } from '../TxFromTo/TxFromTo'; export type TxOperationProps = { operation?: Operation; status?: Maybe; - assets?: Maybe; + assets?: Maybe; isLoading?: boolean; }; diff --git a/packages/app/src/systems/Transaction/components/TxOperations/TxOperations.tsx b/packages/app/src/systems/Transaction/components/TxOperations/TxOperations.tsx index c6962ff64..04384f616 100644 --- a/packages/app/src/systems/Transaction/components/TxOperations/TxOperations.tsx +++ b/packages/app/src/systems/Transaction/components/TxOperations/TxOperations.tsx @@ -1,5 +1,5 @@ import { Box } from '@fuel-ui/react'; -import type { Asset } from '@fuel-wallet/types'; +import type { AssetData } from '@fuel-wallet/types'; import type { Operation, TransactionStatus } from 'fuels'; import type { Maybe } from '~/systems/Core'; @@ -8,7 +8,7 @@ import { TxOperation } from '../TxOperation/TxOperation'; export type TxOperationsProps = { operations?: Operation[]; status?: Maybe; - assets?: Maybe; + assets?: Maybe; isLoading?: boolean; }; diff --git a/packages/app/src/systems/Transaction/components/TxStatusAlert/TxStatusAlert.tsx b/packages/app/src/systems/Transaction/components/TxStatusAlert/TxStatusAlert.tsx index 6550cf47d..833bc8d1f 100644 --- a/packages/app/src/systems/Transaction/components/TxStatusAlert/TxStatusAlert.tsx +++ b/packages/app/src/systems/Transaction/components/TxStatusAlert/TxStatusAlert.tsx @@ -1,7 +1,6 @@ import { cssObj } from '@fuel-ui/css'; import { Alert, Link } from '@fuel-ui/react'; -import { getBlockExplorerLink } from '@fuel-wallet/sdk'; -import { TransactionStatus } from 'fuels'; +import { TransactionStatus, buildBlockExplorerUrl } from 'fuels'; import type { FC } from 'react'; import { useMemo } from 'react'; @@ -50,8 +49,8 @@ export const TxStatusAlert: FC = ({ aria-label="View Transaction on Block Explorer" isExternal css={{ ...styles.link, color: `$${txColor}` }} - href={getBlockExplorerLink({ - path: `transaction/${txId}`, + href={buildBlockExplorerUrl({ + txId, providerUrl, })} > diff --git a/packages/app/src/systems/Transaction/hooks/useExplorerLink.tsx b/packages/app/src/systems/Transaction/hooks/useExplorerLink.tsx index 1bd960c81..ea20c9ec3 100644 --- a/packages/app/src/systems/Transaction/hooks/useExplorerLink.tsx +++ b/packages/app/src/systems/Transaction/hooks/useExplorerLink.tsx @@ -1,11 +1,11 @@ -import { getBlockExplorerLink } from '@fuel-wallet/sdk'; +import { buildBlockExplorerUrl } from 'fuels'; import { useCallback } from 'react'; import { IS_CRX } from '~/config'; import { openTab } from '~/systems/CRX/utils'; export function useExplorerLink(providerUrl: string, id?: string) { - const href = getBlockExplorerLink({ - path: `transaction/${id || ''}`, + const href = buildBlockExplorerUrl({ + txId: id, providerUrl, }); diff --git a/packages/app/src/systems/Transaction/services/transaction.tsx b/packages/app/src/systems/Transaction/services/transaction.tsx index 11ad2302e..ce501eecc 100644 --- a/packages/app/src/systems/Transaction/services/transaction.tsx +++ b/packages/app/src/systems/Transaction/services/transaction.tsx @@ -1,5 +1,4 @@ -import { getGasConfig } from '@fuel-wallet/sdk'; -import type { Account, Asset } from '@fuel-wallet/types'; +import type { Account, AssetData } from '@fuel-wallet/types'; import type { GetTransactionSummaryFromRequestParams, TransactionRequest, @@ -90,7 +89,7 @@ export type TxInputs = { isValidTransaction: { address?: string; account?: Account; - asset?: Asset; + asset?: AssetData; amount?: BN; fee?: BN; }; @@ -238,7 +237,7 @@ export class TxService { } static async createTransfer(input: TxInputs['createTransfer']) { - const { gasPrice } = await getGasConfig(input.provider); + const { minGasPrice: gasPrice } = await input.provider.getGasConfig(); // Because gasLimit is caulculated on the number of operations we can // safely assume that a transfer will consume at max 20 units, this should // be change once we add multiple transfers in a single transaction. diff --git a/packages/app/tsconfig.json b/packages/app/tsconfig.json index 7095057d8..e97928921 100644 --- a/packages/app/tsconfig.json +++ b/packages/app/tsconfig.json @@ -13,6 +13,6 @@ "~/*": ["./src/*"] } }, - "include": ["./src"], + "include": ["./src", "./connect"], "references": [{ "path": "./tsconfig.node.json" }] } diff --git a/packages/app/tsconfig.node.json b/packages/app/tsconfig.node.json index cc6c228d8..d1c117107 100644 --- a/packages/app/tsconfig.node.json +++ b/packages/app/tsconfig.node.json @@ -5,8 +5,7 @@ "module": "ESNext", "moduleResolution": "Node", "allowSyntheticDefaultImports": true, - "resolveJsonModule": true, - "types": ["@fuel-wallet/sdk/dist"] + "resolveJsonModule": true }, "include": [ "load.envs.js", diff --git a/packages/sdk-v2/package.json b/packages/connections/package.json similarity index 66% rename from packages/sdk-v2/package.json rename to packages/connections/package.json index e895fd57d..994576ab1 100644 --- a/packages/sdk-v2/package.json +++ b/packages/connections/package.json @@ -1,8 +1,7 @@ { - "name": "@fuel-wallet/sdk-v2", - "private": true, - "description": "Integrate DApps with Fuel Network compatible Wallets.", - "version": "0.13.5", + "name": "@fuel-wallet/connections", + "description": "Fuel Wallet Connections for CRX.", + "version": "0.13.8", "license": "Apache-2.0", "main": "src/index.ts", "publishConfig": { @@ -24,17 +23,22 @@ ], "scripts": { "build": "pnpm ts:check && tsup", - "ts:check": "tsc --noEmit", - "test": "jest --verbose" + "ts:check": "tsc --noEmit" }, "dependencies": { + "@fuel-wallet/sdk": "workspace:*", + "@fuel-wallet/types": "workspace:*", "@fuels/assets": "0.0.11", - "events": "^3.3.0" + "@types/chrome": "^0.0.246", + "events": "^3.3.0", + "json-rpc-2.0": "^1.6.0", + "uuid": "^9.0.1" }, "peerDependencies": { "fuels": ">=0.71.1" }, "devDependencies": { + "@types/uuid": "^9.0.5", "@fuel-ts/wallet": "0.71.1", "fuels": "0.71.1", "jest-environment-jsdom": "29.6.2", diff --git a/packages/sdk/src/connections/BaseConnection.ts b/packages/connections/src/BaseConnection.ts similarity index 95% rename from packages/sdk/src/connections/BaseConnection.ts rename to packages/connections/src/BaseConnection.ts index cbc31f66b..7cbe64bea 100644 --- a/packages/sdk/src/connections/BaseConnection.ts +++ b/packages/connections/src/BaseConnection.ts @@ -12,8 +12,8 @@ import EventEmitter from 'events'; import type { JSONRPCRequest, JSONRPCResponse } from 'json-rpc-2.0'; import { JSONRPCServer, JSONRPCClient } from 'json-rpc-2.0'; -import { MAX_EVENT_LISTENERS } from '../config'; -import { createUUID } from '../utils/createUUID'; +import { MAX_EVENT_LISTENERS } from './config'; +import { createUUID } from './utils/createUUID'; export class BaseConnection extends EventEmitter { readonly client: JSONRPCClient; diff --git a/packages/sdk/src/connections/ContentProxyConnection.ts b/packages/connections/src/ContentProxyConnection.ts similarity index 79% rename from packages/sdk/src/connections/ContentProxyConnection.ts rename to packages/connections/src/ContentProxyConnection.ts index 6cdc711dc..af2d7a1c4 100644 --- a/packages/sdk/src/connections/ContentProxyConnection.ts +++ b/packages/connections/src/ContentProxyConnection.ts @@ -1,6 +1,7 @@ /* eslint-disable no-console */ import { BACKGROUND_SCRIPT_NAME, + CONNECTOR_SCRIPT, CONTENT_SCRIPT_NAME, EVENT_MESSAGE, MessageTypes, @@ -9,11 +10,11 @@ import type { CommunicationMessage } from '@fuel-wallet/types'; import { createJSONRPCSuccessResponse } from 'json-rpc-2.0'; import type { JSONRPCID } from 'json-rpc-2.0'; -import { PING_TIMEOUT, RECONNECT_TIMEOUT } from '../config'; +import { PING_TIMEOUT, RECONNECT_TIMEOUT } from './config'; export class ContentProxyConnection { connection: chrome.runtime.Port; - _tryReconect?: NodeJS.Timeout; + _tryReconnect?: NodeJS.Timeout; _keepAlive?: NodeJS.Timeout; readonly connectorName: string; @@ -22,6 +23,28 @@ export class ContentProxyConnection { this.connectorName = connectorName; window.addEventListener(EVENT_MESSAGE, this.onMessageFromWindow); this.keepAlive(); + this.onStartEvent(); + } + + /** + * Sends a start event to the connector script + * to notify that the extension is available. + * + * This is useful to notify once a extension is installed + * or if the service is restarted. + */ + onStartEvent() { + this.postMessage({ + type: MessageTypes.event, + target: CONNECTOR_SCRIPT, + connectorName: this.connectorName, + events: [ + { + event: 'start', + params: [], + }, + ], + }); } connect() { @@ -35,25 +58,25 @@ export class ContentProxyConnection { destroy() { this.connection.disconnect(); - clearInterval(this._tryReconect); + clearInterval(this._tryReconnect); clearTimeout(this._keepAlive); } onDisconnect = () => { - clearInterval(this._tryReconect); - this._tryReconect = setInterval(() => { + clearInterval(this._tryReconnect); + this._tryReconnect = setInterval(() => { console.debug('[FUEL WALLET] reconnecting!'); try { this.connection = this.connect(); console.debug('[FUEL WALLET] reconnected!'); - clearInterval(this._tryReconect); + clearInterval(this._tryReconnect); // If fails it will try to reconnect // It should not throw an error to avoid - // uncessary error reporting as it is expected + // unnecessary error reporting as it is expected // to fail if background script is not available. } catch (err: unknown) { if ((err as Error).message === 'Extension context invalidated.') { - clearInterval(this._tryReconect); + clearInterval(this._tryReconnect); console.debug('[FUEL WALLET] context invalidated!'); } } @@ -125,7 +148,8 @@ export class ContentProxyConnection { postMessage(message: CommunicationMessage) { const postMessage = { ...message, - target: this.connectorName, + target: CONNECTOR_SCRIPT, + connectorName: this.connectorName, }; window.postMessage(postMessage, window.location.origin); } diff --git a/packages/sdk/src/connections/ExtensionPageConnection.ts b/packages/connections/src/ExtensionPageConnection.ts similarity index 100% rename from packages/sdk/src/connections/ExtensionPageConnection.ts rename to packages/connections/src/ExtensionPageConnection.ts diff --git a/packages/sdk/src/config.ts b/packages/connections/src/config.ts similarity index 100% rename from packages/sdk/src/config.ts rename to packages/connections/src/config.ts diff --git a/packages/sdk/src/connections/index.ts b/packages/connections/src/index.ts similarity index 76% rename from packages/sdk/src/connections/index.ts rename to packages/connections/src/index.ts index 08929172c..eedb93bab 100644 --- a/packages/sdk/src/connections/index.ts +++ b/packages/connections/src/index.ts @@ -1,4 +1,4 @@ -export * from './ContentProxyConnection'; export * from './BaseConnection'; -export * from './WindowConnection'; +export * from './ContentProxyConnection'; export * from './ExtensionPageConnection'; +export * from './utils'; diff --git a/packages/sdk/src/utils/createUUID.ts b/packages/connections/src/utils/createUUID.ts similarity index 100% rename from packages/sdk/src/utils/createUUID.ts rename to packages/connections/src/utils/createUUID.ts diff --git a/packages/sdk/src/utils/hasWindow.ts b/packages/connections/src/utils/hasWindow.ts similarity index 100% rename from packages/sdk/src/utils/hasWindow.ts rename to packages/connections/src/utils/hasWindow.ts diff --git a/packages/connections/src/utils/index.ts b/packages/connections/src/utils/index.ts new file mode 100644 index 000000000..849a884c7 --- /dev/null +++ b/packages/connections/src/utils/index.ts @@ -0,0 +1,4 @@ +export * from './createUUID'; +export * from './hasWindow'; +export * from './promise'; +export * from './provider'; diff --git a/packages/sdk-v2/src/utils/promise.ts b/packages/connections/src/utils/promise.ts similarity index 57% rename from packages/sdk-v2/src/utils/promise.ts rename to packages/connections/src/utils/promise.ts index b0a39d195..dd3789300 100644 --- a/packages/sdk-v2/src/utils/promise.ts +++ b/packages/connections/src/utils/promise.ts @@ -15,15 +15,3 @@ export function deferPromise() { return defer; } - -export function withTimeout>( - promise: F, - timeout: number = 1050 -) { - const timeoutPromise = new Promise((_, reject) => { - setTimeout(() => { - reject(new Error('Promise timed out')); - }, timeout); - }); - return Promise.race([timeoutPromise, promise]) as F; -} diff --git a/packages/sdk/src/utils/provider.ts b/packages/connections/src/utils/provider.ts similarity index 100% rename from packages/sdk/src/utils/provider.ts rename to packages/connections/src/utils/provider.ts diff --git a/packages/sdk-v2/tsconfig.json b/packages/connections/tsconfig.json similarity index 100% rename from packages/sdk-v2/tsconfig.json rename to packages/connections/tsconfig.json diff --git a/packages/sdk-v2/tsup.config.ts b/packages/connections/tsup.config.ts similarity index 100% rename from packages/sdk-v2/tsup.config.ts rename to packages/connections/tsup.config.ts diff --git a/packages/docs/docs/dev/abis.mdx b/packages/docs/docs/dev/abis.mdx index 38f75a352..d65d888ff 100644 --- a/packages/docs/docs/dev/abis.mdx +++ b/packages/docs/docs/dev/abis.mdx @@ -5,18 +5,18 @@ category: For Developers # ABIs -## Get ABI of contract ID +## Adding ABI -To get the ABI of a contract ID use the `getAbi('contractId')` method on the `window.fuel` object. +To add an ABI, use the `addABI()` method. - + - + -## Adding ABI +## Get ABI of contract ID -To add an ABI, use the `wallet.addAbi` method and pass in the `AbiMap` you want to add. +To retrieve the ABI of a contract, use the `getAbi()` method. - + - + diff --git a/packages/docs/docs/dev/accounts.mdx b/packages/docs/docs/dev/accounts.mdx index 318ca6319..f699ba049 100644 --- a/packages/docs/docs/dev/accounts.mdx +++ b/packages/docs/docs/dev/accounts.mdx @@ -7,48 +7,64 @@ category: For Developers ## List user accounts -Once the connection is authorized, you can list the user accounts using `window.fuel.accounts()`. +Once the connection is authorized, you can list all the user accounts using `accounts()`. - + -### Listening to Account Changes +### Watch Account Changes -To listen to account events, you can use the `fuel.events.accounts` event. +To watch account events, you can use the `accounts` event. - + ## Get Current Account -You can also get the current account being used in the wallet using `window.fuel.currentAccount()`. +You can also get the current account being used in the wallet using `currentAccount()`. +If the return is `null` this means that the current account selected by the user is not connected. - + -### Listening to Current Account Changes +### Watch Current Account Changes -To listen to current account events, you can use the `fuel.events.currentAccount` event. +To monitor events related to the current account, utilize the `currentAccount` event. Receiving a `null` value from this event indicates that the user's currently selected account is not connected. +If the event receive a `null` value this means that the current account selected by the user is not connected. - + ## With React You can keep track of the current account when using React using the `useAccount` hook as shown below: -```tsx -import { useAccount } from '@fuel-wallet/react'; -// ... -const { accountAddress } = useAccount(); -console.log('Current Account ', currentAccount); -// Current Account fuel1r20zhd... -``` +### All Connected Accounts + + + + +### Current Account + + + diff --git a/packages/docs/docs/dev/assets.mdx b/packages/docs/docs/dev/assets.mdx index c1c6579eb..1c01cab99 100644 --- a/packages/docs/docs/dev/assets.mdx +++ b/packages/docs/docs/dev/assets.mdx @@ -7,51 +7,59 @@ category: For Developers ## Transferring assets -To transfer an amount to other address, use the `wallet.transfer` method and pass in the address you want to send to and the amount to send. +To transfer a specific amount to another address, use the `wallet.transfer()` method. - - - + + ## List Assets in the Wallet -You can list the assets in the wallet using `window.fuel.assets()`. - - +You can list the assets added in the wallet by using the `assets()` method. + ## Adding custom Assets -To add custom Assets, use the `wallet.addAssets` method and pass in the `Asset[]` you want to add. - - +To add custom assets, use the `useAssets()` method to add a single asset, or the `addAssets()` method to add multiple assets. + -## Listening to Asset Events +## With React + +### Transferring assets -To listen to asset events, you can use the `fuel.events.assets` event. +To transfer an amount to other address, use the `wallet.transfer()` method and pass in the address you want to send to and the amount to send as well as the assetId. - + -## With React +### List Assets + +You can keep track of the assets in the users wallet by using the hook `useAssets()`. + + + -In a React app you can use the `useAccount` hook as shown below to check the account balance for a specific asset. +### Add assets -```tsx -import { useAccount } from '@fuel-wallet/react'; -// ... -const { accountAddress } = useAccount(); +You can keep track of the assets in the users wallet by using the hook `useAddAssets()`. -const { balance } = useBalance({ - address: accountAddress, - assetId: '0x000000000...', -}); -console.log(balance); -// 0004990000 -``` + + diff --git a/packages/docs/docs/dev/connecting.mdx b/packages/docs/docs/dev/connecting.mdx index d56ca5260..8ce735161 100644 --- a/packages/docs/docs/dev/connecting.mdx +++ b/packages/docs/docs/dev/connecting.mdx @@ -5,62 +5,95 @@ category: For Developers # Connecting -## Requesting a Connection +## Checking if a Connector is available + +Before performing other actions, the Application should check whether the user has a Wallet installed. While this is not required, it is good practice to ensure a better user experience. + + -Before interacting with the wallet, you need to request a connection, which will authorize your application to execute other actions. You can do this by calling the `connect()` method on the `window.fuel` object. +As a user installs a wallet, you can listen for changes on the status of the `currentConnector`. - + -To disconnect, use the `disconnect()` method. + - +You can learn more about connectors and how they work to allow multiple wallet's [here](https://github.com/FuelLabs/fuels-wallet/wiki/Fuel-Wallet-Connectors) + +## Requesting a Connection + +Before any user actions begin, the user must authorize the connection by calling the `connect()` method. This will initiate the connection flow in the user's Wallet, particularly if the user has more accounts than what is currently available to the connection. + + -## Checking for a Connection +## Checking connection state To check if the user's wallet is already connected, you can use the `isConnected()` method. - + + + + +## Watching connection state - +Since a user can add or remove a connection directly inside the wallet, we also recommend that your application listens for connection state changes using the event listener. + + -## Listening to Connection Events +## Removing connection -The `connect()` method returns a promise. If you prefer to do it in an async way, you can use `fuel.on('connection', () => void)` to -listen for changes in the connection. +In some cases, an application may want to provide an experience for the user to remove the connection. In these cases, you can use the `disconnect()` method. - + -## With React +## Using React Hooks -In a React app, you can use the `useIsConnected` hook below to check if the user's wallet is connected. +### Requesting a Connection -```ts -import { useIsConnected } from '@fuel-wallet/react'; -// ... -const { isConnected } = useIsConnected(); -``` +In React applications, you can leverage our ready to use hooks, which include event tracking. -You can import the `useConnect` hook to access the `connect` function and request a connection. + -```tsx -import { useConnect } from '@fuel-wallet/react'; -// ... -const { connect } = useConnect(); -await connect(); -``` + -To disconnect, use the `useDisconnect()` hook. +### Removing connection -```tsx -import { useDisconnect } from '@fuel-wallet/react'; -// ... -const { disconnect } = useDisconnect(); -await disconnect(); -``` + + + + +### Checking connection state + +All hooks implement validations to ensure that the state is synchronized, using the methods and events available from the SDK. + + diff --git a/packages/docs/docs/dev/connectors.mdx b/packages/docs/docs/dev/connectors.mdx index 7e4d57c56..b50dbd3ee 100644 --- a/packages/docs/docs/dev/connectors.mdx +++ b/packages/docs/docs/dev/connectors.mdx @@ -3,78 +3,71 @@ title: Wallet Connectors category: For Developers --- -# Wallet Connectors +# Fuel Wallet Connectors -A wallet connector is an interface to integrate with third-party wallets on the Fuel Ecosystem. It exposes all currently installed wallets in a unified manner -via `window.fuel`. +Fuel Wallet Connectors are an interface provided by wallet developers to allow your DApp to integrate with specific wallets. - +You can learn more about how Fuel Wallet Connectors work, by reading the [Fuel Wallet Connectors](https://github.com/FuelLabs/fuels-wallet/wiki/Fuel-Wallet-Connectors) spec. -## Methods +## Setup Fuel Wallet Connectors -### Listing connectors - -To list all available connectors you can use the `listConnectors()` method. +The Fuel Wallet SDK enables you to include a set of connectors when creating a new instance. If you don't provide any connectors, the SDK will default to using the `FuelWalletConnector()` and `FueletWalletConnector()` methods. -### Selecting connector +## Listing Connectors + +When working with multiple connectors, you should enable users to select the connectors they wish to use for interacting with your DApp. Once the `connectors()` method is called, the Fuel Wallet SDK will query information from the connectors, allowing you to determine which connectors are installed. -To select a different wallet connector use the `selectConnector(connectorName: string)` method. +We also recommend to use the `connectors` listener on places that will use the `connectors()` method as the availability can change. + -## Events +## Selecting Connector -### `CurrentConnector` - -This event is triggered when the current connector is updated. The callback function receives the `FuelWalletConnector` object. +Once you have a list of connectors, you can enable the user to select the connector they wish to use by using the `selectConnect()` method. If the connector is not installed, the SDK will return false. -### Connectors +### Interacting with the selected connector -This event is triggered when the connectors list is updated. The callback function receives the list of connectors, `Array`. +Once you have selected a connector, you can interact with it using all the available methods. -## For Wallet Developers - -Third-party wallets developed by the community can use the wallet connector to integrate with the current `fuel` instance on the window, enabling a better experience for -developers and users. + -### Creating a Wallet Connector +## With React -Inside `pageScript.ts` you can call the method `createConnector` instead of creating a new object on the window. This method will add your connector to the current, -`window.fuel` element. +### Connectors UI -```ts -import { createConnector } from '@fuel-wallet/sdk'; +When using a React application, you can utilize the Connectors UI provided by the React package. -createConnector({ name: 'Wallet Name' }); -``` + -If you are using our Communication SDK [Content Page Script](https://developer.chrome.com/docs/extensions/mv3/content_scripts/) import `ContentProxyConnection` and pass the name of wallet extension. +You can see the full a DApp example on the [examples](https://github.com/FuelLabs/fuels-wallet/tree/master/examples) folder. -> Otherwise, remember to filter events by the ones that have your wallet connector name as the target. +### Only hooks -```ts -import { ContentProxyConnection } from '@fuel-wallet/sdk'; +If you prefer to build your own UI for the connectors you achieve the experience using +the hooks `useConnect()` and `useConnectors()`. -// Start the content page script with the current Wallet Name -ContentProxyConnection.start('Wallet Name'); + -// ...pageScript.ts logic for page script injection -``` + diff --git a/packages/docs/docs/dev/getting-started.mdx b/packages/docs/docs/dev/getting-started.mdx index 624b98e69..5be7329ef 100644 --- a/packages/docs/docs/dev/getting-started.mdx +++ b/packages/docs/docs/dev/getting-started.mdx @@ -5,108 +5,50 @@ category: For Developers # Getting Started -You can integrate your DApp seamlessly with Fuel Wallet using our simple API, which is injected directly into the browser window. -This eliminates the need for additional dependencies, allowing you to perform key actions effortlessly. -For even more powerful and customizable integration, use Fuel Wallet in conjunction with the [Fuel TS SDK](https://fuellabs.github.io/fuels-ts/). +The Fuel Wallet SDK serves as a connection manager between your DApp and other wallets compatible with the Fuel Network. This package ensures that you can connect to the Fuel Wallet as well as any other wallet using a unified API. - +If you are using **React** jump to the [React section](./#using-react). -If you've correctly installed the Fuel wallet extension, the wallet SDK will be injected automatically on the `window` object on the property `fuel`. To access it, you can use `window.fuel` +## Installation -```ts -window.fuel.connect(); -``` - -You can try this code directly in the developer console. - -## TypeScript - -The Fuel Wallet SDK provides a package on npm, making it more convenient to use in TypeScript projects. -To use it, you must also install the [`fuels`](https://www.npmjs.com/package/fuels) package as a dependency. - -### Installation - -```bash -npm install fuels @fuel-wallet/sdk -``` - -To install the latest prerelease of `@fuel-wallet/sdk`, use the command: +To begin integrating the Fuel Wallet SDK into your DApp, you first need to install the packages `@fuel-wallet/sdk` and `fuels`. ```bash -npm install fuels @fuel-wallet/sdk@master -``` - -### Usage - -To use the SDK and the React Hooks in your TypeScript project, add the following line to your `tsconfig.json` file: - -```json -{ - "compilerOptions": { - "types": ["@fuel-wallet/sdk"] - } -} -``` - -Alternatively, you can use a [TypeScript reference](https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html) directive in any TypeScript file: - -```ts -/// -``` - -### Example - -#### Window - -With the SDK imported, `fuel` will be conveniently typed and accessible on the `window` object. - -```ts -window.fuel?.connect(); +npm install @fuel-wallet/sdk fuels ``` -#### SDK +The installation also requires the `fuels` SDK, as it is used to communicate with the Fuel Network and provides a set of utilities required for interacting with contracts on the Fuel Network. -Alternatively, you can directly use the SDK by creating a new instance of `Fuel` to interact with the wallet. +## Example ```ts import { Fuel } from '@fuel-wallet/sdk'; const fuel = new Fuel(); + await fuel.connect(); ``` -### Detect when fuel is loaded - -It's possible that your application loads before `window.fuel` is injected. To detect when `fuel` is loaded and ready to use, you can listen to the event `FuelLoaded` on the document. - - - - - ## Using React -Fuel Wallet provides a set of React hooks that improve the developer experience. +Fuel Wallet SDK also provides a set of React hooks and a UI for working with it connectors without, +the need for manually create a UI, for it. ### Installation ```bash -npm install @fuel-wallet/react +npm install @fuel-wallet/react fuels ``` -To install the latest prerelease of `@fuel-wallet/react`, use the command: - -```bash -npm install fuels @fuel-wallet/react@master -``` +### Example -### Usage +#### Setup -Wrap your application with the `FuelProvider` component. +Wrap your application with the provider `FuelConnectProvider`. ```tsx -// index.tsx import { FuelProvider } from '@fuel-wallet/react'; -//... + ReactDOM.createRoot(document.getElementById('root')!).render( @@ -116,11 +58,17 @@ ReactDOM.createRoot(document.getElementById('root')!).render( ); ``` -Here is how you can use the `useFuel` hook in a component to access an instance of `Fuel`: +Alternatively, you can use just the `FuelProvider` if you prefer not to use the provided UI. + +#### Usage ```ts -import { useFuel } from '@fuel-wallet/react'; -// ... -const { fuel } = useFuel(); -await fuel.connect(); +import { useConnectUI } from '@fuel-wallet/react'; +const { connect, isConnecting } = useConnectUI(); + + ``` + +Check our example application for a [quick start](https://github.com/FuelLabs/fuels-wallet/blob/master/examples/cra-app). diff --git a/packages/docs/docs/dev/hooks-reference.mdx b/packages/docs/docs/dev/hooks-reference.mdx index d8cbc6a2c..a7f8278c0 100644 --- a/packages/docs/docs/dev/hooks-reference.mdx +++ b/packages/docs/docs/dev/hooks-reference.mdx @@ -1,5 +1,5 @@ --- -title: React Hooks Reference +title: Hooks Reference category: For Developers --- @@ -27,7 +27,7 @@ console.log(accounts); // [fuel1r20zhd..., fuel1qqluc9..., ...] ``` -{/* TODO add source file after pr is merged and `useAccounts` is in master */} +[See the source file](https://github.com/FuelLabs/fuels-wallet/blob/master/packages/react/src/hooks/useAccounts.tsx) ## `useBalance` diff --git a/packages/docs/docs/dev/networks.mdx b/packages/docs/docs/dev/networks.mdx index dcb51ad54..e73af1393 100644 --- a/packages/docs/docs/dev/networks.mdx +++ b/packages/docs/docs/dev/networks.mdx @@ -5,39 +5,44 @@ category: For Developers # Networks -## Get the Current Network +## Add custom networks -To detect the current network the user's wallet is connected to, use the `network()` method on the `window.fuel` object. +You can add new networks to the user's wallet by calling the `addNetwork()` method. - - - - -## Adding custom Network + + -To add custom Network, use the `wallet.addNetwork` method and pass in the `Network` you want to add. +## Get current network - +To retrieve the current network of the user, you can use the `currentNetwork()` method. - + + -## Listening for Network Changes - -To listen to network events, you can use the `fuel.events.network` event. +## With React - +### Add custom networks -Switch the network in your wallet to see the event triggered. +You can add new networks to the user's wallet by calling the `addNetwork()` method. - + + -## With React +### Current network -In a react app you can use the `useChain` hook as shown below to get information about the current chain. +You can track the current network of the user by using the `currentNetwork()` method. -```tsx -import { useChain } from '@fuel-wallet/react'; -// ... -const { chain } = useChain(); -console.log(chain.name); -``` + + diff --git a/packages/docs/docs/dev/reference.mdx b/packages/docs/docs/dev/reference.mdx index b625ff33b..f9ac588da 100644 --- a/packages/docs/docs/dev/reference.mdx +++ b/packages/docs/docs/dev/reference.mdx @@ -1,273 +1,172 @@ --- -title: Reference +title: API Reference category: For Developers --- # API Reference -## Methods +## Add ABI -### Version +`addAbi(abiMap: AbiMap): Promise`
+Add the ABI to the user's wallet. -`async version(): Promise`
-Return the current version of the Wallet. +## Add Asset - +`addAsset(asset: Asset): Promise`
+Request the user to add metadata for an asset to the wallet. -### Connect +## Add Assets -`async connect(): Promise`
-Request permission to start a connection between the project and the wallet +`addAssets(asset: Asset[]): Promise`
+Request the user to add metadata for multiple assets to the wallet at once. - +## Add Network -### Disconnect +`addNetwork(url: string): Promise`
+Request the user to add a new network. Return true if success or false it fails. -`async disconnect(): Promise`
-Disconnect your project +## Clean - +`clean(): void`
+Clean the storage used by the Fuel SDK, which is utilized to keep track of the selected connector. -### Get connection status +## Connect -`async isConnected(): Promise`
-Return the state of the application connection. - - - -### List Accounts - -`async accounts(): Promise>`
-List accounts in the wallet +`connect(): Promise`
+Request permission to start a connection between the project and the wallet. Return the connection state. - +## Current Account -### Current Account - -`async currentAccount(): Promise`
+`currentAccount(): Promise`
Return the current account being used in the wallet application. +If the account selected is not authorized for the connection, returns null. - - -### List Networks - -`async networks(): Promise>`
-Return the list of networks in the current wallet. +## Current Connector - +`currentConnector(): FuelConnector`
+Return the current selected connector. -### Current Network +## Current Network -`async network(): Promise`
+`currentNetwork(): Promise`
Return the current network being used in the wallet application. - - -### Add Network - -`async addNetwork(network: Network): Promise`
-Add network to the wallet. - - - -### List Assets - -`async assets(): Promise>`
-Return the list of assets in the current wallet. - - - -### Add Asset +## Destroy -`async addAsset(asset: Asset): Promise`
-Add asset to the wallet. +`destroy(): void`
+Removes all listeners and cleans the storage. - +## Disconnect -### Add Assets +`disconnect(): Promise`
+Disconnect your project from the wallet. Return the connection state. -`async addAssets(asset: Asset[]): Promise`
-Add assets to the wallet. - - - -### Get ABI - -`async getAbi(contractId: string): Promise`
-Get ABI of a given `contractId`. +## Events - +Fuel emits events when certain actions occur. These events can be listened to by using the `on` method. -### Has ABI +The events API follows the native Node.js `EventEmitter` enabling, `on`, `once`, and `off`. +The events enum `FuelWalletEvents` can be imported from the `@fuel-wallet/sdk` package. -`async hasAbi(contractId: string): Promise`
-Check if has ABI for a given `contractId`. +### Usage - +The `fuel` object has an `events` property which is an enum of all the events that can be listened to.
+The `on` method takes two arguments, the event name and a callback function. The callback function receives data associated with the event. -### Add ABI +```ts +fuel.on(fuel.events.connection, (connectionState) => { + console.log(connectionState); +}); +``` -`async addAbi(abiMap: AbiMap): Promise`
-Add ABI to the wallet. +### Event Types - +| Event | Trigger | Params | +| ------------------ | ------------------------- | ---------------------- | +| `connectors` | connectors change | `Array` | +| `currentConnector` | current connector change | `FuelConnector` | +| `accounts` | accounts available change | `Array` | +| `currentAccount` | current account change | `string \| null` | +| `connection` | connection state change | `boolean` | +| `currentNetwork` | current network change | `Network` | +| `assets` | assets metadata change | `Array` | -### Request signature message +## Get ABI -`async signMessage(address: string, message: string): Promise`
-Request a message signature for one specific account +`getABI(contractId: string): Promise`
+Return the ABI of the given contractId, or null if not found. - +## Get Connection Status -### Send transaction +`isConnected(): Promise`
+Return the state of the application connection. -`async sendTransaction(transaction: TransactionRequestLike): Promise`
-Send a transaction, this will request the user selected account to review, -sign, and send the transaction. +## Get Connector - +`getConnector(connectorName: string): FuelConnector`
+Return the connector with the given name. -### Get Wallet +## Get Wallet -`getWallet(address: string | AbstractAddress): Promise`
-Return `FuelWalletLocked` using a `FuelWalletProvider` on the connection point to request signed actions. +`getWallet(address: string | AbstractAddress, provider?: FuelWalletProvider): Promise`
+Return a `FuelWalletLocked` instance, which can be used for contracts, transfers, and other interactions. - +## Has ABI -### Get Provider +`hasABI(contractId: string): Promise`
+Return a boolean indicating if the ABI for the given contractId is found. -`getProvider(): Promise`
-Return a `FuelWalletProvider`. This class extends the `fuels-ts` SDK's `Provider`, -enabling all of the methods available for `Provider` while using the Fuel SDK on signature points to request user permissions. +## Has Connector -Note: The provider returned is tied to the current network selected by the user in their wallet. This means that if the user changes the network within their wallet, -the DApp will also switch to that network. Support for specific DApp networks will be available in the future. +`hasConnector(connectorName?: string | FuelConnector): Promise`
+Check if any connector is present or, if a connector is provided, check whether it is available. -#### Using provider to query node info +## List Accounts - +`accounts(): Promise>`
+Return the accounts authorized for the current connection. -#### Using provider on a fuels-ts Wallet +## List Assets - +`assets(): Promise>`
+Return the list of assets in the current wallet. -### Listing connectors +## List Connectors -To list all available connectors you can use the `listConnectors(): Array` method. +`connectors(): Promise>`
+Return connectors with availability metadata. - +## List Networks -### Has connector +`networks(): Promise>`
+Return the list of networks in the current wallet. -To check if a connector is on the connectors list use the `hasConnector(connectorName: string): boolean` method. +## Request Signature Message - +`async signMessage(address: string, message: string): Promise`
+Request a message signature for one specific account. -### Selecting connector +## Select Connector -For selecting a different Wallet Connector use the `async selectConnector(connectorName: string): Promise` method. +`selectConnector(connectorName: string): Promise`
This method will check if the desired connector is installed. If it is not detected in 1 second, the method throws an error. - - -### Add connector - -For adding a Wallet Connector use the `addConnector(connector: FuelWalletConnector): boolean` method. -This method does not trigger any errors if the target Connector is not installed. - - - -### Remove connector - -To remove a Wallet Connector use the `removeConnector(connectorName: string): boolean` method. - - - -## Events - -Fuel emits events when certain actions occur. These events can be listened to by using the `on` method. - -The events API follows the native Node.js `EventEmitter` enabling, `on`, `once`, and `off`. -The events enum `FuelWalletEvents` can be imported from the `@fuel-wallet/sdk` package. - -### Usage - -The `fuel` object has an `events` property which is an enum of all the events that can be listened to.
-The `on` method takes two arguments, the event name and a callback function. The callback function receives data associated with the event. - -### Connection - -This event is triggered when the connection status change between the Wallet and the application. The callback function receives the `connection` object. - - - -### Accounts - -This event is triggered when the list of connected accounts to the application change. The callback function receives the `account` string. - - - -### Current Account - -This event is triggered when the current account is changed in the Fuel Wallet Extension. The callback function receives the `account` address. - -This event is only triggered if the application has access to the current account address. Otherwise, it is not triggered. - - - -### Network - -This event is triggered when the client connects to a different network. The callback function receives the `network` object. +## Select Network - +`selectNetwork(url: string): Promise`
+Request the user to switch to a different network. Return true if success or false it fails. -### `CurrentConnector` +## Send Transaction -This event is triggered when the Current Connector is updated. The callback function receives the `FuelWalletConnector` object. +`async sendTransaction(address: string, transaction: TransactionRequestLike): Promise`
+Request a specific user account to send a transaction. - +## Unsubscribe All -### Connectors +`unsubscribe(): void`
+Remove all open listeners. This is useful when you want to dispose of the Fuel instance and avoid memory leaks. -This event is triggered when the Connectors list is updated. The callback function receives the list of connectors, `Array`. +## Version - +`version(): Promise`
+Return the current version of the Wallet and Network supported. diff --git a/packages/docs/docs/dev/signMessage.mdx b/packages/docs/docs/dev/signMessage.mdx new file mode 100644 index 000000000..9b2335b80 --- /dev/null +++ b/packages/docs/docs/dev/signMessage.mdx @@ -0,0 +1,24 @@ +--- +title: Signing a Message +category: For Developers +--- + +# Signing a Message + +With access to the user address and the connection authorized, you can request the user's signature using `signMessage()`. + + + + +## With React + +In a React app, once the connection is established, you can use the `useWallet()` hook to get a wallet instance and sign the transaction. + + + diff --git a/packages/docs/docs/dev/signing.mdx b/packages/docs/docs/dev/signing.mdx deleted file mode 100644 index f64fa455e..000000000 --- a/packages/docs/docs/dev/signing.mdx +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: Signing a Message -category: For Developers ---- - -# Signing a Message - -With access to the user address and the connection authorized, you can request the user's signature using `fuel.signMessage`. - - - - - -## With React - -In a react app, once the connection is established, you can use the `useWallet` hook to get a wallet instance and sign the transaction. - -```tsx -import { useAccount, useWallet } from '@fuel-wallet/react'; -// ... -const { account } = useAccount(); -const { wallet } = useWallet({ address: account }); - -const signedMessage = await wallet.signMessage('Message to sign'); -console.log('Message signature', signedMessage); -// Message signature 0x59160a10fee638458aaadd7eb... -``` diff --git a/packages/docs/docs/install.mdx b/packages/docs/docs/install.mdx index c76e6ffbf..e9087c279 100644 --- a/packages/docs/docs/install.mdx +++ b/packages/docs/docs/install.mdx @@ -4,15 +4,13 @@ title: Install -## Wallet SDK +## Developing a DApp -After installing our browser extension, the wallet SDK will be injected automatically on the `window` object on the property `fuel`. To access it, you can use `window.fuel`. - -You can see the SDK working on the [Getting Started](/docs/dev/getting-started) page. + ## Install from source code -You can also install the next version of Fuel Wallet directly from source code. To do this: +You can also install the development version of Fuel Wallet, built directly from our source code. To do this: - Download ; - Inside Chrome or Brave; diff --git a/packages/docs/examples/Connect.tsx b/packages/docs/examples/Connect.tsx deleted file mode 100644 index 20e825b76..000000000 --- a/packages/docs/examples/Connect.tsx +++ /dev/null @@ -1,55 +0,0 @@ -/* eslint-disable no-console */ -import { Box, Button } from '@fuel-ui/react'; -import { useState } from 'react'; - -import { ExampleBox } from '../src/components/ExampleBox'; -import { useFuel } from '../src/hooks/useFuel'; -import { useLoading } from '../src/hooks/useLoading'; - -export function Connect() { - const [fuel, notDetected] = useFuel(); - const [connected, setConnected] = useState(false); - - const [handleConnect, isConnecting, errorConnect] = useLoading(async () => { - console.log('Request connection to Wallet!'); - /* connect:start */ - const isConnected = await fuel.connect(); - console.log('Connection response', isConnected); - /* connect:end */ - setConnected(isConnected); - }); - - const [handleDisconnect, isDisconnecting, errorDisconnect] = useLoading( - async () => { - console.log('Request disconnection to Wallet!'); - /* disconnect:start */ - await fuel.disconnect(); - /* disconnect:end */ - setConnected(false); - console.log('Disconnection response'); - } - ); - - const errorMessage = errorConnect || errorDisconnect || notDetected; - - return ( - - - - - - - ); -} diff --git a/packages/docs/examples/Connectors.tsx b/packages/docs/examples/Connectors.tsx deleted file mode 100644 index fc3c5b836..000000000 --- a/packages/docs/examples/Connectors.tsx +++ /dev/null @@ -1,122 +0,0 @@ -/* eslint-disable no-console */ -import { Box, Button, Input } from '@fuel-ui/react'; -import { useEffect, useState } from 'react'; -import type { FuelWalletConnector } from '~/../types/src'; -import { ExampleBox } from '~/src/components/ExampleBox'; -import { useFuel } from '~/src/hooks/useFuel'; -import { useLoading } from '~/src/hooks/useLoading'; - -export function Connectors() { - const [fuel, notDetected] = useFuel(); - const [connected, setConnected] = useState(false); - const [compatibilityError, setCompatibilityError] = useState(''); - const [connectors, setConnectors] = useState>([]); - - useEffect(() => { - if (!fuel) return () => {}; - const onCurrentConnector = async () => { - console.log('Current connector changed!'); - const isConnected = await fuel.isConnected(); - setConnected(isConnected); - }; - /* eventCurrentConnector:start */ - fuel.on(fuel.events.currentConnector, onCurrentConnector); - return () => { - fuel.off(fuel.events.currentConnector, onCurrentConnector); - }; - /* eventCurrentConnector:end */ - }, [fuel]); - - useEffect(() => { - if (!fuel) return () => {}; - if (!fuel.listConnectors) { - setCompatibilityError( - "Current version of Fuel Wallet doesn't support Connectors!" - ); - return () => {}; - } - setCompatibilityError(''); - - /* listConnectors:start */ - const connectors = fuel.listConnectors(); - /* listConnectors:end */ - setConnectors(connectors); - - const onConnectors = () => { - setConnectors(Array.from(fuel.listConnectors())); - }; - - /* eventConnectors:start */ - fuel.on(fuel.events.connectors, onConnectors); - return () => { - fuel.off(fuel.events.connectors, onConnectors); - }; - /* eventConnectors:end */ - }, [fuel]); - - const [handleConnect, isConnecting, errorConnect] = useLoading(async () => { - console.log('Request connection to Wallet!'); - const isConnected = await fuel.connect(); - console.log('Connection response', isConnected); - setConnected(isConnected); - }); - - const [handleDisconnect, isDisconnecting, errorDisconnect] = useLoading( - async () => { - console.log('Request disconnection to Wallet!'); - await fuel.disconnect(); - setConnected(false); - console.log('Disconnection response'); - } - ); - - const [handleSelectConnector, isSelecting, errorConnector] = useLoading( - /* selectConnector:start */ - async (connectorName: string) => { - console.log(`Select connector "${connectorName}"!`); - await fuel.selectConnector(connectorName); - console.log(`Connector "${connectorName}" connected`); - } - /* selectConnector:end */ - ); - - const errorMessage = - errorConnect || errorDisconnect || notDetected || errorConnector; - - return ( - - { - handleSelectConnector(e.target.value); - }} - > - {connectors.map((connector) => ( - - ))} - - - - - - - ); -} diff --git a/packages/docs/examples/FuelLoaded.tsx b/packages/docs/examples/FuelLoaded.tsx deleted file mode 100644 index 00da136e0..000000000 --- a/packages/docs/examples/FuelLoaded.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { Box, Text } from '@fuel-ui/react'; -import { useEffect, useState } from 'react'; - -import { ExampleBox } from '../src/components/ExampleBox'; - -export function FuelLoaded() { - const [fuel, setFuel] = useState(); - - useEffect(() => { - /* detectFuel:start */ - // Fuel loaded handler - const onFuelLoaded = () => { - setFuel(window.fuel); - }; - - // If fuel is already loaded, call the handler - if (window.fuel) { - onFuelLoaded(); - } - - // Listen for the fuelLoaded event - document.addEventListener('FuelLoaded', onFuelLoaded); - - // On unmount, remove the event listener - return () => { - document.removeEventListener('FuelLoaded', onFuelLoaded); - }; - /* detectFuel:end */ - }, []); - - return ( - - - {fuel ? ( - - fuel is ready to use - - ) : ( - - fuel not detected - - )} - - - ); -} diff --git a/packages/docs/examples/IsConnected.tsx b/packages/docs/examples/IsConnected.tsx deleted file mode 100644 index 266e69b59..000000000 --- a/packages/docs/examples/IsConnected.tsx +++ /dev/null @@ -1,39 +0,0 @@ -/* eslint-disable no-console */ -import { Box, Button, Text } from '@fuel-ui/react'; -import { useState } from 'react'; - -import { ExampleBox } from '../src/components/ExampleBox'; -import { useFuel } from '../src/hooks/useFuel'; -import { useLoading } from '../src/hooks/useLoading'; - -export function IsConnected() { - const [fuel, notDetected] = useFuel(); - const [connected, setConnected] = useState(false); - - const [handleIsConnected, isCheckingConnection, error] = useLoading( - async () => { - /* example:start */ - const isConnected = await fuel.isConnected(); - console.log('Connection response', isConnected); - /* example:end */ - setConnected(isConnected); - } - ); - - const errorMessage = error || notDetected; - - return ( - - - - - {connected - ? 'Your wallet is connected' - : 'Your wallet is disconnected'} - - - - ); -} diff --git a/packages/docs/examples/Transfer.tsx b/packages/docs/examples/Transfer.tsx deleted file mode 100644 index 7477605a2..000000000 --- a/packages/docs/examples/Transfer.tsx +++ /dev/null @@ -1,129 +0,0 @@ -/* eslint-disable no-console */ -import { cssObj } from '@fuel-ui/css'; -import { Box, Button, Link, Text, InputAmount, Input } from '@fuel-ui/react'; -import { getBlockExplorerLink, getGasConfig } from '@fuel-wallet/sdk'; -import type { BN } from 'fuels'; -import { BaseAssetId, bn, Address, DECIMAL_UNITS } from 'fuels'; -import { useMemo, useState } from 'react'; -import { useAssets } from '~/src/hooks/useAssets'; - -import { ExampleBox } from '../src/components/ExampleBox'; -import { useFuel } from '../src/hooks/useFuel'; -import { useIsConnected } from '../src/hooks/useIsConnected'; -import { useLoading } from '../src/hooks/useLoading'; - -export function Transfer() { - const [fuel, notDetected] = useFuel(); - const [isConnected] = useIsConnected(); - const [txId, setTxId] = useState(''); - const [providerUrl, setProviderUrl] = useState(''); - const [amount, setAmount] = useState(bn.parseUnits('0.00001')); - const [addr, setAddr] = useState( - 'fuel1a6msn9zmjpvv84g08y3t6x6flykw622s48k2lqg257pf9924pnfq50tdmw' - ); - const [assetId, setAssetId] = useState(BaseAssetId); - const assets = useAssets(); - const decimals = useMemo(() => { - return ( - assets.find((asset) => asset.assetId === assetId)?.decimals || - DECIMAL_UNITS - ); - }, [assets, assetId]); - - const [sendTransaction, sendingTransaction, errorSendingTransaction] = - useLoading(async (amount: BN, addr: string, assetId: string) => { - if (!isConnected) await fuel.connect(); - console.log('Request signature transaction!'); - /* example:start */ - const accounts = await fuel.accounts(); - const account = accounts[0]; - const wallet = await fuel.getWallet(account); - const toAddress = Address.fromString(addr); - const gasConfig = await getGasConfig(wallet.provider); - const response = await wallet.transfer(toAddress, amount, assetId, { - ...gasConfig, - }); - console.log('Transaction created!', response.id); - /* example:end */ - setProviderUrl(wallet.provider.url); - setTxId(response.id); - }); - - const errorMessage = notDetected || errorSendingTransaction; - - return ( - - - - - - { - setAmount(null); - setAssetId(e.target.value); - }} - /> - - - - - setAddr(e.target.value)} - /> - - - - setAmount(value ? bn(value) : null)} - hiddenBalance - units={decimals} - /> - - - - - - {txId ? ( - - {txId} - - See on BlockExplorer - - - ) : null} - - - ); -} - -const styles = { - accounts: cssObj({ - marginTop: '$2', - padding: '$2', - borderRadius: '$lg', - backgroundColor: '$intentsBase4', - maxWidth: 300, - wordWrap: 'break-word', - }), -}; diff --git a/packages/docs/examples/Abi.tsx b/packages/docs/examples/abis/Abi.tsx similarity index 73% rename from packages/docs/examples/Abi.tsx rename to packages/docs/examples/abis/Abi.tsx index ff5556ebd..c368ce143 100644 --- a/packages/docs/examples/Abi.tsx +++ b/packages/docs/examples/abis/Abi.tsx @@ -1,38 +1,34 @@ /* eslint-disable no-console */ import { cssObj } from '@fuel-ui/css'; import { Button, Box, Input } from '@fuel-ui/react'; -import type { JsonAbi } from 'fuels'; +import { useFuel, useIsConnected } from '@fuel-wallet/react'; +import type { FuelABI } from '@fuel-wallet/sdk'; import { useState } from 'react'; -import { ExampleBox } from '../src/components/ExampleBox'; -import { useFuel } from '../src/hooks/useFuel'; -import { useIsConnected } from '../src/hooks/useIsConnected'; -import { useLoading } from '../src/hooks/useLoading'; - -import { SWAY_SWAP_CONTRACT_ID } from './data/swayswap/contractId'; +import { ExampleBox } from '../../src/components/ExampleBox'; +import { useLoading } from '../../src/hooks/useLoading'; +import { SWAY_SWAP_CONTRACT_ID } from '../data/swayswap/contractId'; export function Abi() { - const [fuel, notDetected] = useFuel(); - const [isConnected] = useIsConnected(); + const { fuel } = useFuel(); + const { isConnected } = useIsConnected(); const [contractId, setContractId] = useState(SWAY_SWAP_CONTRACT_ID); - const [abi, setAbi] = useState(); + const [abi, setABI] = useState(null); const [handleGetAbi, isLoadingAbi, errorGetAbi] = useLoading( async (contractId: string | undefined) => { if (!contractId) return; if (!isConnected) await fuel.connect(); console.log('Request the current abi of contractId: ', contractId); - /* example:start */ - const abiInfo = await fuel.getAbi(contractId); + /* getABI:start */ + const abiInfo = await fuel.getABI(contractId); console.log('Abi ', abiInfo); - /* example:end */ - setAbi(abiInfo); + /* getABI:end */ + setABI(abiInfo); } ); - const errorMessage = errorGetAbi || notDetected; - return ( - + (SWAY_SWAP_CONTRACT_ID); @@ -28,12 +26,10 @@ export function AddAbi() { try { const abi = JSON.parse(abiString); - /* example:start */ - const abiMap: AbiMap = { - [contractId]: abi, - }; - await fuel.addAbi(abiMap); - /* example:end */ + /* addABI:start */ + const isAdded = await fuel.addABI(contractId, abi); + console.log('ABI is added', isAdded); + /* addABI:end */ setAbiError(false); setAbiSuccess(true); } catch (e) { @@ -43,8 +39,6 @@ export function AddAbi() { } ); - const errorMessage = notDetected || errorAddingAbi; - function handleChangeAbi(value: string) { try { const abi = JSON.parse(value); @@ -58,7 +52,7 @@ export function AddAbi() { } return ( - + >([]); const [handleGetAccounts, isLoadingAccounts, errorGetAccounts] = useLoading( async () => { if (!isConnected) await fuel.connect(); console.log('Request accounts to Wallet!'); - /* example:start */ + /* accounts:start */ const accounts = await fuel.accounts(); - console.log('Accounts ', accounts); - /* example:end */ + console.log('Accounts', accounts); + /* accounts:end */ setAccounts(accounts); } ); - const errorMessage = errorGetAccounts || notDetected; + useEffect(() => { + /* watchAccounts:start */ + function logAccounts(accounts: string) { + console.log('Accounts ', accounts); + } + fuel.on(fuel.events.accounts, logAccounts); + /* watchAccounts:end */ + return () => { + fuel.off(fuel.events.accounts, logAccounts); + }; + }, []); return ( - + + )} +
+ + + + ); +} + +const styles = { + root: cssObj({ + gap: '$2', + display: 'inline-flex', + alignItems: 'flex-start', + + '.fuel_Tag > p': { + fontSize: '$sm', + }, + }), +}; diff --git a/packages/docs/examples/accounts/hooks/CurrentAccountHook.tsx b/packages/docs/examples/accounts/hooks/CurrentAccountHook.tsx new file mode 100644 index 000000000..195b4f354 --- /dev/null +++ b/packages/docs/examples/accounts/hooks/CurrentAccountHook.tsx @@ -0,0 +1,65 @@ +import { cssObj } from '@fuel-ui/css'; +import { Box, Button, Tag, Text } from '@fuel-ui/react'; +import { + useAccount, + useConnect, + useFuel, + useIsConnected, +} from '@fuel-wallet/react'; + +import { ExampleBox } from '../../../src/components/ExampleBox'; + +export function CurrentAccountHook() { + const { fuel } = useFuel(); + const { connect, isLoading: isConnecting, error } = useConnect(); + const { isConnected } = useIsConnected(); + /* useAccount:start */ + const { account } = useAccount(); + /* useAccount:end */ + + return ( + + + + {!!account && ( + + Current account: + + {account} + + + + Change the account in your Fuel wallet to test the event + + + + )} + {isConnected && !account && ( + The current account is not connected + )} + {!isConnected && ( + + )} + + + + ); +} + +const styles = { + root: cssObj({ + gap: '$2', + display: 'inline-flex', + alignItems: 'flex-start', + + '.fuel_Tag > p': { + fontSize: '$sm', + }, + }), +}; diff --git a/packages/docs/examples/accounts/hooks/index.tsx b/packages/docs/examples/accounts/hooks/index.tsx new file mode 100644 index 000000000..da206e76c --- /dev/null +++ b/packages/docs/examples/accounts/hooks/index.tsx @@ -0,0 +1,2 @@ +export * from './AccountsHook'; +export * from './CurrentAccountHook'; diff --git a/packages/docs/examples/accounts/index.tsx b/packages/docs/examples/accounts/index.tsx new file mode 100644 index 000000000..e74520b5b --- /dev/null +++ b/packages/docs/examples/accounts/index.tsx @@ -0,0 +1,3 @@ +export * from './CurrentAccount'; +export * from './Accounts'; +export * from './hooks'; diff --git a/packages/docs/examples/AddAssets.tsx b/packages/docs/examples/assets/AddAssets.tsx similarity index 69% rename from packages/docs/examples/AddAssets.tsx rename to packages/docs/examples/assets/AddAssets.tsx index 6ad35d0c7..b406b1961 100644 --- a/packages/docs/examples/AddAssets.tsx +++ b/packages/docs/examples/assets/AddAssets.tsx @@ -1,42 +1,31 @@ /* eslint-disable no-console */ import { cssObj } from '@fuel-ui/css'; import { Box, Button, Input, Text, IconButton, Icon } from '@fuel-ui/react'; +import { useFuel, useIsConnected } from '@fuel-wallet/react'; +import type { AssetFuel, Asset } from '@fuel-wallet/sdk'; +import { getAssetByChain } from '@fuel-wallet/sdk'; import { useState } from 'react'; -import type { Asset } from '../../types/src'; -import { ExampleBox } from '../src/components/ExampleBox'; -import { useFuel } from '../src/hooks/useFuel'; -import { useIsConnected } from '../src/hooks/useIsConnected'; -import { useLoading } from '../src/hooks/useLoading'; +import { ExampleBox } from '../../src/components/ExampleBox'; +import { useLoading } from '../../src/hooks/useLoading'; + +import { ASSET } from './data'; export function AddAssets() { - const [fuel, notDetected] = useFuel(); - const [isConnected] = useIsConnected(); - const [assets, setAssets] = useState([ - { - assetId: - '0x566012155ae253353c7df01f36c8f6249c94131a69a3484bdb0234e3822b5d90', - name: 'New', - symbol: 'NEW', - imageUrl: - 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/46/Bitcoin.svg/1200px-Bitcoin.svg.png', - isCustom: true, - decimals: 6, - }, - ]); + const { fuel } = useFuel(); + const { isConnected } = useIsConnected(); + const [assets, setAssets] = useState([ASSET]); const [handleAddAsset, isSingingMessage, errorSigningMessage] = useLoading( async (assets: Asset[]) => { if (!isConnected) await fuel.connect(); + /* addAssets:start */ console.log('Add Assets', assets); - /* example:start */ await fuel.addAssets(assets); - /* example:end */ + /* addAssets:end */ } ); - const errorMessage = notDetected || errorSigningMessage; - const onChangeAsset = (index: number, asset: Asset) => { const newAssets = [...assets]; newAssets[index] = asset; @@ -50,13 +39,17 @@ export function AddAssets() { }; return ( - + {assets.map((asset, index) => { const isLast = index === assets.length - 1; + const assetData = getAssetByChain(asset, 0); return ( - + Asset {index + 1} {!!index && ( @@ -72,9 +65,17 @@ export function AddAssets() { - onChangeAsset(index, { ...asset, assetId: e.target.value }) + onChangeAsset(index, { + ...asset, + networks: [ + { + ...(asset.networks[0] as AssetFuel), + assetId: e.target.value, + }, + ], + }) } placeholder="Type your assetId (0x...)" /> @@ -101,13 +102,16 @@ export function AddAssets() { { onChangeAsset(index, { ...asset, - decimals: e.target.value - ? Number(e.target.value) - : undefined, + networks: [ + { + ...(asset.networks[0] as AssetFuel), + decimals: Number(e.target.value || 0), + }, + ], }); }} placeholder="Type your asset Decimals" @@ -116,9 +120,9 @@ export function AddAssets() { - onChangeAsset(index, { ...asset, imageUrl: e.target.value }) + onChangeAsset(index, { ...asset, icon: e.target.value }) } placeholder="Type your asset imageUrl" /> @@ -132,7 +136,19 @@ export function AddAssets() { onPress={() => setAssets([ ...assets, - { assetId: '', name: '', symbol: '', imageUrl: '' }, + { + name: '', + symbol: '', + icon: '', + networks: [ + { + type: 'fuel', + chainId: 0, + assetId: '', + decimals: 0, + }, + ], + }, ]) } > diff --git a/packages/docs/examples/ListAssets.tsx b/packages/docs/examples/assets/ListAssets.tsx similarity index 62% rename from packages/docs/examples/ListAssets.tsx rename to packages/docs/examples/assets/ListAssets.tsx index 699d00bea..bd9820f46 100644 --- a/packages/docs/examples/ListAssets.tsx +++ b/packages/docs/examples/assets/ListAssets.tsx @@ -1,34 +1,31 @@ /* eslint-disable no-console */ import { cssObj } from '@fuel-ui/css'; import { Box, Button, Tag } from '@fuel-ui/react'; -import type { Asset } from '@fuel-wallet/sdk'; +import { useFuel, useIsConnected } from '@fuel-wallet/react'; +import { getAssetByChain, type Asset } from '@fuel-wallet/sdk'; import { useState } from 'react'; -import { ExampleBox } from '../src/components/ExampleBox'; -import { useFuel } from '../src/hooks/useFuel'; -import { useIsConnected } from '../src/hooks/useIsConnected'; -import { useLoading } from '../src/hooks/useLoading'; +import { ExampleBox } from '../../src/components/ExampleBox'; +import { useLoading } from '../../src/hooks/useLoading'; export function ListAssets() { - const [fuel, notDetected] = useFuel(); - const [isConnected] = useIsConnected(); + const { fuel } = useFuel(); + const { isConnected } = useIsConnected(); const [assets, setAssets] = useState>([]); const [handleGetAssets, isLoadingAssets, errorGetAssets] = useLoading( async () => { if (!isConnected) await fuel.connect(); console.log('Request assets to Wallet!'); - /* example:start */ + /* assets:start */ const assets = await fuel.assets(); console.log('Assets ', assets); - /* example:end */ + /* assets:end */ setAssets(assets); } ); - const errorMessage = errorGetAssets || notDetected; - return ( - + +
+ + {txId ? ( + + {txId} + + See on BlockExplorer + + + ) : null} + + + ); +} + +const styles = { + accounts: cssObj({ + marginTop: '$2', + padding: '$2', + borderRadius: '$lg', + backgroundColor: '$intentsBase4', + maxWidth: 300, + wordWrap: 'break-word', + }), +}; diff --git a/packages/docs/examples/assets/data.tsx b/packages/docs/examples/assets/data.tsx new file mode 100644 index 000000000..ba45eb13c --- /dev/null +++ b/packages/docs/examples/assets/data.tsx @@ -0,0 +1,16 @@ +import type { Asset } from '@fuel-wallet/sdk'; + +export const ASSET: Asset = { + name: 'New', + symbol: 'NEW', + icon: 'https://upload.wikimedia.org/wikipedia/commons/thumb/4/46/Bitcoin.svg/1200px-Bitcoin.svg.png', + networks: [ + { + type: 'fuel', + chainId: 0, + decimals: 6, + assetId: + '0x566012155ae253353c7df01f36c8f6249c94131a69a3484bdb0234e3822b5d90', + }, + ], +}; diff --git a/packages/docs/examples/assets/hooks/AddAssetsHook.tsx b/packages/docs/examples/assets/hooks/AddAssetsHook.tsx new file mode 100644 index 000000000..76e2b58aa --- /dev/null +++ b/packages/docs/examples/assets/hooks/AddAssetsHook.tsx @@ -0,0 +1,197 @@ +/* eslint-disable no-console */ +import { cssObj } from '@fuel-ui/css'; +import { Box, Button, Input, Text, IconButton, Icon } from '@fuel-ui/react'; +import { + useFuel, + useIsConnected, + useAddAssets, + useConnect, +} from '@fuel-wallet/react'; +import type { AssetFuel, Asset } from '@fuel-wallet/sdk'; +import { getAssetByChain } from '@fuel-wallet/sdk'; +import { useState } from 'react'; + +import { ExampleBox } from '../../../src/components/ExampleBox'; +import { ASSET } from '../data'; + +export function AddAssetsHook() { + const { fuel } = useFuel(); + const { isConnected } = useIsConnected(); + const [assets, setAssets] = useState([ASSET]); + const { connect, error: errorConnecting } = useConnect(); + /* addAssets:start */ + const { addAssets, isLoading, error } = useAddAssets(); + + async function handleAddAssets(assets: Asset[]) { + if (!isConnected) await connect(); // ignore-line + console.log('Add Assets', assets); + addAssets(assets); + } + /* addAssets:end */ + + const onChangeAsset = (index: number, asset: Asset) => { + const newAssets = [...assets]; + newAssets[index] = asset; + setAssets(newAssets); + }; + + const removeAsset = (index: number) => () => { + const newAssets = [...assets]; + newAssets.splice(index, 1); + setAssets(newAssets); + }; + + return ( + + + {assets.map((asset, index) => { + const isLast = index === assets.length - 1; + const assetData = getAssetByChain(asset, 0); + + return ( + + + Asset {index + 1} + {!!index && ( + } + onPress={removeAsset(index)} + aria-label="Remove Asset" + /> + )} + + + + onChangeAsset(index, { + ...asset, + networks: [ + { + ...(asset.networks[0] as AssetFuel), + assetId: e.target.value, + }, + ], + }) + } + placeholder="Type your assetId (0x...)" + /> + + + + + onChangeAsset(index, { ...asset, name: e.target.value }) + } + placeholder="Type your asset Name" + /> + + + + onChangeAsset(index, { ...asset, symbol: e.target.value }) + } + placeholder="Type your asset Symbol" + /> + + + { + onChangeAsset(index, { + ...asset, + networks: [ + { + ...(asset.networks[0] as AssetFuel), + decimals: Number(e.target.value || 0), + }, + ], + }); + }} + placeholder="Type your asset Decimals" + /> + + + + + onChangeAsset(index, { ...asset, icon: e.target.value }) + } + placeholder="Type your asset imageUrl" + /> + + + ); + })} + + + + + + + ); +} + +const styles = { + msg: cssObj({ + borderRadius: '$md', + height: 'auto', + maxWidth: 320, + wordBreak: 'break-all', + }), + wrapper: cssObj({ + gap: '$4', + }), + item: (isLast: boolean) => + cssObj({ + gap: '$2', + mb: isLast ? '0' : '$4', + }), + input: cssObj({ + width: '100%', + }), + itemHeader: cssObj({ + gap: '$2', + alignItems: 'center', + justifyContent: 'space-between', + }), +}; diff --git a/packages/docs/examples/assets/hooks/ListAssetsHook.tsx b/packages/docs/examples/assets/hooks/ListAssetsHook.tsx new file mode 100644 index 000000000..39464031d --- /dev/null +++ b/packages/docs/examples/assets/hooks/ListAssetsHook.tsx @@ -0,0 +1,47 @@ +import { cssObj } from '@fuel-ui/css'; +import { Box, Tag } from '@fuel-ui/react'; +import { useAssets } from '@fuel-wallet/react'; +import { getAssetByChain } from '@fuel-wallet/sdk'; + +import { ExampleBox } from '../../../src/components/ExampleBox'; + +export function ListAssetsHook() { + /* useAssets:start */ + const { assets } = useAssets(); + /* useAssets:end */ + + return ( + + + {Boolean(assets.length) && ( + + {assets.map((a) => { + const asset = getAssetByChain(a, 0); + return ( + + {asset.name} ({asset.symbol}): {asset.assetId} + + ); + })} + + )} + + + ); +} + +const styles = { + root: cssObj({ + gap: '$2', + display: 'inline-flex', + alignItems: 'flex-start', + + '.fuel_Tag': { + justifyContent: 'flex-start', + + '& > p': { + fontSize: '$sm', + }, + }, + }), +}; diff --git a/packages/docs/examples/assets/hooks/TransferAssetsHook.tsx b/packages/docs/examples/assets/hooks/TransferAssetsHook.tsx new file mode 100644 index 000000000..c2b5c2949 --- /dev/null +++ b/packages/docs/examples/assets/hooks/TransferAssetsHook.tsx @@ -0,0 +1,145 @@ +/* eslint-disable no-console */ +import { cssObj } from '@fuel-ui/css'; +import { Box, Button, Link, Text, InputAmount, Input } from '@fuel-ui/react'; +import { useFuel, useAssets, useWallet } from '@fuel-wallet/react'; +import { getAssetByChain } from '@fuel-wallet/sdk'; +import type { BN } from 'fuels'; +import { buildBlockExplorerUrl, BaseAssetId, bn, Address } from 'fuels'; +import { useMemo, useState } from 'react'; + +import { ExampleBox } from '../../../src/components/ExampleBox'; +import { useLoading } from '../../../src/hooks/useLoading'; + +export function TransferAssetsHook() { + const { fuel } = useFuel(); + const { assets } = useAssets(); + const [txId, setTxId] = useState(''); + const [providerUrl, setProviderUrl] = useState(''); + const [amount, setAmount] = useState(bn.parseUnits('0.00001')); + const [receiverAddress, setAddr] = useState( + 'fuel1a6msn9zmjpvv84g08y3t6x6flykw622s48k2lqg257pf9924pnfq50tdmw' + ); + const [assetId, setAssetId] = useState(BaseAssetId); + const decimals = useMemo(() => { + const asset = assets + .map((asset) => getAssetByChain(asset, 0)) + .find((asset) => asset.assetId === assetId); + return asset?.decimals || 0; + }, [assetId, assets]); + /* transferHook:start */ + const { wallet } = useWallet(); // or useAccount(address); + + async function transfer( + amount: BN, + receiverAddress: string, + assetId: string + ) { + if (!wallet) { + throw new Error('Wallet not found!'); + } + // Create a Address instance to the receiver address + const toAddress = Address.fromString(receiverAddress); + // Get the minGasPrice and maxGasPerTx for the network + const { minGasPrice } = await wallet.provider.getGasConfig(); + // Send a transaction to transfer the asset to the receiver address + const response = await wallet.transfer(toAddress, bn(amount), assetId, { + gasPrice: minGasPrice, + gasLimit: 5_000, + }); + console.log('Transaction created!', response.id); + setProviderUrl(wallet.provider.url); // ignore-line + setTxId(response.id); // ignore-line + } + /* transferHook:end */ + + const [sendTransaction, sendingTransaction, errorSendingTransaction] = + useLoading(transfer, [wallet]); + + return ( + + + + + { + setAmount(null); + setAssetId(e.target.value); + }} + /> + + + setAddr(e.target.value)} + /> + + {decimals ? ( + setAmount(value)} + hiddenBalance + units={decimals} + /> + ) : ( + + { + const ignore = /[.,\-+]/g; + const val = (e.target.value || '').replaceAll(ignore, ''); + setAmount(val ? bn(val) : null); + }} + placeholder={'Asset amount'} + /> + + )} + + + + + {txId ? ( + + {txId} + + See on BlockExplorer + + + ) : null} + + + ); +} + +const styles = { + accounts: cssObj({ + marginTop: '$2', + padding: '$2', + borderRadius: '$lg', + backgroundColor: '$intentsBase4', + maxWidth: 300, + wordWrap: 'break-word', + }), +}; diff --git a/packages/docs/examples/assets/hooks/index.tsx b/packages/docs/examples/assets/hooks/index.tsx new file mode 100644 index 000000000..fa5d82588 --- /dev/null +++ b/packages/docs/examples/assets/hooks/index.tsx @@ -0,0 +1,3 @@ +export * from './AddAssetsHook'; +export * from './ListAssetsHook'; +export * from './TransferAssetsHook'; diff --git a/packages/docs/examples/assets/index.ts b/packages/docs/examples/assets/index.ts new file mode 100644 index 000000000..cbb72ef47 --- /dev/null +++ b/packages/docs/examples/assets/index.ts @@ -0,0 +1,4 @@ +export * from './AddAssets'; +export * from './ListAssets'; +export * from './TransferAssets'; +export * from './hooks'; diff --git a/packages/docs/examples/connecting/CheckConnection.tsx b/packages/docs/examples/connecting/CheckConnection.tsx new file mode 100644 index 000000000..391b46816 --- /dev/null +++ b/packages/docs/examples/connecting/CheckConnection.tsx @@ -0,0 +1,53 @@ +/* eslint-disable no-console */ +import { Box, Button, Text } from '@fuel-ui/react'; +import { useFuel } from '@fuel-wallet/react'; +import { Fuel } from '@fuel-wallet/sdk'; +import { useEffect, useState } from 'react'; + +import { ExampleBox } from '../../src/components/ExampleBox'; +import { useLoading } from '../../src/hooks/useLoading'; + +// Change default config for devMode to true +Fuel.defaultConfig.devMode = true; + +export function CheckConnection() { + const { fuel } = useFuel(); + const [connected, setConnected] = useState(false); + + const [handleIsConnected, isCheckingConnection, error] = useLoading( + async () => { + /* checkConnection:start */ + const connectionState = await fuel.isConnected(); + console.log('Connection state', connectionState); + /* checkConnection:end */ + setConnected(connectionState); + } + ); + + useEffect(() => { + /* watchConnection:start */ + const logConnectionState = (connectionState: boolean) => { + console.log('connectionState', connectionState); + }; + fuel.on(fuel.events.connection, logConnectionState); + /* watchConnection:end */ + return () => { + fuel.off(fuel.events.connection, logConnectionState); + }; + }, []); + + return ( + + + + + {connected + ? 'Your wallet is connected' + : 'Your wallet is disconnected'} + + + + ); +} diff --git a/packages/docs/examples/connecting/CheckWallet.tsx b/packages/docs/examples/connecting/CheckWallet.tsx new file mode 100644 index 000000000..209afde07 --- /dev/null +++ b/packages/docs/examples/connecting/CheckWallet.tsx @@ -0,0 +1,47 @@ +/* eslint-disable no-console */ +import { Box, Text } from '@fuel-ui/react'; +import { useFuel } from '@fuel-wallet/react'; +import type { FuelConnector } from '@fuel-wallet/sdk'; +import { useEffect, useState } from 'react'; + +import { ExampleBox } from '../../src/components/ExampleBox'; + +export function CheckWallet() { + const { fuel } = useFuel(); + const [message, setMessage] = useState(''); + + useEffect(() => { + async function handleConnector() { + /* checkWallet:start */ + const hasConnector = await fuel.hasConnector(); + console.log('hasConnector', hasConnector); + /* checkWallet:end */ + setMessage( + hasConnector ? `Wallet found!` : 'Wallet not detected on the browser' + ); + } + + handleConnector(); + + /* watchWallet:start */ + function logConnector(currentConnector: FuelConnector) { + console.log('currentConnector', currentConnector); + handleConnector(); // ignore-line + } + fuel.on(fuel.events.currentConnector, logConnector); + /* watchWallet:end */ + return () => { + fuel.off(fuel.events.currentConnector, logConnector); + }; + }, []); + + return ( + + + + {message} + + + + ); +} diff --git a/packages/docs/examples/connecting/Connect.tsx b/packages/docs/examples/connecting/Connect.tsx new file mode 100644 index 000000000..b106d0dca --- /dev/null +++ b/packages/docs/examples/connecting/Connect.tsx @@ -0,0 +1,33 @@ +/* eslint-disable no-console */ +import { Box, Button, Text } from '@fuel-ui/react'; +import { useFuel, useIsConnected } from '@fuel-wallet/react'; + +import { ExampleBox } from '../../src/components/ExampleBox'; +import { useLoading } from '../../src/hooks/useLoading'; + +export function Connect() { + const { fuel } = useFuel(); + const { isConnected } = useIsConnected(); + const [handleConnect, isConnecting, errorConnect] = useLoading(async () => { + console.log('Request connection to Wallet!'); + /* connect:start */ + const connectionState = await fuel.connect(); + console.log('Connection state', connectionState); + /* connect:end */ + }); + + return ( + + + + {isConnected && 'You are connected'} + + + ); +} diff --git a/packages/docs/examples/connecting/Disconnect.tsx b/packages/docs/examples/connecting/Disconnect.tsx new file mode 100644 index 000000000..c089440ea --- /dev/null +++ b/packages/docs/examples/connecting/Disconnect.tsx @@ -0,0 +1,36 @@ +/* eslint-disable no-console */ +'use client'; +import { Box, Button, Text } from '@fuel-ui/react'; +import { useFuel, useIsConnected } from '@fuel-wallet/react'; + +import { ExampleBox } from '../../src/components/ExampleBox'; +import { useLoading } from '../../src/hooks/useLoading'; + +export function Disconnect() { + const { fuel } = useFuel(); + const { isConnected } = useIsConnected(); + const [handleDisconnect, isConnecting, errorConnect] = useLoading( + async () => { + console.log('Disconnect from Wallet!'); + /* disconnect:start */ + const connectionState = await fuel.disconnect(); + console.log('Connection state', connectionState); + /* disconnect:end */ + } + ); + + return ( + + + + {!isConnected && 'You are not connected'} + + + ); +} diff --git a/packages/docs/examples/connecting/hooks/ConnectHook.tsx b/packages/docs/examples/connecting/hooks/ConnectHook.tsx new file mode 100644 index 000000000..ad9085e26 --- /dev/null +++ b/packages/docs/examples/connecting/hooks/ConnectHook.tsx @@ -0,0 +1,28 @@ +import { Box, Button, Text } from '@fuel-ui/react'; +import { useConnect, useIsConnected } from '@fuel-wallet/react'; + +import { ExampleBox } from '../../../src/components/ExampleBox'; + +export function ConnectHook() { + /* checkConnection:start */ + const { isConnected } = useIsConnected(); + /* checkConnection:end */ + /* connect:start */ + const { connect, isLoading, error } = useConnect(); + /* connect:end */ + + return ( + + + + {isConnected && 'You are connected'} + + + ); +} diff --git a/packages/docs/examples/connecting/hooks/DisconnectHook.tsx b/packages/docs/examples/connecting/hooks/DisconnectHook.tsx new file mode 100644 index 000000000..d82d33e77 --- /dev/null +++ b/packages/docs/examples/connecting/hooks/DisconnectHook.tsx @@ -0,0 +1,27 @@ +'use client'; +import { Box, Button, Text } from '@fuel-ui/react'; +import { useDisconnect, useIsConnected } from '@fuel-wallet/react'; + +import { ExampleBox } from '../../../src/components/ExampleBox'; + +export function DisconnectHook() { + const { isConnected } = useIsConnected(); + /* disconnect:start */ + const { disconnect, isLoading, error } = useDisconnect(); + /* disconnect:end */ + + return ( + + + + {!isConnected && 'You are not connected'} + + + ); +} diff --git a/packages/docs/examples/connecting/hooks/index.ts b/packages/docs/examples/connecting/hooks/index.ts new file mode 100644 index 000000000..869a542ff --- /dev/null +++ b/packages/docs/examples/connecting/hooks/index.ts @@ -0,0 +1,2 @@ +export * from './ConnectHook'; +export * from './DisconnectHook'; diff --git a/packages/docs/examples/connecting/index.tsx b/packages/docs/examples/connecting/index.tsx new file mode 100644 index 000000000..e204b314a --- /dev/null +++ b/packages/docs/examples/connecting/index.tsx @@ -0,0 +1,5 @@ +export * from './CheckWallet'; +export * from './Connect'; +export * from './Disconnect'; +export * from './CheckConnection'; +export * from './hooks'; diff --git a/packages/docs/examples/connectors/ListConnectors.tsx b/packages/docs/examples/connectors/ListConnectors.tsx new file mode 100644 index 000000000..24d703f6a --- /dev/null +++ b/packages/docs/examples/connectors/ListConnectors.tsx @@ -0,0 +1,55 @@ +/* eslint-disable no-console */ +import { Tag } from '@fuel-ui/react'; +import type { FuelConnector } from '@fuel-wallet/sdk'; +/* createInstance:start */ +import { + Fuel, + FuelWalletConnector, + FueletWalletConnector, + FuelWalletDevelopmentConnector, +} from '@fuel-wallet/sdk'; +import { useEffect, useState } from 'react'; // ignore-line + +import { ExampleBox } from '../../src/components/ExampleBox'; // ignore-line + +const fuel = new Fuel({ + connectors: [ + new FuelWalletDevelopmentConnector(), + new FueletWalletConnector(), + new FuelWalletConnector(), + ], +}); +/* createInstance:end */ + +export function ListConnectors() { + const [connectors, setConnectors] = useState>([]); + + useEffect(() => { + async function handleConnectors() { + /* listConnectors:start */ + const connectors = await fuel.connectors(); + console.log('available connectors', connectors); + + fuel.on(fuel.events.connectors, (connectors) => { + console.log('available connectors', connectors); + setConnectors(connectors); // ignore-line + }); + /* listConnectors:end */ + setConnectors(connectors); + } + handleConnectors(); + }, []); + + return ( + + {connectors.map((connector) => { + const label = `Installed: ${connector.installed} - Connected: ${connector.connected}`; + return ( + + {connector.name} - {label} + + ); + })} + + ); +} diff --git a/packages/docs/examples/connectors/SelectConnector.tsx b/packages/docs/examples/connectors/SelectConnector.tsx new file mode 100644 index 000000000..2a37f7a0c --- /dev/null +++ b/packages/docs/examples/connectors/SelectConnector.tsx @@ -0,0 +1,107 @@ +/* eslint-disable no-console */ +import { Alert, Box, Button, Input, Text } from '@fuel-ui/react'; +import { useFuel, useConnectors, useIsConnected } from '@fuel-wallet/react'; +import { useMemo, useState } from 'react'; +import { useLoading } from '~/src/hooks/useLoading'; + +import { ExampleBox } from '../../src/components/ExampleBox'; + +export function SelectConnector() { + const { fuel } = useFuel(); + const { isConnected } = useIsConnected(); + const { connectors } = useConnectors(); + const [selectedConnector, setCurrentConnector] = useState(''); + + const [selectConnector, selectingConnector, errorOnSelecting] = useLoading( + async (connectorName: string) => { + /* selectConnector:start */ + const isSelected = await fuel.selectConnector(connectorName); + console.log('isSelected', isSelected); + /* selectConnector:end */ + } + ); + + const [connectToConnector, connecting, errorOnConnect] = useLoading( + async () => { + /* connect:start */ + const connectionState = await fuel.connect(); + console.log('connectionState', connectionState); + /* connect:end */ + } + ); + + const [handleDisconnect, disconnecting, errorOnDisconnect] = useLoading( + async () => { + /* disconnect:start */ + const connectionState = await fuel.disconnect(); + console.log('connectionState', connectionState); + /* disconnect:end */ + } + ); + + const fuelConnector = useMemo(() => { + return fuel.getConnector(selectedConnector); + }, [selectedConnector]); + + return ( + + { + setCurrentConnector(e.target.value); + selectConnector(e.target.value); + }} + > + + {connectors.map((connector) => { + const label = `Installed: ${connector.installed} - Connected: ${connector.connected}`; + return ( + + ); + })} + + {fuelConnector && !fuelConnector.installed && ( + + + You need to install the {fuelConnector.name}. + + + )} + {fuelConnector && ( + + Metadata Available to the connector: + {JSON.stringify(fuelConnector?.metadata)} + + )} + {fuelConnector && ( + + + + + )} + + ); +} diff --git a/packages/docs/examples/connectors/hooks/ConnectorUIHook.tsx b/packages/docs/examples/connectors/hooks/ConnectorUIHook.tsx new file mode 100644 index 000000000..acce28320 --- /dev/null +++ b/packages/docs/examples/connectors/hooks/ConnectorUIHook.tsx @@ -0,0 +1,45 @@ +import { Box, Button } from '@fuel-ui/react'; +import { + useIsConnected, + useDisconnect, + useConnectUI, +} from '@fuel-wallet/react'; + +import { ExampleBox } from '../../../src/components/ExampleBox'; + +export function ConnectorUIHook() { + const { isConnected } = useIsConnected(); + /* useConnectors:start */ + const { connect, isConnecting, error } = useConnectUI(); + + function handleConnect() { + connect(); + } + /* useConnectors:end */ + const { + disconnect, + isLoading: disconnecting, + error: errorDisconnecting, + } = useDisconnect(); + + return ( + + + + + + + ); +} diff --git a/packages/docs/examples/connectors/hooks/SelectConnectorHook.tsx b/packages/docs/examples/connectors/hooks/SelectConnectorHook.tsx new file mode 100644 index 000000000..9f5beb1e4 --- /dev/null +++ b/packages/docs/examples/connectors/hooks/SelectConnectorHook.tsx @@ -0,0 +1,100 @@ +import { Alert, Box, Button, Input, Text } from '@fuel-ui/react'; +import { + useFuel, + useConnectors, + useIsConnected, + useConnect, + useDisconnect, +} from '@fuel-wallet/react'; +import { useMemo, useState } from 'react'; + +import { ExampleBox } from '../../../src/components/ExampleBox'; + +export function SelectConnectorHook() { + const { fuel } = useFuel(); + const { isConnected } = useIsConnected(); + /* useConnectors:start */ + const { connectors } = useConnectors(); + const { + connect, + isLoading: connecting, + error: errorConnecting, + } = useConnect(); + + function handleConnect(connectorName: string) { + connect(connectorName); + } + /* useConnectors:end */ + const { + disconnect, + isLoading: disconnecting, + error: errorDisconnecting, + } = useDisconnect(); + const [selectedConnector, setCurrentConnector] = useState(''); + + const fuelConnector = useMemo(() => { + return fuel.getConnector(selectedConnector); + }, [selectedConnector]); + + return ( + + { + setCurrentConnector(e.target.value); + connect(e.target.value); + }} + > + + {connectors.map((connector) => { + const label = `Installed: ${connector.installed} - Connected: ${connector.connected}`; + return ( + + ); + })} + + {fuelConnector && !fuelConnector.installed && ( + + + You need to install the {fuelConnector.name}. + + + )} + {fuelConnector && ( + + Metadata Available to the connector: + {JSON.stringify(fuelConnector?.metadata)} + + )} + {fuelConnector && ( + + + + + )} + + ); +} diff --git a/packages/docs/examples/connectors/hooks/index.tsx b/packages/docs/examples/connectors/hooks/index.tsx new file mode 100644 index 000000000..c7a18d7de --- /dev/null +++ b/packages/docs/examples/connectors/hooks/index.tsx @@ -0,0 +1,2 @@ +export * from './ConnectorUIHook'; +export * from './SelectConnectorHook'; diff --git a/packages/docs/examples/connectors/index.tsx b/packages/docs/examples/connectors/index.tsx new file mode 100644 index 000000000..d2bb42048 --- /dev/null +++ b/packages/docs/examples/connectors/index.tsx @@ -0,0 +1,3 @@ +export * from './ListConnectors'; +export * from './SelectConnector'; +export * from './hooks'; diff --git a/packages/docs/examples/events/Assets.tsx b/packages/docs/examples/events/Assets.tsx deleted file mode 100644 index 54cd03e84..000000000 --- a/packages/docs/examples/events/Assets.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import { cssObj } from '@fuel-ui/css'; -import { Box, Button, Tag, Text } from '@fuel-ui/react'; -import type { Asset } from '@fuel-wallet/sdk'; -import { useEffect, useState } from 'react'; - -import { ExampleBox } from '../../src/components/ExampleBox'; -import { useFuel } from '../../src/hooks/useFuel'; -import { useIsConnected } from '../../src/hooks/useIsConnected'; -import { useLoading } from '../../src/hooks/useLoading'; - -export function Assets() { - const [fuel, notDetected] = useFuel(); - const [assets, setAssets] = useState(); - const [isConnected] = useIsConnected(); - const [handleAssets, errorAssets] = useLoading(async () => { - const assets = await fuel.assets(); - setAssets(assets); - }); - - const [handleConnect, isConnecting, errorConnect] = useLoading(async () => { - await fuel.connect(); - }); - - /* eventAssets:start */ - const handleAssetsEvent = (assets: Asset[]) => { - setAssets(assets); - }; - - useEffect(() => { - fuel?.on(fuel.events.assets, handleAssetsEvent); - return () => { - fuel?.off(fuel.events.assets, handleAssetsEvent); - }; - }, [fuel]); - /* eventAssets:end */ - - useEffect(() => { - if (isConnected) handleAssets(); - }, [isConnected]); - - const errorMessage = errorAssets || notDetected || errorConnect; - - return ( - - - - All wallet assets: - {assets?.length ? ( - <> - {assets.map((asset) => ( - - - {asset.name} ({asset.symbol}): {asset.assetId} - - - ))} - - - Add / Edit / Remove assets in your Fuel wallet to test the - event. - - - - ) : ( - No assets - )} - {!isConnected && ( - - )} - - - - ); -} - -const styles = { - root: cssObj({ - gap: '$2', - display: 'inline-flex', - alignItems: 'flex-start', - '.fuel_Tag': { - justifyContent: 'flex-start', - - '& > p': { - fontSize: '$sm', - }, - }, - }), -}; diff --git a/packages/docs/examples/events/Connection.tsx b/packages/docs/examples/events/Connection.tsx deleted file mode 100644 index 3e58e1458..000000000 --- a/packages/docs/examples/events/Connection.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { Box, Button, Text } from '@fuel-ui/react'; - -import { ExampleBox } from '../../src/components/ExampleBox'; -import { useFuel } from '../../src/hooks/useFuel'; -import { useIsConnected } from '../../src/hooks/useIsConnected'; -import { useLoading } from '../../src/hooks/useLoading'; - -export function Connection() { - const [fuel, notDetected] = useFuel(); - const [isConnected] = useIsConnected(); - - const [handleConnect, isConnecting, errorConnect] = useLoading(async () => { - await fuel?.connect(); - }); - - const [handleDisconnect, isDisconnecting, errorDisconnect] = useLoading( - async () => { - await fuel?.disconnect(); - } - ); - - const errorMessage = errorConnect || errorDisconnect || notDetected; - - return ( - - - {isConnected ? ( - You are connected to the Fuel Wallet. - ) : ( - You are not connected to the Fuel Wallet. - )} - - - {!isConnected ? ( - - ) : null} - {isConnected ? ( - - ) : null} - - - ); -} diff --git a/packages/docs/examples/events/CurrentAccount.tsx b/packages/docs/examples/events/CurrentAccount.tsx index 4267f5fc1..1d2e06f7c 100644 --- a/packages/docs/examples/events/CurrentAccount.tsx +++ b/packages/docs/examples/events/CurrentAccount.tsx @@ -13,7 +13,7 @@ export function CurrentAccount() { const [isConnected] = useIsConnected(); const [handleCurrentAccount, errorCurrentAccount] = useLoading(async () => { const currentAccount = await fuel.currentAccount(); - setCurrentAccount(currentAccount); + setCurrentAccount(currentAccount || ''); }); const [handleConnect, isConnecting, errorConnect] = useLoading(async () => { diff --git a/packages/docs/examples/events/Network.tsx b/packages/docs/examples/events/Network.tsx index 7a50f9aa9..ea9bf7bd6 100644 --- a/packages/docs/examples/events/Network.tsx +++ b/packages/docs/examples/events/Network.tsx @@ -20,7 +20,7 @@ export function NetworkExample() { }); const [handleNetwork, errorNetwork] = useLoading(async () => { - const network = await fuel.network(); + const network = await fuel.currentNetwork(); setNetwork(network); }); @@ -30,10 +30,10 @@ export function NetworkExample() { }; useEffect(() => { - fuel?.on(fuel.events.network, handleNetworkChange); + fuel?.on(fuel.events.currentNetwork, handleNetworkChange); return () => { - fuel?.off(fuel.events.network, handleNetworkChange); + fuel?.off(fuel.events.currentNetwork, handleNetworkChange); }; }, [fuel]); /* network:end */ diff --git a/packages/docs/examples/events/index.tsx b/packages/docs/examples/events/index.tsx index ad1a8b8be..3a36b8b1a 100644 --- a/packages/docs/examples/events/index.tsx +++ b/packages/docs/examples/events/index.tsx @@ -1,13 +1,5 @@ -import { Accounts } from './Accounts'; -import { Assets } from './Assets'; -import { Connection } from './Connection'; -import { CurrentAccount } from './CurrentAccount'; import { NetworkExample as Network } from './Network'; export const Events = { - Connection, Network, - CurrentAccount, - Accounts, - Assets, }; diff --git a/packages/docs/examples/index.tsx b/packages/docs/examples/index.tsx index d047a9711..afe482135 100644 --- a/packages/docs/examples/index.tsx +++ b/packages/docs/examples/index.tsx @@ -1,15 +1,8 @@ -export { Connect } from './Connect'; -export { IsConnected } from './IsConnected'; -export { CurrentAccount } from './CurrentAccount'; -export { ListAccounts } from './ListAccounts'; -export { AddAssets } from './AddAssets'; -export { AddNetwork } from './AddNetwork'; -export { ListAssets } from './ListAssets'; -export { SignMessage } from './SignMessage'; -export { Transfer } from './Transfer'; +export * from './connecting'; +export * from './accounts'; +export * from './assets'; +export * from './networks'; +export * from './signMessage'; +export * from './abis'; +export * from './connectors'; export { Events } from './events'; -export { FuelLoaded } from './FuelLoaded'; -export { Abi } from './Abi'; -export { AddAbi } from './AddAbi'; -export { Network } from './Network'; -export { Connectors } from './Connectors'; diff --git a/packages/docs/examples/AddNetwork.tsx b/packages/docs/examples/networks/AddNetwork.tsx similarity index 57% rename from packages/docs/examples/AddNetwork.tsx rename to packages/docs/examples/networks/AddNetwork.tsx index 8acba7245..a2d6a2646 100644 --- a/packages/docs/examples/AddNetwork.tsx +++ b/packages/docs/examples/networks/AddNetwork.tsx @@ -1,61 +1,46 @@ /* eslint-disable no-console */ import { cssObj } from '@fuel-ui/css'; import { Box, Button, Input, Text } from '@fuel-ui/react'; +import { useFuel, useIsConnected } from '@fuel-wallet/react'; import { useState } from 'react'; -import type { Network } from '../../types/src'; -import { ExampleBox } from '../src/components/ExampleBox'; -import { useFuel } from '../src/hooks/useFuel'; -import { useIsConnected } from '../src/hooks/useIsConnected'; -import { useLoading } from '../src/hooks/useLoading'; +import { ExampleBox } from '../../src/components/ExampleBox'; +import { useLoading } from '../../src/hooks/useLoading'; export function AddNetwork() { - const [fuel, notDetected] = useFuel(); - const [isConnected] = useIsConnected(); - const [network, setNetwork] = useState({ - name: 'Localhost', - url: 'http://localhost:4000/graphql', - }); + const { fuel } = useFuel(); + const { isConnected } = useIsConnected(); + const [network, setNetwork] = useState( + 'http://localhost:4000/graphql' + ); const [handleAddNetwork, isAddingNetwork, errorAddingNetwork] = useLoading( - async (network: Network) => { + async (network: string) => { if (!isConnected) await fuel.connect(); - console.log('Add Network', network); /* addNetwork:start */ - await fuel.addNetwork(network); + console.log('Add Network', network); + const isAdded = await fuel.addNetwork(network); + console.log('Add Network result', isAdded); /* addNetwork:end */ } ); - const errorMessage = notDetected || errorAddingNetwork; - - const onChangeNetwork = (network: Network) => { + const onChangeNetwork = (network: string) => { setNetwork(network); }; return ( - + Network - - - onChangeNetwork({ ...network, name: e.target.value }) - } - placeholder="Type your network name" - /> - - onChangeNetwork({ ...network, url: e.target.value }) - } + defaultValue={network} + onBlur={(e) => onChangeNetwork(e.target.value)} placeholder="Type your network url" /> diff --git a/packages/docs/examples/Network.tsx b/packages/docs/examples/networks/CurrentNetwork.tsx similarity index 67% rename from packages/docs/examples/Network.tsx rename to packages/docs/examples/networks/CurrentNetwork.tsx index d7032a73b..45348d92c 100644 --- a/packages/docs/examples/Network.tsx +++ b/packages/docs/examples/networks/CurrentNetwork.tsx @@ -1,34 +1,31 @@ /* eslint-disable no-console */ import { cssObj } from '@fuel-ui/css'; import { Button, Box, Tag, Text } from '@fuel-ui/react'; +import { useFuel, useIsConnected } from '@fuel-wallet/react'; import { useState } from 'react'; -import type { FuelProviderConfig } from '../../types/src'; -import { ExampleBox } from '../src/components/ExampleBox'; -import { useFuel } from '../src/hooks/useFuel'; -import { useIsConnected } from '../src/hooks/useIsConnected'; -import { useLoading } from '../src/hooks/useLoading'; +import type { FuelProviderConfig } from '../../../types/src'; +import { ExampleBox } from '../../src/components/ExampleBox'; +import { useLoading } from '../../src/hooks/useLoading'; -export function Network() { - const [fuel, notDetected] = useFuel(); - const [isConnected] = useIsConnected(); +export function CurrentNetwork() { + const { fuel } = useFuel(); + const { isConnected } = useIsConnected(); const [network, setNetwork] = useState(); const [handleGetNetwork, isLoadingNetwork, errorGetNetwork] = useLoading( async () => { if (!isConnected) await fuel.connect(); console.log('Request the current network'); - /* example:start */ - const networkInfo = await fuel.network(); + /* currentNetwork:start */ + const networkInfo = await fuel.currentNetwork(); console.log('Network ', networkInfo); - /* example:end */ + /* currentNetwork:end */ setNetwork(networkInfo); } ); - const errorMessage = errorGetNetwork || notDetected; - return ( - + + + + + ); +} + +const styles = { + msg: cssObj({ + borderRadius: '$md', + height: 'auto', + maxWidth: 320, + wordBreak: 'break-all', + }), + wrapper: cssObj({ + gap: '$4', + }), + item: (isLast: boolean) => + cssObj({ + gap: '$2', + mb: isLast ? '0' : '$4', + }), + input: cssObj({ + width: '100%', + }), + itemHeader: cssObj({ + gap: '$2', + alignItems: 'center', + justifyContent: 'space-between', + }), +}; diff --git a/packages/docs/examples/networks/hooks/CurrentNetworkHook.tsx b/packages/docs/examples/networks/hooks/CurrentNetworkHook.tsx new file mode 100644 index 000000000..14facff83 --- /dev/null +++ b/packages/docs/examples/networks/hooks/CurrentNetworkHook.tsx @@ -0,0 +1,41 @@ +import { cssObj } from '@fuel-ui/css'; +import { Box, Tag, Text } from '@fuel-ui/react'; +import { useNetwork } from '@fuel-wallet/react'; + +import { ExampleBox } from '../../../src/components/ExampleBox'; + +export function CurrentNetworkHook() { + /* useNetwork:start */ + const { network } = useNetwork(); + /* useNetwork:end */ + + return ( + + + + {network && ( + + {network.url} + + )} + + + + ); +} + +const styles = { + root: cssObj({ + gap: '$2', + display: 'inline-flex', + alignItems: 'flex-start', + + '.fuel_tag': { + justifyContent: 'flex-start', + + '& > p': { + fontSize: '$xs', + }, + }, + }), +}; diff --git a/packages/docs/examples/networks/hooks/index.tsx b/packages/docs/examples/networks/hooks/index.tsx new file mode 100644 index 000000000..ad7cdf32e --- /dev/null +++ b/packages/docs/examples/networks/hooks/index.tsx @@ -0,0 +1,2 @@ +export * from './CurrentNetworkHook'; +export * from './AddNetworkHook'; diff --git a/packages/docs/examples/networks/index.tsx b/packages/docs/examples/networks/index.tsx new file mode 100644 index 000000000..1cb478ba4 --- /dev/null +++ b/packages/docs/examples/networks/index.tsx @@ -0,0 +1,3 @@ +export * from './hooks'; +export * from './AddNetwork'; +export * from './CurrentNetwork'; diff --git a/packages/docs/examples/SignMessage.tsx b/packages/docs/examples/signMessage/SignMessage.tsx similarity index 68% rename from packages/docs/examples/SignMessage.tsx rename to packages/docs/examples/signMessage/SignMessage.tsx index 9471e3826..cdff1f6b0 100644 --- a/packages/docs/examples/SignMessage.tsx +++ b/packages/docs/examples/signMessage/SignMessage.tsx @@ -1,17 +1,15 @@ /* eslint-disable no-console */ +import { cssObj } from '@fuel-ui/css'; import { Box, Button, Input, Tag } from '@fuel-ui/react'; +import { useFuel, useIsConnected } from '@fuel-wallet/react'; import { useState } from 'react'; -import { ExampleBox } from '../src/components/ExampleBox'; -import { useFuel } from '../src/hooks/useFuel'; -import { useIsConnected } from '../src/hooks/useIsConnected'; -import { useLoading } from '../src/hooks/useLoading'; - -import { docStyles } from './styles'; +import { ExampleBox } from '../../src/components/ExampleBox'; +import { useLoading } from '../../src/hooks/useLoading'; export function SignMessage() { - const [fuel, notDetected] = useFuel(); - const [isConnected] = useIsConnected(); + const { fuel } = useFuel(); + const { isConnected } = useIsConnected(); const [signedMessage, setSignedMessage] = useState(''); const [message, setMessage] = useState('Message to sign'); @@ -19,21 +17,21 @@ export function SignMessage() { async (message: string) => { if (!isConnected) await fuel.connect(); console.log('Request signature of message!'); - /* example:start */ - const accounts = await fuel.accounts(); - const account = accounts[0]; + /* signMessage:start */ + const account = await fuel.currentAccount(); + if (!account) { + throw new Error('Current account not authorized for this connection!'); + } const wallet = await fuel.getWallet(account); const signedMessage = await wallet.signMessage(message); console.log('Message signature', signedMessage); - /* example:end */ + /* signMessage:end */ setSignedMessage(signedMessage); } ); - const errorMessage = notDetected || errorSigningMessage; - return ( - + {signedMessage} @@ -67,3 +65,12 @@ export function SignMessage() { ); } + +const styles = { + feedbackTag: cssObj({ + borderRadius: '$md', + height: 'auto', + maxWidth: 320, + wordBreak: 'break-all', + }), +}; diff --git a/packages/docs/examples/signMessage/hooks/SignMessageHook.tsx b/packages/docs/examples/signMessage/hooks/SignMessageHook.tsx new file mode 100644 index 000000000..db05042fa --- /dev/null +++ b/packages/docs/examples/signMessage/hooks/SignMessageHook.tsx @@ -0,0 +1,88 @@ +/* eslint-disable no-console */ +import { cssObj } from '@fuel-ui/css'; +import { Box, Button, Input, Tag } from '@fuel-ui/react'; +import { + useConnect, + useFuel, + useIsConnected, + useWallet, +} from '@fuel-wallet/react'; +import { useState } from 'react'; + +import { ExampleBox } from '../../../src/components/ExampleBox'; +import { useLoading } from '../../../src/hooks/useLoading'; + +export function SignMessageHook() { + const { fuel } = useFuel(); + const { isConnected } = useIsConnected(); + const { connect, error: errorConnect } = useConnect(); + const [signedMessage, setSignedMessage] = useState(''); + const [message, setMessage] = useState('Message to sign'); + /* signMessage:start */ + const { wallet } = useWallet(); + + async function handleSignMessage(message: string) { + if (!isConnected) return connect(); // ignore-line + console.log('Request signature of message!'); + if (!wallet) { + throw new Error('Current wallet is not authorized for this connection!'); + } + const signedMessage = await wallet.signMessage(message); + console.log('Message signature', signedMessage); + return signedMessage; // ignore-line + } + /* signMessage:end */ + + const [handleSignMessageFn, isSingingMessage, errorSigningMessage] = + useLoading( + async (message: string) => { + const signedMessage = await handleSignMessage(message); + setSignedMessage(signedMessage || ''); + }, + [wallet] + ); + + return ( + + + + setMessage(e.target.value)} + placeholder="Type your title" + css={{ color: '$whiteA11', padding: '$2' }} + /> + + + + + {signedMessage && ( + + {signedMessage} + + )} + + + ); +} + +const styles = { + feedbackTag: cssObj({ + borderRadius: '$md', + height: 'auto', + maxWidth: 320, + wordBreak: 'break-all', + }), +}; diff --git a/packages/docs/examples/signMessage/hooks/index.tsx b/packages/docs/examples/signMessage/hooks/index.tsx new file mode 100644 index 000000000..5c6d8aeff --- /dev/null +++ b/packages/docs/examples/signMessage/hooks/index.tsx @@ -0,0 +1 @@ +export * from './SignMessageHook'; diff --git a/packages/docs/examples/signMessage/index.tsx b/packages/docs/examples/signMessage/index.tsx new file mode 100644 index 000000000..c5d0e8b5f --- /dev/null +++ b/packages/docs/examples/signMessage/index.tsx @@ -0,0 +1,2 @@ +export * from './hooks'; +export * from './SignMessage'; diff --git a/packages/docs/package.json b/packages/docs/package.json index 60413357b..d4a4e68be 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -17,6 +17,7 @@ "@fuel-ui/icons": "0.23.0", "@fuel-ui/react": "0.23.0", "@fuel-wallet/sdk": "workspace:*", + "@fuel-wallet/react": "workspace:*", "@mdx-js/react": "^2.3.0", "@next/mdx": "^13.5.4", "acorn": "^8.10.0", diff --git a/packages/docs/public/connectors-preview.png b/packages/docs/public/connectors-preview.png new file mode 100644 index 000000000..f34fc7b80 Binary files /dev/null and b/packages/docs/public/connectors-preview.png differ diff --git a/packages/docs/spell-check-custom-words.txt b/packages/docs/spell-check-custom-words.txt index e82415cff..b086ce6cf 100644 --- a/packages/docs/spell-check-custom-words.txt +++ b/packages/docs/spell-check-custom-words.txt @@ -93,4 +93,9 @@ env http localhost nvm -prerelease \ No newline at end of file +prerelease +UI +assetId +contractId +boolean + diff --git a/packages/docs/src/components/ExampleBox.tsx b/packages/docs/src/components/ExampleBox.tsx index c19237a7a..9c05b62a5 100644 --- a/packages/docs/src/components/ExampleBox.tsx +++ b/packages/docs/src/components/ExampleBox.tsx @@ -72,7 +72,7 @@ export function ExampleBox({ Check it working - {notDetected && !error && ( + {showNotDetectedOverlay && notDetected && !error && ( - - {children as any} - + + + {children as any} + + ); } diff --git a/packages/docs/src/components/SDKSection.tsx b/packages/docs/src/components/SDKSection.tsx new file mode 100644 index 000000000..ba5c3341c --- /dev/null +++ b/packages/docs/src/components/SDKSection.tsx @@ -0,0 +1,50 @@ +import { cssObj } from '@fuel-ui/css'; +import { Box, Button, Image, Text } from '@fuel-ui/react'; +import { useRouter } from 'next/navigation'; + +import connectorsPreviewImg from '../../public/connectors-preview.png'; + +export function SDKSection() { + const { push } = useRouter(); + + return ( + + + + + If you are a developer and want to integrate Fuel Wallet into your + DApp, you can do so by following the Fuel Wallet SDK. + + + + + + + ); +} + +const styles = { + text: cssObj({ + marginBottom: '$8', + }), + action: cssObj({ + flex: 1, + display: 'flex', + flexDirection: 'column', + alginItems: 'end', + marginTop: '$8', + }), + root: cssObj({ + pt: '2px', + pb: '3px', + mb: 100, + gap: '$12', + }), +}; diff --git a/packages/docs/src/constants.ts b/packages/docs/src/constants.ts index 32e9fbee7..a0a9c6a36 100644 --- a/packages/docs/src/constants.ts +++ b/packages/docs/src/constants.ts @@ -10,12 +10,12 @@ export const MENU_ORDER = [ 'For Developers/Connecting', 'For Developers/Accounts', 'For Developers/Assets', - 'For Developers/Networks', 'For Developers/Signing a Message', + 'For Developers/Networks', 'For Developers/ABIs', 'For Developers/Wallet Connectors', - 'For Developers/Reference', - 'For Developers/React Hooks Reference', + 'For Developers/API Reference', + 'For Developers/Hooks Reference', 'For Developers/Playwright Utils', 'Contributing/Project Structure', 'Contributing/Contributing Guide', diff --git a/packages/docs/src/hooks/useAssets.tsx b/packages/docs/src/hooks/useAssets.tsx deleted file mode 100644 index e1f9b277d..000000000 --- a/packages/docs/src/hooks/useAssets.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import type { Asset } from '@fuel-wallet/sdk'; -import { useEffect, useState } from 'react'; - -import { useFuel } from './useFuel'; -import { useIsConnected } from './useIsConnected'; - -export function useAssets() { - const [fuel] = useFuel(); - const [isConnected] = useIsConnected(); - const [assets, setAsset] = useState>([]); - - useEffect(() => { - if (!isConnected) return; - - const queryAssets = async () => { - const assets = await fuel.assets(); - setAsset(assets); - }; - - // Query assets - queryAssets(); - - fuel.on('assets', queryAssets); - return () => { - fuel.off('assets', queryAssets); - }; - }, [fuel, isConnected]); - - return assets; -} diff --git a/packages/docs/src/hooks/useFuel.tsx b/packages/docs/src/hooks/useFuel.tsx index 329dedfd1..d4f9088db 100644 --- a/packages/docs/src/hooks/useFuel.tsx +++ b/packages/docs/src/hooks/useFuel.tsx @@ -1,7 +1,13 @@ -import { Fuel } from '@fuel-wallet/sdk'; +import { + Fuel, + FuelWalletConnector, + FuelWalletDevelopmentConnector, +} from '@fuel-wallet/sdk'; import { useState, useEffect } from 'react'; -const fuelSDK = new Fuel(); +const fuelSDK = new Fuel({ + connectors: [new FuelWalletConnector(), new FuelWalletDevelopmentConnector()], +}); export function useFuel() { const [error, setError] = useState(''); @@ -9,21 +15,24 @@ export function useFuel() { useEffect(() => { fuelSDK - .hasWallet() + .hasConnector() .then((hasWallet) => { setError(hasWallet ? '' : 'fuel not detected on the window!'); setLoading(false); }) - .catch(() => {}); + .catch(() => { + setError('fuel not detected on the window!'); + setLoading(false); + }); const handleFuelLoad = () => { setLoading(false); setError(''); }; - fuelSDK.on(fuelSDK.events.load, handleFuelLoad); + fuelSDK.on(fuelSDK.events.currentConnector, handleFuelLoad); return () => { - fuelSDK.on(fuelSDK.events.load, handleFuelLoad); + fuelSDK.on(fuelSDK.events.currentConnector, handleFuelLoad); }; }, []); diff --git a/packages/docs/src/hooks/useIsConnected.tsx b/packages/docs/src/hooks/useIsConnected.tsx index 63955ce40..071b6b556 100644 --- a/packages/docs/src/hooks/useIsConnected.tsx +++ b/packages/docs/src/hooks/useIsConnected.tsx @@ -3,11 +3,12 @@ import { useEffect, useState } from 'react'; import { useFuel } from './useFuel'; export function useIsConnected() { - const [fuel] = useFuel(); + const [fuel, error, isLoading] = useFuel(); const [isConnected, setIsConnected] = useState(false); useEffect(() => { async function handleConnection() { + if (error || isLoading) return; const isConnected = await fuel.isConnected(); setIsConnected(isConnected); } @@ -22,7 +23,7 @@ export function useIsConnected() { fuel?.off(fuel.events.connection, handleConnection); }; /* eventConnection:end */ - }, [fuel]); + }, [fuel, isLoading]); return [isConnected]; } diff --git a/packages/docs/src/lib/code-import.ts b/packages/docs/src/lib/code-import.ts index 760a6dc90..9fee412c6 100644 --- a/packages/docs/src/lib/code-import.ts +++ b/packages/docs/src/lib/code-import.ts @@ -13,6 +13,7 @@ import { visit } from 'unist-util-visit'; const PACKAGE_FOLDER = 'packages'; const COMMENT_BLOCK_START = '/* example:start */'; const COMMENT_BLOCK_END = '/* example:end */'; +const COMMENT_IGNORE_LINE = '// ignore-line'; function toAST(content: string) { // Acorn Loose is a parser that is tolerant to errors @@ -44,7 +45,9 @@ function extractLines( } function extractCommentBlock(content: string, commentBlock?: string) { - const lines = content.split(EOL); + const lines = content + .split(EOL) + .filter((l) => !l.endsWith(COMMENT_IGNORE_LINE)); const commentStart = commentBlock ? COMMENT_BLOCK_START.replace('example', commentBlock) : COMMENT_BLOCK_START; diff --git a/packages/docs/src/nav.json b/packages/docs/src/nav.json index b4692e967..0a6812985 100644 --- a/packages/docs/src/nav.json +++ b/packages/docs/src/nav.json @@ -11,12 +11,12 @@ "Connecting", "Accounts", "Assets", - "Networks", "Signing a Message", + "Networks", "ABIs", "Wallet Connectors", - "Reference", - "React Hooks Reference", + "API Reference", + "Hooks Reference", "Playwright Utils" ], "contributing": [ diff --git a/packages/docs/src/types.ts b/packages/docs/src/types.ts index 2e3ffe7eb..aa991f945 100644 --- a/packages/docs/src/types.ts +++ b/packages/docs/src/types.ts @@ -1,4 +1,3 @@ -/// import type { MDXRemoteSerializeResult } from 'next-mdx-remote'; export type DocType = { diff --git a/packages/e2e-contract-tests/contracts/custom_asset/Forc.toml b/packages/e2e-contract-tests/contracts/custom_asset/Forc.toml index b775e3b75..4a1383fd2 100644 --- a/packages/e2e-contract-tests/contracts/custom_asset/Forc.toml +++ b/packages/e2e-contract-tests/contracts/custom_asset/Forc.toml @@ -5,6 +5,6 @@ license = "Apache-2.0" name = "custom_asset" [dependencies] -src20 = { git = "https://github.com/FuelLabs/sway-standards" } -src3 = { git = "https://github.com/FuelLabs/sway-standards" } -token = { git = "https://github.com/FuelLabs/sway-libs" } +src20 = { git = "https://github.com/FuelLabs/sway-standards", tag = "v0.3.3" } +src3 = { git = "https://github.com/FuelLabs/sway-standards", tag = "v0.3.3" } +token = { git = "https://github.com/FuelLabs/sway-libs", tag = "v0.17.2" } diff --git a/packages/e2e-contract-tests/package.json b/packages/e2e-contract-tests/package.json index 3e4f86a65..54338c84a 100644 --- a/packages/e2e-contract-tests/package.json +++ b/packages/e2e-contract-tests/package.json @@ -17,6 +17,7 @@ "fuels": "0.71.1", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-error-boundary": "^4.0.11", "react-hot-toast": "^2.4.1" }, "devDependencies": { diff --git a/packages/e2e-contract-tests/playwright.config.ts b/packages/e2e-contract-tests/playwright.config.ts index 05fc45548..24cc012a1 100644 --- a/packages/e2e-contract-tests/playwright.config.ts +++ b/packages/e2e-contract-tests/playwright.config.ts @@ -9,8 +9,8 @@ const config: PlaywrightTestConfig = defineConfig({ testDir: './playwright', retries: process.env.CI ? 2 : 0, workers: 1, - reporter: 'html', timeout: 60_000, + reporter: [['html', { printSteps: true }]], webServer: { command: `pnpm dev:e2e-contracts --mode test --port ${process.env.PORT}`, port: Number(process.env.PORT), diff --git a/packages/e2e-contract-tests/playwright/e2e/ForwardAndMintMulticall.test.ts b/packages/e2e-contract-tests/playwright/e2e/ForwardAndMintMulticall.test.ts index 8a2f7791f..30652d139 100644 --- a/packages/e2e-contract-tests/playwright/e2e/ForwardAndMintMulticall.test.ts +++ b/packages/e2e-contract-tests/playwright/e2e/ForwardAndMintMulticall.test.ts @@ -23,7 +23,7 @@ test.describe('Forward and Mint Multicall', () => { })); }); - test('e2e foreward and mint multicall', async ({ page }) => { + test('e2e forward and mint multicall', async ({ page }) => { await connect(page, fuelWalletTestHelper); const depositAmount = '1.000'; diff --git a/packages/e2e-contract-tests/playwright/e2e/ForwardHalfAndMint.test.ts b/packages/e2e-contract-tests/playwright/e2e/ForwardHalfAndMint.test.ts index 32befc6b7..cc1096398 100644 --- a/packages/e2e-contract-tests/playwright/e2e/ForwardHalfAndMint.test.ts +++ b/packages/e2e-contract-tests/playwright/e2e/ForwardHalfAndMint.test.ts @@ -23,7 +23,7 @@ test.describe('Forward Half ETH and Mint Custom Asset', () => { })); }); - test('e2e foreward half eth and mint custom asset', async ({ page }) => { + test('e2e forward half eth and mint custom asset', async ({ page }) => { await connect(page, fuelWalletTestHelper); const depositAmount = '1.000'; diff --git a/packages/e2e-contract-tests/playwright/e2e/utils/contract.ts b/packages/e2e-contract-tests/playwright/e2e/utils/contract.ts index fdd2010e1..a3fc70e27 100644 --- a/packages/e2e-contract-tests/playwright/e2e/utils/contract.ts +++ b/packages/e2e-contract-tests/playwright/e2e/utils/contract.ts @@ -1,12 +1,14 @@ import type { FuelWalletTestHelper } from '@fuel-wallet/playwright-utils'; -import { getButtonByText } from '@fuel-wallet/playwright-utils'; +import { getButtonByText, getByAriaLabel } from '@fuel-wallet/playwright-utils'; import type { Page } from '@playwright/test'; export const connect = async ( page: Page, - fuelWalletTestHelper: FuelWalletTestHelper + fuelWalletTestHelper: FuelWalletTestHelper, + walletName: string = 'Fuel Wallet' ) => { const connectButton = getButtonByText(page, 'Connect'); await connectButton.click(); + await getByAriaLabel(page, `Connect to ${walletName}`, true).click(); await fuelWalletTestHelper.walletConnect(); }; diff --git a/packages/e2e-contract-tests/src/components/AssetConfigurationCard.tsx b/packages/e2e-contract-tests/src/components/AssetConfigurationCard.tsx index 1cbc3cef3..ad7419763 100644 --- a/packages/e2e-contract-tests/src/components/AssetConfigurationCard.tsx +++ b/packages/e2e-contract-tests/src/components/AssetConfigurationCard.tsx @@ -10,8 +10,8 @@ export const AssetConfigurationCard = () => { subId: '', decimals: '', }); - const account = useAccount(); - const wallet = useWallet({ address: account.account }); + const { account } = useAccount(); + const wallet = useWallet(account); return (
diff --git a/packages/e2e-contract-tests/src/components/DepositAndMintMultiCall.tsx b/packages/e2e-contract-tests/src/components/DepositAndMintMultiCall.tsx index 172720ba2..0f20d93f0 100644 --- a/packages/e2e-contract-tests/src/components/DepositAndMintMultiCall.tsx +++ b/packages/e2e-contract-tests/src/components/DepositAndMintMultiCall.tsx @@ -7,8 +7,8 @@ import { depositAndMintMultiCall } from '../contract_interactions'; export const DepositAndMintMultiCalls = () => { const [forwardAmount, setForwardAmount] = useState(''); const [mintAmount, setMintAmount] = useState(''); - const account = useAccount(); - const wallet = useWallet({ address: account.account }); + const { account } = useAccount(); + const wallet = useWallet(account); return (
diff --git a/packages/e2e-contract-tests/src/components/DepositHalfEthCard.tsx b/packages/e2e-contract-tests/src/components/DepositHalfEthCard.tsx index 6bc9e63d0..87c8918b9 100644 --- a/packages/e2e-contract-tests/src/components/DepositHalfEthCard.tsx +++ b/packages/e2e-contract-tests/src/components/DepositHalfEthCard.tsx @@ -6,8 +6,8 @@ import { depositHalf } from '../contract_interactions'; export const DepositHalfEthCard = () => { const [amount, setAmount] = useState(''); - const account = useAccount(); - const wallet = useWallet({ address: account.account }); + const { account } = useAccount(); + const wallet = useWallet(account); return (
diff --git a/packages/e2e-contract-tests/src/components/ForwardCustomAssetCard.tsx b/packages/e2e-contract-tests/src/components/ForwardCustomAssetCard.tsx index 296ea1e67..ee18d01a5 100644 --- a/packages/e2e-contract-tests/src/components/ForwardCustomAssetCard.tsx +++ b/packages/e2e-contract-tests/src/components/ForwardCustomAssetCard.tsx @@ -8,8 +8,8 @@ import { calculateAssetId } from '../utils'; export const ForwardCustomAssetCard = () => { const [amount, setAmount] = useState(''); - const account = useAccount(); - const wallet = useWallet({ address: account.account }); + const { account } = useAccount(); + const wallet = useWallet(account); const assetId = calculateAssetId(MAIN_CONTRACT_ID, BaseAssetId); diff --git a/packages/e2e-contract-tests/src/components/ForwardEthCard.tsx b/packages/e2e-contract-tests/src/components/ForwardEthCard.tsx index 8d3d67c0b..1f27ea8d2 100644 --- a/packages/e2e-contract-tests/src/components/ForwardEthCard.tsx +++ b/packages/e2e-contract-tests/src/components/ForwardEthCard.tsx @@ -6,8 +6,8 @@ import { deposit } from '../contract_interactions'; export const ForwardEthCard = () => { const [amount, setAmount] = useState(''); - const account = useAccount(); - const wallet = useWallet({ address: account.account }); + const { account } = useAccount(); + const wallet = useWallet(account); return (
diff --git a/packages/e2e-contract-tests/src/components/ForwardHalfAndExternalMintCard.tsx b/packages/e2e-contract-tests/src/components/ForwardHalfAndExternalMintCard.tsx index 815871a71..4bd9bd7c9 100644 --- a/packages/e2e-contract-tests/src/components/ForwardHalfAndExternalMintCard.tsx +++ b/packages/e2e-contract-tests/src/components/ForwardHalfAndExternalMintCard.tsx @@ -7,8 +7,8 @@ import { depositHalfAndExternalMint } from '../contract_interactions'; export const ForwardHalfAndExternalMintCard = () => { const [forwardAmount, setForwardAmount] = useState(''); const [mintAmount, setMintAmount] = useState(''); - const account = useAccount(); - const wallet = useWallet({ address: account.account }); + const { account } = useAccount(); + const wallet = useWallet(account); return (
diff --git a/packages/e2e-contract-tests/src/components/ForwardHalfAndMintCard.tsx b/packages/e2e-contract-tests/src/components/ForwardHalfAndMintCard.tsx index 8769389d1..0dd87020b 100644 --- a/packages/e2e-contract-tests/src/components/ForwardHalfAndMintCard.tsx +++ b/packages/e2e-contract-tests/src/components/ForwardHalfAndMintCard.tsx @@ -7,8 +7,8 @@ import { depositHalfAndMint } from '../contract_interactions'; export const ForwardHalfAndMintCard = () => { const [forwardAmount, setForwardAmount] = useState(''); const [mintAmount, setMintAmount] = useState(''); - const account = useAccount(); - const wallet = useWallet({ address: account.account }); + const { account } = useAccount(); + const wallet = useWallet(account); return (
diff --git a/packages/e2e-contract-tests/src/components/ForwardHalfCustomAssetCard.tsx b/packages/e2e-contract-tests/src/components/ForwardHalfCustomAssetCard.tsx index 50a7aea77..cb45c66a5 100644 --- a/packages/e2e-contract-tests/src/components/ForwardHalfCustomAssetCard.tsx +++ b/packages/e2e-contract-tests/src/components/ForwardHalfCustomAssetCard.tsx @@ -8,8 +8,8 @@ import { calculateAssetId } from '../utils'; export const ForwardHalfCustomAssetCard = () => { const [amount, setAmount] = useState(''); - const account = useAccount(); - const wallet = useWallet({ address: account.account }); + const { account } = useAccount(); + const wallet = useWallet(account); const assetId = calculateAssetId(MAIN_CONTRACT_ID, BaseAssetId); diff --git a/packages/e2e-contract-tests/src/components/Header.tsx b/packages/e2e-contract-tests/src/components/Header.tsx index 13e7cb296..863868251 100644 --- a/packages/e2e-contract-tests/src/components/Header.tsx +++ b/packages/e2e-contract-tests/src/components/Header.tsx @@ -1,25 +1,7 @@ -import { - useConnect, - FUEL_WALLET_CONNECTOR, - FUEL_WALLET_DEVELOPMENT_CONNECTOR, -} from '@fuel-wallet/react'; - -import { IS_TEST } from '../config'; +import { useConnectUI } from '@fuel-wallet/react'; export const Header = () => { - const connect = useConnect(); + const { connect } = useConnectUI(); - return ( - - ); + return ; }; diff --git a/packages/e2e-contract-tests/src/components/MintAssetCard.tsx b/packages/e2e-contract-tests/src/components/MintAssetCard.tsx index 92b2b4004..10ec352f1 100644 --- a/packages/e2e-contract-tests/src/components/MintAssetCard.tsx +++ b/packages/e2e-contract-tests/src/components/MintAssetCard.tsx @@ -7,7 +7,7 @@ import { mint } from '../contract_interactions'; export const MintAssetCard = () => { const [amount, setAmount] = useState(''); const { account } = useAccount(); - const { wallet } = useWallet({ address: account }); + const { wallet } = useWallet(account); return (
@@ -21,7 +21,7 @@ export const MintAssetCard = () => { /> - - - ); -}; - -const styles = { - connectorTitle: cssObj({ - textAlign: 'center', - }), - connectorImage: cssObj({ - my: '$4', - height: '$28', - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - width: '$full', - - '& > img': { - maxHeight: '$full', - width: '$full', - }, - }), - connectorDescription: cssObj({ - fontWeight: '$normal', - textAlign: 'center', - color: '$intentsBase9', - }), - connectorFooter: cssObj({ - mt: '$6', - - '& > .fuel_Button': { - boxSizing: 'border-box', - width: '$full', - }, - }), -}; diff --git a/packages/react/src/ui/Connect/ConnectList.tsx b/packages/react/src/ui/Connect/ConnectList.tsx deleted file mode 100644 index 212a1fc12..000000000 --- a/packages/react/src/ui/Connect/ConnectList.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import { cssObj } from '@fuel-ui/css'; -import { Box, CardList, Image, Text } from '@fuel-ui/react'; - -import type { Connector, ConnectorList } from '../../types'; - -import { getImageUrl } from './utils/getImageUrl'; - -export type ConnectListProps = { - theme: string; - connectors: ConnectorList; - onPress: (connector: Connector) => void; -}; - -export const ConnectList = ({ - connectors, - theme, - onPress, -}: ConnectListProps) => { - return ( - - {connectors.map((connector, index) => ( - onPress(connector)} - aria-label={`Connect to ${connector.name}`} - data-theme={theme} - css={styles.connector} - tabIndex={index} - > - - {getImageUrl(theme, connector) && ( - {`${connector.name} - )} - - {connector.name} - - ))} - - ); -}; - -const styles = { - connector: cssObj({ - display: 'flex', - justifyContent: 'space-between', - alignItems: 'center', - cursor: 'pointer', - - '&[data-theme="dark"]': { - border: 0, - backgroundColor: '$intentsBase2', - }, - - '&:hover': { - backgroundColor: '$intentsBase3', - }, - }), - connectorImage: cssObj({ - height: '$8', - width: '$8', - '& > img': { - maxHeight: '$full', - width: '$full', - }, - }), -}; diff --git a/packages/react/src/ui/Connect/components/Connector/Connector.tsx b/packages/react/src/ui/Connect/components/Connector/Connector.tsx new file mode 100644 index 000000000..0469ef7b2 --- /dev/null +++ b/packages/react/src/ui/Connect/components/Connector/Connector.tsx @@ -0,0 +1,43 @@ +import type { FuelConnector } from '@fuel-wallet/sdk'; + +import { ConnectorIcon } from '../ConnectorIcon'; + +import { + ConnectorButton, + ConnectorContent, + ConnectorDescription, + ConnectorImage, + ConnectorTitle, +} from './styles'; + +type ConnectorProps = { + theme?: string; + className?: string; + connector: FuelConnector; +}; + +export function Connector({ className, connector, theme }: ConnectorProps) { + const { + install: { action, link, description }, + } = connector.metadata; + + return ( +
+ + + + + {connector.name} + {description} + + + {action || 'Install'} + +
+ ); +} diff --git a/packages/react/src/ui/Connect/components/Connector/styles.tsx b/packages/react/src/ui/Connect/components/Connector/styles.tsx new file mode 100644 index 000000000..f5c7988df --- /dev/null +++ b/packages/react/src/ui/Connect/components/Connector/styles.tsx @@ -0,0 +1,52 @@ +import styled from 'styled-components'; + +export const ConnectorTitle = styled.h2` + text-align: center; + font-size: 1.2em; + font-weight: 500; + color: var(--fuel-color-bold); + margin: 0 0 0.8em 0; +`; + +export const ConnectorDescription = styled.p` + text-align: center; + margin: 0 1.2em; + line-height: 1.2em; +`; + +export const ConnectorImage = styled.div` + display: flex; + justify-content: center; + height: 6.2em; + width: 100%; + margin-top: 1.4em; + margin-bottom: 1.2em; +`; + +export const ConnectorButton = styled.a` + display: flex; + box-sizing: border-box; + text-decoration: none; + justify-content: center; + align-items: center; + margin-top: 1.4em; + width: 100%; + padding: 0.6em 1em; + font-size: 1.1em; + color: var(--fuel-color-bold); + border-radius: var(--fuel-border-radius); + background-color: var(--fuel-button-background); + + &:visited { + color: var(--fuel-color-bold); + } + + &:hover { + background-color: var(--fuel-button-background-hover); + } +`; + +export const ConnectorContent = styled.div` + display: flex; + flex-direction: column; +`; diff --git a/packages/react/src/ui/Connect/components/ConnectorIcon.tsx b/packages/react/src/ui/Connect/components/ConnectorIcon.tsx new file mode 100644 index 000000000..b6416415a --- /dev/null +++ b/packages/react/src/ui/Connect/components/ConnectorIcon.tsx @@ -0,0 +1,35 @@ +import type { ConnectorMetadata } from '@fuel-wallet/sdk'; + +import type { SvgIconProps } from '../../types'; +import { FuelWalletDevelopmentIcon } from '../icons/FuelWalletDevelopmentIcon'; +import { FuelWalletIcon } from '../icons/FuelWalletIcon'; +import { FueletIcon } from '../icons/FueletIcon'; +import { getImageUrl } from '../utils/getImageUrl'; + +type ConnectorIconProps = { + connectorName: string; + connectorMetadata: ConnectorMetadata; +} & SvgIconProps; + +export function ConnectorIcon({ + connectorName, + connectorMetadata, + ...props +}: ConnectorIconProps) { + switch (connectorName) { + case 'Fuelet Wallet': + return ; + case 'Fuel Wallet': + return ; + case 'Fuel Wallet Development': + return ; + default: + return connectorMetadata.image ? ( + + ) : null; + } +} diff --git a/packages/react/src/ui/Connect/components/Connectors/Connectors.tsx b/packages/react/src/ui/Connect/components/Connectors/Connectors.tsx new file mode 100644 index 000000000..61966bfcd --- /dev/null +++ b/packages/react/src/ui/Connect/components/Connectors/Connectors.tsx @@ -0,0 +1,41 @@ +import { useConnectUI } from '../../../../providers/FuelUIProvider'; +import { ConnectorIcon } from '../ConnectorIcon'; + +import { ConnectorsLoader } from './ConnectorsLoader'; +import { ConnectorItem, ConnectorList, ConnectorName } from './styles'; + +export function Connectors() { + const { + connectors, + isLoading, + theme, + dialog: { connect }, + } = useConnectUI(); + + return ( + + {connectors.map((connector, index) => ( + { + e.preventDefault(); + connect(connector); + }} + > + + {connector.name} + + ))} + {isLoading && } + + ); +} diff --git a/packages/react/src/ui/Connect/components/Connectors/ConnectorsLoader.tsx b/packages/react/src/ui/Connect/components/Connectors/ConnectorsLoader.tsx new file mode 100644 index 000000000..d0c65dc26 --- /dev/null +++ b/packages/react/src/ui/Connect/components/Connectors/ConnectorsLoader.tsx @@ -0,0 +1,21 @@ +import { PlaceholderLoader } from '../../styles'; + +import { ConnectorItem, ConnectorName } from './styles'; + +type ConnectorsLoaderProps = { + items: number; +}; + +export function ConnectorsLoader({ items }: ConnectorsLoaderProps) { + const itemsArray = Array.from({ length: items }); + return itemsArray.map((_, index) => ( + + +
+ + + Fuel Wallet + + + )); +} diff --git a/packages/react/src/ui/Connect/components/Connectors/index.tsx b/packages/react/src/ui/Connect/components/Connectors/index.tsx new file mode 100644 index 000000000..94ee3fbcf --- /dev/null +++ b/packages/react/src/ui/Connect/components/Connectors/index.tsx @@ -0,0 +1 @@ +export * from './Connectors'; diff --git a/packages/react/src/ui/Connect/components/Connectors/styles.tsx b/packages/react/src/ui/Connect/components/Connectors/styles.tsx new file mode 100644 index 000000000..afcc17e0e --- /dev/null +++ b/packages/react/src/ui/Connect/components/Connectors/styles.tsx @@ -0,0 +1,40 @@ +import styled from 'styled-components'; + +export const ConnectorItem = styled.div` + display: flex; + align-items: center; + background-color: transparent; + box-sizing: border-box; + cursor: pointer; + width: 100%; + color: var(--fuel-font-color); + gap: var(--fuel-items-gap); + padding: 0.8em; + border: var(--fuel-border); + border-radius: var(--fuel-border-radius); + transition: background-color border-color opacity 50ms + cubic-bezier(0.16, 1, 0.3, 1); + + &:active { + opacity: 0.8; + } + &:hover { + border-color: var(--fuel-border-hover); + background-color: var(--fuel-connector-hover); + } +`; + +export const ConnectorList = styled.div` + display: flex; + flex-direction: column; + align-items: center; + gap: var(--fuel-items-gap); +`; + +export const ConnectorName = styled.div` + font-size: var(--fuel-font-size); +`; + +export const ConnectorImg = styled.img` + object-fit: cover; +`; diff --git a/packages/react/src/ui/Connect/connectors.ts b/packages/react/src/ui/Connect/connectors.ts deleted file mode 100644 index a655fb84d..000000000 --- a/packages/react/src/ui/Connect/connectors.ts +++ /dev/null @@ -1,47 +0,0 @@ -import type { Connector, ConnectorList } from '../../types'; - -export const FUEL_WALLET_CONNECTOR: Connector = { - name: 'Fuel Wallet', - image: '/connectors/fuel-wallet.svg', - connector: 'Fuel Wallet', - install: { - action: 'Install', - description: 'To connect your Fuel Wallet, install the browser extension.', - link: 'https://chrome.google.com/webstore/detail/fuel-wallet/dldjpboieedgcmpkchcjcbijingjcgok', - }, - installed: false, -}; - -export const FUEL_WALLET_DEVELOPMENT_CONNECTOR: Connector = { - name: 'Fuel Wallet Development', - image: '/connectors/fuel-wallet-dev.svg', - connector: 'Fuel Wallet Development', - install: { - action: 'Install', - description: - 'To connect your Fuel Wallet Development, install the browser extension.', - link: 'https://chrome.google.com/webstore/detail/fuel-wallet-development/hcgmehahnlbhpilepakbdinkhhaackmc', - }, - installed: false, -}; - -export const FUELET_CONNECTOR: Connector = { - name: 'Fuelet Wallet', - image: { - light: '/connectors/fuelet-light.svg', - dark: '/connectors/fuelet-dark.svg', - }, - connector: 'Fuelet Wallet', - install: { - action: 'Install', - description: 'Install Fuelet Wallet in order to connect it.', - link: 'https://fuelet.app/download/', - }, - installed: false, -}; - -export const DEFAULT_CONNECTORS: ConnectorList = [ - FUEL_WALLET_CONNECTOR, - FUEL_WALLET_DEVELOPMENT_CONNECTOR, - FUELET_CONNECTOR, -]; diff --git a/packages/react/src/ui/Connect/icons/BackIcon.tsx b/packages/react/src/ui/Connect/icons/BackIcon.tsx new file mode 100644 index 000000000..5cb134aa4 --- /dev/null +++ b/packages/react/src/ui/Connect/icons/BackIcon.tsx @@ -0,0 +1,15 @@ +import type { SvgIconProps } from '../../types'; + +export function BackIcon({ size, ...props }: SvgIconProps) { + return ( + + + + ); +} diff --git a/packages/react/src/ui/Connect/icons/CloseIcon.tsx b/packages/react/src/ui/Connect/icons/CloseIcon.tsx new file mode 100644 index 000000000..3da6b6844 --- /dev/null +++ b/packages/react/src/ui/Connect/icons/CloseIcon.tsx @@ -0,0 +1,15 @@ +import type { SvgIconProps } from '../../../ui/types'; + +export function CloseIcon({ size, ...props }: SvgIconProps) { + return ( + + + + ); +} diff --git a/packages/react/src/ui/Connect/icons/FuelWalletDevelopmentIcon.tsx b/packages/react/src/ui/Connect/icons/FuelWalletDevelopmentIcon.tsx new file mode 100644 index 000000000..ce6ee5963 --- /dev/null +++ b/packages/react/src/ui/Connect/icons/FuelWalletDevelopmentIcon.tsx @@ -0,0 +1,26 @@ +import type { SvgIconProps } from '../../types'; + +export function FuelWalletDevelopmentIcon({ size, ...props }: SvgIconProps) { + return ( + + + + + ); +} diff --git a/packages/react/src/ui/Connect/icons/FuelWalletIcon.tsx b/packages/react/src/ui/Connect/icons/FuelWalletIcon.tsx new file mode 100644 index 000000000..7b1ccc63a --- /dev/null +++ b/packages/react/src/ui/Connect/icons/FuelWalletIcon.tsx @@ -0,0 +1,26 @@ +import type { SvgIconProps } from '../../types'; + +export function FuelWalletIcon({ size, ...props }: SvgIconProps) { + return ( + + + + + ); +} diff --git a/packages/react/src/ui/Connect/icons/FueletIcon.tsx b/packages/react/src/ui/Connect/icons/FueletIcon.tsx new file mode 100644 index 000000000..96520ea63 --- /dev/null +++ b/packages/react/src/ui/Connect/icons/FueletIcon.tsx @@ -0,0 +1,19 @@ +import type { SvgIconProps } from '../../../ui/types'; + +export function FueletIcon({ theme, size, ...props }: SvgIconProps) { + return ( + + + + ); +} diff --git a/packages/react/src/ui/Connect/index.ts b/packages/react/src/ui/Connect/index.ts deleted file mode 100644 index 8edac5fba..000000000 --- a/packages/react/src/ui/Connect/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './Connect'; -export * from './connectors'; diff --git a/packages/react/src/ui/Connect/index.tsx b/packages/react/src/ui/Connect/index.tsx new file mode 100644 index 000000000..88d13753c --- /dev/null +++ b/packages/react/src/ui/Connect/index.tsx @@ -0,0 +1,57 @@ +import * as Dialog from '@radix-ui/react-dialog'; +import { useRef } from 'react'; + +import { useConnectUI } from '../../providers/FuelUIProvider'; + +import { Connector } from './components/Connector/Connector'; +import { Connectors } from './components/Connectors'; +import { + DialogContent, + BackIcon, + CloseIcon, + DialogOverlay, + DialogTitle, + DialogMain, + FuelRoot, +} from './styles'; +import { getThemeVariables } from './themes'; + +export function Connect() { + const containerRef = useRef(null); + const { + theme, + cancel, + dialog: { isOpen, connector, back }, + } = useConnectUI(); + + const handleOpenChange = (openState: boolean) => { + if (!openState) cancel(); + }; + + return ( + <> + + + + + + Connect Wallet + + + + + + {connector ? : } + + + + + + ); +} diff --git a/packages/react/src/ui/Connect/styles.tsx b/packages/react/src/ui/Connect/styles.tsx new file mode 100644 index 000000000..ae99f46de --- /dev/null +++ b/packages/react/src/ui/Connect/styles.tsx @@ -0,0 +1,160 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import * as Dialog from '@radix-ui/react-dialog'; +import styled, { keyframes } from 'styled-components'; + +import { BackIcon as CBackIcon } from './icons/BackIcon'; +import { CloseIcon as CCloseIcon } from './icons/CloseIcon'; + +const overlayShow = keyframes` + from { + opacity: 0; + } + to { + opacity: 1; + } +`; + +const contentShow = keyframes` + from { + opacity: 0; + transform: translate(-50%, -48%) scale(0.96); + } + to { + opacity: 1; + transform: translate(-50%, -50%) scale(1); + } +`; + +const placeholderLoader = keyframes` + 0%{ + background-position: -468px 0 + } + 100%{ + background-position: 468px 0 + } +`; + +export const DialogOverlay = styled(Dialog.Overlay)` + background-color: var(--fuel-overlay-background); + position: fixed; + inset: 0; + animation: ${overlayShow} 150ms cubic-bezier(0.16, 1, 0.3, 1); +`; + +export const DialogContent = styled(Dialog.Content)` + overflow: hidden; + color: var(--fuel-color); + user-select: none; + width: 300px; + max-width: calc(100% - 20px); + max-height: calc(100% - 20px); + box-sizing: border-box; + background-color: var(--fuel-dialog-background); + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + border-radius: var(--fuel-border-radius); + padding: 14px; + padding-bottom: 18px; + animation: ${contentShow} 150ms cubic-bezier(0.16, 1, 0.3, 1); + box-shadow: + hsl(206 22% 7% / 35%) 0px 10px 38px -10px, + hsl(206 22% 7% / 20%) 0px 10px 20px -15px; + + &:focus { + outline: none; + } +` as any as typeof Dialog.Content; + +export const DialogTitle = styled(Dialog.Title)` + margin: 0; + font-weight: normal; + text-align: center; + font-size: 16px; +`; + +export const DialogMain = styled.div` + margin-top: 20px; + position: relative; +`; + +export const BackIcon = styled(CBackIcon)` + fill: var(--fuel-color); + padding: 4px; + opacity: 0.5; + font-family: inherit; + border-radius: 100%; + display: flex; + align-items: center; + justify-content: center; + position: absolute; + top: 10px; + left: 10px; + cursor: pointer; + + &[data-connector='false'] { + display: none; + } + + &:hover, + &:active { + background-color: var(--mauve-1); + opacity: 1; + } +`; + +export const CloseIcon = styled(CCloseIcon)` + fill: var(--fuel-color); + padding: 4px; + opacity: 0.5; + font-family: inherit; + border-radius: 100%; + display: flex; + align-items: center; + justify-content: center; + position: absolute; + top: 10px; + right: 10px; + cursor: pointer; + + &:hover, + &:active { + background-color: var(--mauve-1); + opacity: 1; + } +`; + +export const FuelRoot = styled.div` + position: fixed; + top: 0; + left: 0; + bottom: 0; + right: 0; + height: 100%; + width: 100%; + margin: 0; + padding: 0; + z-index: 9999; + font-size: var(--fuel-font-size); + + & * { + font-family: var(--fuel-font-family); + } +`; + +export const PlaceholderLoader = styled.div` + animation-duration: 1s; + animation-fill-mode: forwards; + animation-iteration-count: infinite; + animation-name: ${placeholderLoader}; + animation-timing-function: linear; + background: #d1d5d9; + background: linear-gradient(to right, #eeeeee 8%, #dddddd 18%, #eeeeee 33%); + background-size: 1000px 104px; + height: fit-content; + position: relative; + overflow: hidden; + color: transparent !important; + pointer-events: none !important; +`; diff --git a/packages/react/src/ui/Connect/themes.tsx b/packages/react/src/ui/Connect/themes.tsx new file mode 100644 index 000000000..42a1a676e --- /dev/null +++ b/packages/react/src/ui/Connect/themes.tsx @@ -0,0 +1,48 @@ +const commonTheme = { + /* Fonts */ + '--fuel-font-family': + '"SF Pro Rounded",ui-rounded,"Nunito",-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,"Apple Color Emoji",Arial,sans-serif,"Segoe UI Emoji","Segoe UI Symbol"', + '--fuel-font-size': '16px', + '--fuel-color': 'hsla(0, 0%, 56.08%, 1)', + /* Spacing */ + '--fuel-border-radius': '6px', + '--fuel-items-gap': '8px', + /* Border */ + '--fuel-border': '1px solid var(--fuel-border-color)', +}; + +const lightTheme = { + '--fuel-color-bold': '#000000', + '--fuel-dialog-background': 'white', + '--fuel-overlay-background': 'rgba(71,88,107,0.24)', + '--fuel-connector-hover': 'rgb(241 243 244)', + '--fuel-border-color': 'hsl(210deg 9.52% 83.53%)', + '--fuel-border-hover': 'hsla(0, 0%, 78.04%, 1)', + '--fuel-button-background': 'rgb(226 230 233)', + '--fuel-button-background-hover': 'rgb(203 205 207)', +}; + +const darkTheme = { + '--fuel-color-bold': '#ffffff', + '--fuel-dialog-background': 'hsla(0,0%,8.63%,1)', + '--fuel-overlay-background': 'rgba(0,0,0,0.6)', + '--fuel-connector-hover': 'hsl(0deg 0% 18.77%)', + '--fuel-border-color': 'hsl(0deg 0% 18.77%)', + '--fuel-border-hover': 'hsla(0, 0%, 50%, 1)', + '--fuel-button-background': 'hsla(0, 0%, 30%, 1)', + '--fuel-button-background-hover': 'hsla(0, 0%, 40%, 1)', +}; + +type CustomTheme = Partial; + +export const getThemeVariables = ( + theme: 'light' | 'dark' | string, + customTheme?: CustomTheme +) => { + const colorTheme = theme === 'dark' ? darkTheme : lightTheme; + return { + ...commonTheme, + ...colorTheme, + ...customTheme, + }; +}; diff --git a/packages/react/src/ui/Connect/utils/getImageUrl.tsx b/packages/react/src/ui/Connect/utils/getImageUrl.tsx index 10a32f9e3..b1af115be 100644 --- a/packages/react/src/ui/Connect/utils/getImageUrl.tsx +++ b/packages/react/src/ui/Connect/utils/getImageUrl.tsx @@ -1,8 +1,9 @@ -import type { Connector } from '../../../types'; +import type { ConnectorMetadata } from '@fuel-wallet/sdk'; -export const getImageUrl = (theme: string, connector: Connector) => { - if (typeof connector.image === 'object') { - return theme === 'dark' ? connector.image.dark : connector.image.light; +export const getImageUrl = (connector: ConnectorMetadata, theme?: string) => { + const { image } = connector; + if (typeof image === 'object') { + return theme === 'dark' ? image.dark : image.light; } - return connector.image; + return image; }; diff --git a/packages/react/src/ui/connect.stories.tsx b/packages/react/src/ui/connect.stories.tsx deleted file mode 100644 index f6d33174c..000000000 --- a/packages/react/src/ui/connect.stories.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { cssObj } from '@fuel-ui/css'; -import { Box, Button, Text } from '@fuel-ui/react'; - -import { - FuelProvider, - useAccount, - useConnector, - Connect, - FuelConnectorProvider, -} from '../index'; - -export default { - component: Connect, - title: 'Connect', - parameters: { - layout: 'fullscreen', - }, -}; - -const FuelContainer = () => { - const { account } = useAccount(); - const { connect, isConnecting } = useConnector(); - - return ( - <> - - {account} - - ); -}; - -export const Usage = () => ( - - - - - - - -); - -const styles = { - storybook: cssObj({ - margin: '20px', - }), -}; diff --git a/packages/react/src/ui/index.ts b/packages/react/src/ui/index.ts deleted file mode 100644 index 75ef3b20b..000000000 --- a/packages/react/src/ui/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './Connect'; diff --git a/packages/react/src/ui/types.ts b/packages/react/src/ui/types.ts new file mode 100644 index 000000000..66dc473c8 --- /dev/null +++ b/packages/react/src/ui/types.ts @@ -0,0 +1,6 @@ +export type SvgIconProps = { + theme?: string; + className?: string; + onClick?: () => void; + size: number; +}; diff --git a/packages/react/src/utils/queryKeys.ts b/packages/react/src/utils/queryKeys.ts index 3d2423594..52fb57939 100644 --- a/packages/react/src/utils/queryKeys.ts +++ b/packages/react/src/utils/queryKeys.ts @@ -1,6 +1,7 @@ export const QUERY_KEYS = { account: 'account', accounts: 'accounts', + assets: 'assets', chain: 'chain', isConnected: 'isConnected', provider: 'provider', @@ -11,8 +12,11 @@ export const QUERY_KEYS = { nodeInfo: 'nodeInfo', connectorList: 'connectorList', currentConnector: 'currentConnector', + currentNetwork: 'currentNetwork', }; export const MUTATION_KEYS = { connect: 'connect', + addAssets: 'addAssets', + addNetwork: 'addNetwork', }; diff --git a/packages/react/src/utils/selectCurrentConnector.ts b/packages/react/src/utils/selectCurrentConnector.ts index 08f88d5fc..1e440b4a2 100644 --- a/packages/react/src/utils/selectCurrentConnector.ts +++ b/packages/react/src/utils/selectCurrentConnector.ts @@ -1,17 +1,17 @@ -import type { Fuel, FuelWalletConnector } from '@fuel-wallet/sdk'; +import type { Fuel, FuelConnector } from '@fuel-wallet/sdk'; import { CONNECTOR_KEY } from '../config'; export function selectCurrentConnector( fuel: Fuel, - connectors: Array + connectors: Array ) { // If a connector is already select wait for it to be available // on the connectors list and select it as a connector const currentConnector = localStorage.getItem(CONNECTOR_KEY); if (!currentConnector) return; const hasConnector = connectors.find((c) => c.name === currentConnector); - const isCurrentConnector = fuel.connectorName === currentConnector; + const isCurrentConnector = fuel.currentConnector()?.name === currentConnector; if (!hasConnector || isCurrentConnector) return; // Select current connector return fuel.selectConnector(currentConnector); diff --git a/packages/react/tsconfig.json b/packages/react/tsconfig.json index 56aa7531d..88e0cf039 100644 --- a/packages/react/tsconfig.json +++ b/packages/react/tsconfig.json @@ -4,8 +4,7 @@ "keyofStringsOnly": true, "outDir": "./dist", "baseUrl": ".", - "rootDir": ".", - "types": ["jest"] + "rootDir": "." }, "include": ["**/*.ts", "**/*.tsx"], "exclude": ["**/*.test.ts"] diff --git a/packages/react/tsup.config.ts b/packages/react/tsup.config.ts index 7d3537ac9..08134c2c0 100644 --- a/packages/react/tsup.config.ts +++ b/packages/react/tsup.config.ts @@ -7,7 +7,7 @@ const options: Options = { splitting: false, dts: true, format: ['cjs', 'esm'], - minify: process.env.NODE_ENV === 'production', + minify: true, entry: ['src/index.ts'], }; diff --git a/packages/sdk-v2/README.md b/packages/sdk-v2/README.md deleted file mode 100644 index 3823b1770..000000000 --- a/packages/sdk-v2/README.md +++ /dev/null @@ -1,3 +0,0 @@ -## Fuel Wallet SDK version 2.0 - -> This is a work in progress version of the new Fuel Wallet SDK. Please only use this version if you are actively looking to test it. This version is not compatible with the current versions of Fuel Wallet and Fuel Wallet Development. diff --git a/packages/sdk-v2/jest.config.ts b/packages/sdk-v2/jest.config.ts deleted file mode 100644 index 9337dd94a..000000000 --- a/packages/sdk-v2/jest.config.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { JestConfigWithTsJest } from 'ts-jest'; -import { defaultsESM as tsjPreset } from 'ts-jest/presets'; - -import pkg from './package.json'; - -const config: JestConfigWithTsJest = { - displayName: pkg.name, - extensionsToTreatAsEsm: ['.ts', '.tsx'], - modulePathIgnorePatterns: ['dist'], - rootDir: __dirname, - transform: tsjPreset.transform, - setupFilesAfterEnv: ['./jest.setup.ts'], - clearMocks: true, - moduleFileExtensions: ['js', 'ts'], - testEnvironment: 'jsdom', - preset: 'ts-jest', - testMatch: ['./**/*.test.ts'], - testRunner: 'jest-circus/runner', - verbose: true, - globals: { - window: {}, - }, -}; - -export default config; diff --git a/packages/sdk-v2/src/Fuel.ts b/packages/sdk-v2/src/Fuel.ts deleted file mode 100644 index 1e433aaaf..000000000 --- a/packages/sdk-v2/src/Fuel.ts +++ /dev/null @@ -1,425 +0,0 @@ -import type { AbstractAddress } from 'fuels'; - -import { FuelWalletConnector } from './FuelWalletConnector'; -import { FuelWalletLocked } from './FuelWalletLocked'; -import { FuelWalletProvider } from './FuelWalletProvider'; -import { FuelConnectorEventTypes, FuelConnectorMethods } from './api'; -import { FuelConnectorEvent } from './types'; -import type { - FuelConnectorEventsType, - FuelStorage, - Network, - TargetObject, -} from './types'; -import type { CacheFor } from './utils'; -import { cacheFor, deferPromise, withTimeout } from './utils'; - -// This is the time to wait for the connector -// to be available before returning false for hasConnector. -const HAS_CONNECTOR_TIMEOUT = 2_000; -// The time to cache the ping result, as is not -// expected to change the availability of the connector to -// change too often we can safely cache the result for 5 seconds -// at minimum. -const PING_CACHE_TIME = 5_000; - -export type FuelConfig = { - connectors?: Array; - storage?: FuelStorage | null; - targetObject?: TargetObject; -}; - -export type FuelConnectorSelectOptions = { - emitEvents?: boolean; -}; - -export class Fuel extends FuelWalletConnector { - static STORAGE_KEY = 'fuel-current-connector'; - - private _storage?: FuelStorage | null = null; - private _connectors: Array = []; - private _targetObject: TargetObject | null = null; - private _unsubscribes: Array<() => void> = []; - private _targetUnsubscribe: () => void; - private _pingCache: CacheFor = {}; - private _currentConnector?: FuelWalletConnector | null; - - constructor(config: FuelConfig = {}) { - super(); - // Increase the limit of listeners - this.setMaxListeners(1_000); - // Set all connectors - this._connectors = config.connectors ?? []; - // Set the target object to listen for global events - this._targetObject = this.getTargetObject(config.targetObject); - // Set default storage - this._storage = - config.storage === undefined ? this.getStorage() : config.storage; - // Setup all methods - this.setupMethods(); - // Get the current connector from the storage - this.setDefaultConnector(); - // Setup new connector listener for global events - this._targetUnsubscribe = this.setupConnectorListener(); - } - - /** - * Return the target object to listen for global events. - */ - private getTargetObject(targetObject?: TargetObject) { - if (targetObject) return targetObject; - if (typeof window !== 'undefined') return window; - if (typeof document !== 'undefined') return document; - return null; - } - - /** - * Return the storage used. - */ - private getStorage() { - if (typeof window !== 'undefined') return window.localStorage; - return undefined; - } - - /** - * Setup the default connector from the storage. - */ - private setDefaultConnector() { - const connectorName = - this._storage?.getItem(Fuel.STORAGE_KEY) || this._connectors[0]?.name; - if (connectorName) { - // Setup all events for the current connector - return this.selectConnector(connectorName, { - emitEvents: false, - }); - } - } - - /** - * Start listener for all the events of the current - * connector and emit them to the Fuel instance - */ - private setupConnectorEvents(events: string[]) { - if (!this._currentConnector) return; - const currentConnector = this._currentConnector; - this._unsubscribes.map((unSub) => unSub()); - this._unsubscribes = events.map((event) => { - const handler = (...args: unknown[]) => this.emit(event, ...args); - currentConnector.on(event as FuelConnectorEventsType, handler); - return () => currentConnector.off(event, handler); - }); - } - - /** - * Call method from the current connector. - */ - private async callMethod(method: string, ...args: unknown[]) { - const hasConnector = await this.hasConnector(); - await this.pingConnector(); - if (!this._currentConnector || !hasConnector) { - throw new Error('No current connector.'); - } - if (typeof this._currentConnector[method] === 'function') { - return this._currentConnector[method](...args); - } else { - new Error(`Method ${method} is not available for the connector.`); - } - } - - /** - * Create a method for each method proxy that is available on the Common interface - * and call the method from the current connector. - */ - private setupMethods() { - Object.values(FuelConnectorMethods).map((method) => { - this[method] = async (...args: unknown[]) => - this.callMethod(method, ...args); - }); - } - - /** - * Fetch the status of a connector and set the installed and connected - * status. - */ - private async fetchConnectorStatus(connector: FuelWalletConnector) { - const [isConnected, ping] = await Promise.allSettled([ - connector.isConnected(), - withTimeout(this.pingConnector(connector)), - ]); - connector.installed = ping.status === 'fulfilled'; - connector.connected = - isConnected.status === 'fulfilled' && isConnected.value; - return { - installed: connector.installed, - connected: connector.connected, - }; - } - - /** - * Fetch the status of all connectors and set the installed and connected - * status. - */ - private async fetchConnectorsStatus() { - return Promise.all( - this._connectors.map(async (connector) => { - return this.fetchConnectorStatus(connector); - }) - ); - } - - /** - * Fetch the status of a connector and set the installed and connected - * status. If no connector is provided it will ping the current connector. - */ - private async pingConnector(connector?: FuelWalletConnector) { - const { _currentConnector: currentConnector } = this; - if (!currentConnector) return false; - // If finds a ping in the cache and the value is true - // return from cache - try { - const _connector = connector ?? currentConnector; - return await cacheFor( - async () => { - return withTimeout(_connector.ping()); - }, - { - key: _connector.name, - cache: this._pingCache, - cacheTime: PING_CACHE_TIME, - } - )(); - } catch { - throw new Error('Current connector is not available.'); - } - } - - /** - * Setup a listener for the FuelConnector event and add the connector - * to the list of new connectors. - */ - private setupConnectorListener = () => { - const { _targetObject: targetObject } = this; - const eventName = FuelConnectorEvent.type; - if (targetObject?.on) { - targetObject.on(eventName, this.addConnector); - return () => { - targetObject.off?.(eventName, this.addConnector); - }; - } - if (targetObject?.addEventListener) { - const handler = (e: FuelConnectorEvent) => { - this.addConnector(e.detail); - }; - targetObject.addEventListener(eventName, handler); - return () => { - targetObject.removeEventListener?.(eventName, handler); - }; - } - return () => {}; - }; - - /** - * Add a new connector to the list of connectors. - */ - private addConnector = async (connector: FuelWalletConnector) => { - if (!this.getConnector(connector)) { - this._connectors.push(connector); - await this.fetchConnectorStatus(connector); - // Emit connectors events once the connector list changes - this.emit(this.events.connectors, this._connectors); - // If the current connector is not set - if (!this._currentConnector) { - // set the new connector as currentConnector - await this.selectConnector(connector.name, { - emitEvents: false, - }); - } - } - }; - - private triggerConnectorEvents = async () => { - const [isConnected, networks, currentNetwork] = await Promise.all([ - this.isConnected(), - this.networks(), - this.currentNetwork(), - ]); - this.emit(this.events.connection, isConnected); - this.emit(this.events.networks, networks); - this.emit(this.events.currentNetwork, currentNetwork); - if (isConnected) { - const [accounts, currentAccount] = await Promise.all([ - this.accounts(), - this.currentAccount(), - ]); - this.emit(this.events.accounts, accounts); - this.emit(this.events.currentAccount, currentAccount); - } - }; - - /** - * Get a connector from the list of connectors. - */ - getConnector = ( - connector: FuelWalletConnector | string - ): FuelWalletConnector | null => { - return ( - this._connectors.find((c) => { - const connectorName = - typeof connector === 'string' ? connector : connector.name; - return c.name === connectorName || c === connector; - }) || null - ); - }; - - /** - * Return the list of connectors with the status of installed and connected. - */ - async connectors(): Promise> { - await this.fetchConnectorsStatus(); - return this._connectors; - } - - /** - * Set the current connector to be used. - */ - async selectConnector( - connectorName: string, - options: FuelConnectorSelectOptions = { - emitEvents: true, - } - ): Promise { - const connector = this.getConnector(connectorName); - if (!connector) return false; - if (this._currentConnector?.name === connectorName) return true; - const { installed } = await this.fetchConnectorStatus(connector); - if (installed) { - this._currentConnector = connector; - this.emit(this.events.currentConnector, connector); - this.setupConnectorEvents(Object.values(FuelConnectorEventTypes)); - this._storage?.setItem(Fuel.STORAGE_KEY, connector.name); - // If emitEvents is true we query all the data from the connector - // and emit the events to the Fuel instance allowing the application to - // react to changes in the connector state. - if (options.emitEvents) { - this.triggerConnectorEvents(); - } - } - return true; - } - - /** - * Return the current selected connector. - */ - currentConnector() { - return this._currentConnector; - } - - /** - * Return true if any connector is available. - */ - async hasConnector(): Promise { - // If there is a current connector return true - // as the connector is ready - if (this._currentConnector) return true; - // If there is no current connector - // wait for the current connector to be set - // for 1 second and return false if is not set - const defer = deferPromise(); - this.once(this.events.currentConnector, () => { - defer.resolve(true); - }); - // As the max ping time is 1 second we wait for 2 seconds - // to allow applications to react to the current connector - return withTimeout(defer.promise, HAS_CONNECTOR_TIMEOUT) - .then(() => true) - .catch(() => false); - } - - /** - * Return a Fuel Provider instance with extends features to work with - * connectors. - * - * @deprecated Provider is going to be deprecated in the future. - */ - async getProvider( - providerOrNetwork?: FuelWalletProvider | Network - ): Promise { - if (process.env.NODE_ENV !== 'production') { - // eslint-disable-next-line no-console - console.warn( - 'Get provider is deprecated, use getWallet instead. Provider is going to be removed in the future.' - ); - } - return this._getProvider(providerOrNetwork); - } - - /** - * Return a Fuel Provider instance with extends features to work with - * connectors. - */ - private async _getProvider( - providerOrNetwork?: FuelWalletProvider | Network - ): Promise { - // Decide which provider to use based on the providerOrNetwork - let provider: FuelWalletProvider; - // If provider is a valid instance of a Provider use it - if (providerOrNetwork && 'getTransactionResponse' in providerOrNetwork) { - provider = providerOrNetwork; - // If the provided param is a valid network use it - } else if ( - providerOrNetwork && - 'chainId' in providerOrNetwork && - 'url' in providerOrNetwork - ) { - provider = await FuelWalletProvider.create(providerOrNetwork.url); - // If nor provider or network is provided use the current network - } else if (!providerOrNetwork) { - const currentNetwork = await this.currentNetwork(); - provider = await FuelWalletProvider.create(currentNetwork.url); - // If a provider or network was informed but is not valid - // throw an error - } else { - throw new Error('Provider is not valid.'); - } - return provider; - } - - /** - * Return a Fuel Wallet Locked instance with extends features to work with - * connectors. - */ - async getWallet( - address: string | AbstractAddress, - providerOrNetwork?: FuelWalletProvider | Network - ): Promise { - const provider = await this._getProvider(providerOrNetwork); - return new FuelWalletLocked(address, this, provider); - } - - /** - * Remove all open listeners this is useful when you want to - * remove the Fuel instance and avoid memory leaks. - */ - unsubscribe() { - // Unsubscribe from all events - this._unsubscribes.map((unSub) => unSub()); - this._targetUnsubscribe(); - // Remove all listeners from fuel instance - this.removeAllListeners(); - } - - /** - * Clean all the data from the storage. - */ - clean() { - this._storage?.removeItem(Fuel.STORAGE_KEY); - } - - /** - * Removes all listeners and clean the storage. - */ - destroy() { - this.unsubscribe(); - this.clean(); - } -} diff --git a/packages/sdk-v2/src/FuelWalletLocked.ts b/packages/sdk-v2/src/FuelWalletLocked.ts deleted file mode 100644 index cd0ebe68d..000000000 --- a/packages/sdk-v2/src/FuelWalletLocked.ts +++ /dev/null @@ -1,38 +0,0 @@ -import type { - AbstractAddress, - TransactionRequestLike, - TransactionResponse, -} from 'fuels'; -import { WalletLocked } from 'fuels'; - -import type { FuelWalletConnector } from './FuelWalletConnector'; -import type { FuelWalletProvider } from './FuelWalletProvider'; - -export class FuelWalletLocked extends WalletLocked { - connector: FuelWalletConnector; - provider: FuelWalletProvider; - - constructor( - address: string | AbstractAddress, - connector: FuelWalletConnector, - provider: FuelWalletProvider - ) { - super(address, provider); - this.connector = connector; - this.provider = provider; - } - - async signMessage(message: string): Promise { - return this.connector.signMessage(this.address.toString(), message); - } - - async sendTransaction( - transaction: TransactionRequestLike - ): Promise { - const transactionId = await this.connector.sendTransaction( - this.address.toString(), - transaction - ); - return this.provider.getTransactionResponse(transactionId); - } -} diff --git a/packages/sdk-v2/src/FuelWalletProvider.ts b/packages/sdk-v2/src/FuelWalletProvider.ts deleted file mode 100644 index d12ecd923..000000000 --- a/packages/sdk-v2/src/FuelWalletProvider.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type { ProviderOptions } from 'fuels'; -import { TransactionResponse, Provider } from 'fuels'; - -/** - * @todo: We should add getTransactionResponse to TS-SDK in this way - * a provider becomes self contained enabling connectors to implement - * their on providers for customized responses. - * - * With the change we can remove the entire FuelWalletProvider. - */ -export class FuelWalletProvider extends Provider { - constructor(url: string, options?: ProviderOptions) { - super(url, options); - } - - static async create( - url: string, - options?: ProviderOptions | undefined - ): Promise { - const provider = new FuelWalletProvider(url, options); - await provider.fetchChainAndNodeInfo(); - return provider; - } - - async getTransactionResponse( - transactionId: string - ): Promise { - return new TransactionResponse(transactionId, this); - } -} diff --git a/packages/sdk-v2/src/index.ts b/packages/sdk-v2/src/index.ts deleted file mode 100644 index 930c4eefd..000000000 --- a/packages/sdk-v2/src/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from './api'; -export * from './types'; -export * from './Fuel'; -export * from './FuelWalletConnector'; -export * from './FuelWalletProvider'; -export * from './FuelWalletLocked'; diff --git a/packages/sdk-v2/src/utils/index.ts b/packages/sdk-v2/src/utils/index.ts deleted file mode 100644 index 75332af49..000000000 --- a/packages/sdk-v2/src/utils/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './cache'; -export * from './promise'; diff --git a/packages/sdk/.env.test b/packages/sdk/.env.test deleted file mode 100644 index d8aba1abb..000000000 --- a/packages/sdk/.env.test +++ /dev/null @@ -1,2 +0,0 @@ -PUBLIC_PROVIDER_URL=http://localhost:4001/graphql -PUBLIC_GENESIS_SECRET=0xa449b1ffee0e2205fa924c6740cc48b3b473aa28587df6dab12abc245d1f5298 diff --git a/packages/sdk/CHANGELOG.md b/packages/sdk/CHANGELOG.md index 474ca52c7..18ea3f630 100644 --- a/packages/sdk/CHANGELOG.md +++ b/packages/sdk/CHANGELOG.md @@ -345,4 +345,4 @@ - [#195](https://github.com/FuelLabs/fuels-wallet/pull/195) [`3bba661`](https://github.com/FuelLabs/fuels-wallet/commit/3bba661ba5dc97933bb1a2e7605e30bd280ec780) Thanks [@luizstacio](https://github.com/luizstacio)! - Include Request Transaction in SDK methods -- [#195](https://github.com/FuelLabs/fuels-wallet/pull/195) [`3bba661`](https://github.com/FuelLabs/fuels-wallet/commit/3bba661ba5dc97933bb1a2e7605e30bd280ec780) Thanks [@luizstacio](https://github.com/luizstacio)! - Add FuelWeb3Provider, for using it in combination with fuels-ts SDK +- [#195](https://github.com/FuelLabs/fuels-wallet/pull/195) [`3bba661`](https://github.com/FuelLabs/fuels-wallet/commit/3bba661ba5dc97933bb1a2e7605e30bd280ec780) Thanks [@luizstacio](https://github.com/luizstacio)! - Add FuelWeb3Provider, for using it in combination with fuels-ts SDK \ No newline at end of file diff --git a/packages/sdk/LICENSE b/packages/sdk/LICENSE index 261eeb9e9..c61b66391 100644 --- a/packages/sdk/LICENSE +++ b/packages/sdk/LICENSE @@ -2,180 +2,180 @@ Version 2.0, January 2004 http://www.apache.org/licenses/ - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" @@ -186,16 +186,16 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] +Copyright [yyyy] [name of copyright owner] - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/packages/sdk/README.md b/packages/sdk/README.md index 645629314..6eacf7679 100644 --- a/packages/sdk/README.md +++ b/packages/sdk/README.md @@ -1,10 +1,9 @@ -[![build](https://github.com/FuelLabs/fuels-wallet/actions/workflows/gh-pages.yml/badge.svg)](https://github.com/FuelLabs/fuels-wallet/actions/workflows/gh-pages.yml) [![discord](https://img.shields.io/badge/chat%20on-discord-orange?&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/xfpK4Pe) ![twitter](https://img.shields.io/twitter/follow/SwayLang?style=social) # ⚡️ Fuel Wallet SDK -The Fuel Wallet SDK enables developers to integrate their DApps with the Fuel Wallet using the injected `window.fuel` object. It also provides TypeScript types for better type checking and code completion. +The Fuel Wallet SDK enables developers to integrate their DApps with all available Wallets on Fuel Network. ## Installation @@ -14,22 +13,21 @@ npm install fuels @fuel-wallet/sdk Note that the fuels package is also required as a dependency for better integration with other applications built using the [Fuels TS SDK](https://github.com/FuelLabs/fuels-ts). -## TypeScript Setup - -To use the SDK in your TypeScript project, add the following line to your tsconfig.json file: - -```json -{ - "compilerOptions": { - "types": ["@fuel-wallet/sdk"] - } -} -``` - -Alternatively, you can use a [TypeScript reference](https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html) directive in any TypeScript file: +## Getting Started ```ts -/// +import { Fuel, FuelWalletConnector } from '@fuel-wallet/sdk'; + +const fuel = new Fuel({ + connectors: [new FuelWalletConnector()], +}); + +// Returns true if any connector is available +// this means the user has a Wallet installed also.. if this don't return true +// User do not have a wallet. +await fuel.hasConnector(); +// Request connection to the Wallet Application. +await fuel.connect(); ``` ## 📜 License diff --git a/packages/sdk/jest.config.ts b/packages/sdk/jest.config.ts index 7d5394e9d..9337dd94a 100644 --- a/packages/sdk/jest.config.ts +++ b/packages/sdk/jest.config.ts @@ -1,7 +1,6 @@ import type { JestConfigWithTsJest } from 'ts-jest'; import { defaultsESM as tsjPreset } from 'ts-jest/presets'; -import './load.envs'; import pkg from './package.json'; const config: JestConfigWithTsJest = { @@ -10,9 +9,11 @@ const config: JestConfigWithTsJest = { modulePathIgnorePatterns: ['dist'], rootDir: __dirname, transform: tsjPreset.transform, + setupFilesAfterEnv: ['./jest.setup.ts'], clearMocks: true, moduleFileExtensions: ['js', 'ts'], - testEnvironment: 'node', + testEnvironment: 'jsdom', + preset: 'ts-jest', testMatch: ['./**/*.test.ts'], testRunner: 'jest-circus/runner', verbose: true, diff --git a/packages/sdk-v2/jest.setup.ts b/packages/sdk/jest.setup.ts similarity index 100% rename from packages/sdk-v2/jest.setup.ts rename to packages/sdk/jest.setup.ts diff --git a/packages/sdk/load.envs.ts b/packages/sdk/load.envs.ts deleted file mode 100644 index eda0bbdd1..000000000 --- a/packages/sdk/load.envs.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { config } from 'dotenv'; -import { resolve } from 'path'; - -function getEnvName() { - if (process.env.NODE_ENV === 'production') { - return '.env.production'; - } - if (process.env.NODE_ENV === 'test') { - return '.env.test'; - } -} - -// Load from more specific env file to generic -> -[getEnvName(), '.env'].forEach((envFile) => { - if (!envFile) return; - config({ - path: resolve(__dirname, envFile), - }); -}); - -export function getPublicEnvs() { - const WHITELIST = ['NODE_ENV', 'PUBLIC_URL']; - return Object.fromEntries( - Object.entries(process.env).filter(([key]) => - WHITELIST.some((k) => k === key || key.match(/^PUBLIC_/)) - ) - ); -} diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 870ffc552..3b8dec2e7 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -24,24 +24,19 @@ "scripts": { "build": "pnpm ts:check && tsup", "ts:check": "tsc --noEmit", - "test": "jest --verbose", - "xstate:typegen": "xstate typegen 'src/**/*.ts?(x)'" + "test": "jest --verbose" }, "dependencies": { "@fuel-wallet/types": "workspace:*", - "dexie-observable": "4.0.1-beta.13", "events": "^3.3.0", - "json-rpc-2.0": "^1.6.0", - "uuid": "^9.0.1", - "xstate": "^4.38.2" + "json-rpc-2.0": "^1.6.0" }, "peerDependencies": { "fuels": ">=0.71.1" }, "devDependencies": { - "@types/uuid": "^9.0.5", "fuels": "0.71.1", - "jest-webextension-mock": "^3.8.9", + "jest-environment-jsdom": "29.6.2", "tsup": "^7.2.0" } } diff --git a/packages/sdk/src/Fuel.ts b/packages/sdk/src/Fuel.ts index 19558f194..87d50d327 100644 --- a/packages/sdk/src/Fuel.ts +++ b/packages/sdk/src/Fuel.ts @@ -1,83 +1,452 @@ -import { FuelWalletEvents } from '@fuel-wallet/types'; -import { Address } from 'fuels'; import type { AbstractAddress } from 'fuels'; -import { FuelWalletConnection } from './FuelWalletConnection'; +import { FuelConnector } from './FuelConnector'; import { FuelWalletLocked } from './FuelWalletLocked'; import { FuelWalletProvider } from './FuelWalletProvider'; +import { + FuelConnectorEventType, + FuelConnectorEventTypes, + FuelConnectorMethods, +} from './api'; +import { defaultConnectors } from './connectors'; +import type { + FuelConnectorEventsType, + FuelStorage, + Network, + TargetObject, +} from './types'; +import type { CacheFor } from './utils'; +import { cacheFor, deferPromise, withTimeout } from './utils'; -// Isolate the provider instance to prevent -// developers from replacing the provider -// instance with a new one -const FuelWeb3Privates: { - provider?: FuelWalletProvider; -} = {}; - -export class Fuel extends FuelWalletConnection { - readonly utils = { - // TODO: remove createAddress once fuels-ts replace input - // class address with string. The warn message is to avoid - // developers to use this method. - createAddress: (address: string) => { - // eslint-disable-next-line no-console - console.warn( - 'Do not use this method! It will be removed in the next release.' +// This is the time to wait for the connector +// to be available before returning false for hasConnector. +const HAS_CONNECTOR_TIMEOUT = 2_000; +// The time to cache the ping result, as is not +// expected to change the availability of the connector to +// change too often we can safely cache the result for 5 seconds +// at minimum. +const PING_CACHE_TIME = 5_000; + +export type FuelConfig = { + connectors?: Array; + storage?: FuelStorage | null; + targetObject?: TargetObject; + devMode?: boolean; +}; + +export type FuelConnectorSelectOptions = { + emitEvents?: boolean; +}; + +export class Fuel extends FuelConnector { + static STORAGE_KEY = 'fuel-current-connector'; + static defaultConfig: FuelConfig = {}; + private _storage?: FuelStorage | null = null; + private _connectors: Array = []; + private _targetObject: TargetObject | null = null; + private _unsubscribes: Array<() => void> = []; + private _targetUnsubscribe: () => void; + private _pingCache: CacheFor = {}; + private _currentConnector?: FuelConnector | null; + + constructor(config: FuelConfig = Fuel.defaultConfig) { + super(); + // Increase the limit of listeners + this.setMaxListeners(1_000); + // Set all connectors + this._connectors = + config.connectors ?? + defaultConnectors({ + devMode: config.devMode, + }); + // Set the target object to listen for global events + this._targetObject = this.getTargetObject(config.targetObject); + // Set default storage + this._storage = + config.storage === undefined ? this.getStorage() : config.storage; + // Setup all methods + this.setupMethods(); + // Get the current connector from the storage + this.setDefaultConnector(); + // Setup new connector listener for global events + this._targetUnsubscribe = this.setupConnectorListener(); + } + + /** + * Return the target object to listen for global events. + */ + private getTargetObject(targetObject?: TargetObject) { + if (targetObject) return targetObject; + if (typeof window !== 'undefined') return window; + if (typeof document !== 'undefined') return document; + return null; + } + + /** + * Return the storage used. + */ + private getStorage() { + if (typeof window !== 'undefined') return window.localStorage; + return undefined; + } + + /** + * Setup the default connector from the storage. + */ + private setDefaultConnector() { + const connectorName = + this._storage?.getItem(Fuel.STORAGE_KEY) || this._connectors[0]?.name; + if (connectorName) { + // Setup all events for the current connector + return this.selectConnector(connectorName, { + emitEvents: false, + }); + } + } + + /** + * Start listener for all the events of the current + * connector and emit them to the Fuel instance + */ + private setupConnectorEvents(events: string[]) { + if (!this._currentConnector) return; + const currentConnector = this._currentConnector; + this._unsubscribes.map((unSub) => unSub()); + this._unsubscribes = events.map((event) => { + const handler = (...args: unknown[]) => this.emit(event, ...args); + currentConnector.on(event as FuelConnectorEventsType, handler); + return () => currentConnector.off(event, handler); + }); + } + + /** + * Call method from the current connector. + */ + private async callMethod(method: string, ...args: unknown[]) { + const hasConnector = await this.hasConnector(); + await this.pingConnector(); + if (!this._currentConnector || !hasConnector) { + throw new Error( + `No connector selected for calling ${method}. Use hasConnector before executing other methods.` ); - return Address.fromString(address); - }, + } + if (typeof this._currentConnector[method] === 'function') { + return this._currentConnector[method](...args); + } else { + new Error(`Method ${method} is not available for the connector.`); + } + } + + /** + * Create a method for each method proxy that is available on the Common interface + * and call the method from the current connector. + */ + private setupMethods() { + Object.values(FuelConnectorMethods).map((method) => { + this[method] = async (...args: unknown[]) => + this.callMethod(method, ...args); + }); + } + + /** + * Fetch the status of a connector and set the installed and connected + * status. + */ + private async fetchConnectorStatus( + connector: FuelConnector & { _latestUpdate?: number } + ) { + // Control fetch status to avoid rewriting the status + // on late responses in this way even if a response is + // late we can avoid rewriting the status of the connector + const requestTimestamp = Date.now(); + const [isConnected, ping] = await Promise.allSettled([ + withTimeout(connector.isConnected()), + withTimeout(this.pingConnector(connector)), + ]); + // If the requestTimestamp is greater than the latest update + // we can ignore the response as is treated as stale. + const isStale = requestTimestamp < (connector._latestUpdate || 0); + if (!isStale) { + connector._latestUpdate = Date.now(); + connector.installed = ping.status === 'fulfilled' && ping.value; + connector.connected = + isConnected.status === 'fulfilled' && isConnected.value; + } + return { + installed: connector.installed, + connected: connector.connected, + }; + } + + /** + * Fetch the status of all connectors and set the installed and connected + * status. + */ + private async fetchConnectorsStatus() { + return Promise.all( + this._connectors.map(async (connector) => { + return this.fetchConnectorStatus(connector); + }) + ); + } + + /** + * Fetch the status of a connector and set the installed and connected + * status. If no connector is provided it will ping the current connector. + */ + private async pingConnector(connector?: FuelConnector) { + const { _currentConnector: currentConnector } = this; + const _connector = connector ?? currentConnector; + if (!_connector) return false; + // If finds a ping in the cache and the value is true + // return from cache + try { + return await cacheFor( + async () => { + return withTimeout(_connector.ping()); + }, + { + key: _connector.name, + cache: this._pingCache, + cacheTime: PING_CACHE_TIME, + } + )(); + } catch { + throw new Error('Current connector is not available.'); + } + } + + /** + * Setup a listener for the FuelConnector event and add the connector + * to the list of new connectors. + */ + private setupConnectorListener = () => { + const { _targetObject: targetObject } = this; + const eventName = FuelConnectorEventType; + if (targetObject?.on) { + targetObject.on(eventName, this.addConnector); + return () => { + targetObject.off?.(eventName, this.addConnector); + }; + } + if (targetObject?.addEventListener) { + const handler = (e: CustomEvent) => { + this.addConnector(e.detail); + }; + targetObject.addEventListener(eventName, handler); + return () => { + targetObject.removeEventListener?.(eventName, handler); + }; + } + return () => {}; }; - // Externalize events names - readonly events = FuelWalletEvents; + /** + * Add a new connector to the list of connectors. + */ + private addConnector = async (connector: FuelConnector) => { + if (!this.getConnector(connector)) { + this._connectors.push(connector); + } + // Fetch the status of the new connector + await this.fetchConnectorStatus(connector); + // Emit connectors events once the connector list changes + this.emit(this.events.connectors, this._connectors); + // If the current connector is not set + if (!this._currentConnector) { + // set the new connector as currentConnector + await this.selectConnector(connector.name, { + emitEvents: false, + }); + } + }; - async getProvider(): Promise { - // TODO: This solution should be improved by issue #506 - // by moving all connection throw events - const providerConfig = await this.network(); - // Return the current provider instance if it exists - if (FuelWeb3Privates.provider) { - return FuelWeb3Privates.provider; + private triggerConnectorEvents = async () => { + const [isConnected, networks, currentNetwork] = await Promise.all([ + this.isConnected(), + this.networks(), + this.currentNetwork(), + ]); + this.emit(this.events.connection, isConnected); + this.emit(this.events.networks, networks); + this.emit(this.events.currentNetwork, currentNetwork); + if (isConnected) { + const [accounts, currentAccount] = await Promise.all([ + this.accounts(), + this.currentAccount(), + ]); + this.emit(this.events.accounts, accounts); + this.emit(this.events.currentAccount, currentAccount); } - // Otherwise, create a new provider instance - // fetch the current network and connect the provider - const provider = await FuelWalletProvider.create(providerConfig.url, { - walletConnection: this, - }); - FuelWeb3Privates.provider = provider; + }; + + /** + * Get a connector from the list of connectors. + */ + getConnector = (connector: FuelConnector | string): FuelConnector | null => { + return ( + this._connectors.find((c) => { + const connectorName = + typeof connector === 'string' ? connector : connector.name; + return c.name === connectorName || c === connector; + }) || null + ); + }; + + /** + * Return the list of connectors with the status of installed and connected. + */ + async connectors(): Promise> { + await this.fetchConnectorsStatus(); + return this._connectors; + } + + /** + * Set the current connector to be used. + */ + async selectConnector( + connectorName: string, + options: FuelConnectorSelectOptions = { + emitEvents: true, + } + ): Promise { + const connector = this.getConnector(connectorName); + if (!connector) return false; + if (this._currentConnector?.name === connectorName) return true; + const { installed } = await this.fetchConnectorStatus(connector); + if (installed) { + this._currentConnector = connector; + this.emit(this.events.currentConnector, connector); + this.setupConnectorEvents(Object.values(FuelConnectorEventTypes)); + this._storage?.setItem(Fuel.STORAGE_KEY, connector.name); + // If emitEvents is true we query all the data from the connector + // and emit the events to the Fuel instance allowing the application to + // react to changes in the connector state. + if (options.emitEvents) { + this.triggerConnectorEvents(); + } + return true; + } + return false; + } + + /** + * Return the current selected connector. + */ + currentConnector() { + return this._currentConnector; + } - // Listen for network changes and connect the provider - // selected network from the user - this.on(FuelWalletEvents.network, async (network) => { - FuelWeb3Privates.provider?.connect(network.url); + /** + * Return true if any connector is available. + */ + async hasConnector(): Promise { + // If there is a current connector return true + // as the connector is ready + if (this._currentConnector) return true; + // If there is no current connector + // wait for the current connector to be set + // for 1 second and return false if is not set + const defer = deferPromise(); + this.once(this.events.currentConnector, () => { + defer.resolve(true); }); + // As the max ping time is 1 second we wait for 2 seconds + // to allow applications to react to the current connector + return withTimeout(defer.promise, HAS_CONNECTOR_TIMEOUT) + .then(() => true) + .catch(() => false); + } + + async hasWallet(): Promise { + return this.hasConnector(); + } + + /** + * Return a Fuel Provider instance with extends features to work with + * connectors. + * + * @deprecated Provider is going to be deprecated in the future. + */ + async getProvider( + providerOrNetwork?: FuelWalletProvider | Network + ): Promise { + if (process.env.NODE_ENV !== 'production') { + // eslint-disable-next-line no-console + console.warn( + 'Get provider is deprecated, use getWallet instead. Provider is going to be removed in the future.' + ); + } + return this._getProvider(providerOrNetwork); + } - return FuelWeb3Privates.provider; + /** + * Return a Fuel Provider instance with extends features to work with + * connectors. + */ + private async _getProvider( + providerOrNetwork?: FuelWalletProvider | Network + ): Promise { + // Decide which provider to use based on the providerOrNetwork + let provider: FuelWalletProvider; + // If provider is a valid instance of a Provider use it + if (providerOrNetwork && 'getTransactionResponse' in providerOrNetwork) { + provider = providerOrNetwork; + // If the provided param is a valid network use it + } else if ( + providerOrNetwork && + 'chainId' in providerOrNetwork && + 'url' in providerOrNetwork + ) { + provider = await FuelWalletProvider.create(providerOrNetwork.url); + // If nor provider or network is provided use the current network + } else if (!providerOrNetwork) { + const currentNetwork = await this.currentNetwork(); + provider = await FuelWalletProvider.create(currentNetwork.url); + // If a provider or network was informed but is not valid + // throw an error + } else { + throw new Error('Provider is not valid.'); + } + return provider; } + /** + * Return a Fuel Wallet Locked instance with extends features to work with + * connectors. + */ async getWallet( - address: string | AbstractAddress + address: string | AbstractAddress, + providerOrNetwork?: FuelWalletProvider | Network ): Promise { - const provider = await this.getProvider(); - return new FuelWalletLocked(address, provider); + const provider = await this._getProvider(providerOrNetwork); + return new FuelWalletLocked(address, this, provider); } -} -interface FuelDocumentEvents { - FuelLoaded: CustomEvent; -} -declare global { - interface Document { - addEventListener( - type: K, - listener: (this: Document, ev: FuelDocumentEvents[K]) => void - ): void; - dispatchEvent( - ev: FuelDocumentEvents[K] - ): void; - } - interface Window { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - fuel: Fuel | undefined; + /** + * Remove all open listeners this is useful when you want to + * remove the Fuel instance and avoid memory leaks. + */ + unsubscribe() { + // Unsubscribe from all events + this._unsubscribes.map((unSub) => unSub()); + this._targetUnsubscribe(); + // Remove all listeners from fuel instance + this.removeAllListeners(); + } + + /** + * Clean all the data from the storage. + */ + clean() { + this._storage?.removeItem(Fuel.STORAGE_KEY); + } + + /** + * Removes all listeners and cleans the storage. + */ + destroy() { + this.unsubscribe(); + this.clean(); } } diff --git a/packages/sdk-v2/src/FuelWalletConnector.ts b/packages/sdk/src/FuelConnector.ts similarity index 90% rename from packages/sdk-v2/src/FuelWalletConnector.ts rename to packages/sdk/src/FuelConnector.ts index 081e1c203..65dc8853f 100644 --- a/packages/sdk-v2/src/FuelWalletConnector.ts +++ b/packages/sdk/src/FuelConnector.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ -import type { Asset } from '@fuels/assets'; +import type { Asset } from '@fuel-wallet/types'; import EventEmitter from 'events'; import type { TransactionRequestLike } from 'fuels'; @@ -10,18 +10,18 @@ import type { FuelEventArg, Network, Version, - WalletConnectorMetadata, + ConnectorMetadata, } from './types'; /** - * @name FuelWalletConnector + * @name FuelConnector * * Wallet Connector is a interface that represents a Wallet Connector and all the methods * that should be implemented to be compatible with the Fuel SDK. */ -export abstract class FuelWalletConnector extends EventEmitter { +export abstract class FuelConnector extends EventEmitter { name: string = ''; - metadata: WalletConnectorMetadata = {} as WalletConnectorMetadata; + metadata: ConnectorMetadata = {} as ConnectorMetadata; connected: boolean = false; installed: boolean = false; events = FuelConnectorEventTypes; @@ -150,6 +150,21 @@ export abstract class FuelWalletConnector extends EventEmitter { throw new Error('Method not implemented.'); } + /** + * Should add the the asset metadata to the connector and return true if the asset + * was added successfully. + * + * If the asset already exists it should throw an error. + * + * @emits assets + * @param {Asset} asset - The asset to add the metadata to the connection. + * @returns True if the asset was added successfully + * @throws Error if the asset already exists + */ + async addAsset(asset: Asset): Promise { + throw new Error('Method not implemented.'); + } + /** * Should return all the assets added to the connector. If a connection is already established. * @@ -166,7 +181,7 @@ export abstract class FuelWalletConnector extends EventEmitter { * @throws {Error} if the network already exists * @returns {boolean} boolean - Return true if the network was added successfully */ - async addNetwork(network: Network): Promise { + async addNetwork(networkUrl: string): Promise { throw new Error('Method not implemented.'); } @@ -237,7 +252,7 @@ export abstract class FuelWalletConnector extends EventEmitter { * @param {function} listener - The listener function */ on>( - eventName: E | '*', + eventName: E, listener: (data: D) => void ): this { super.on(eventName, listener); diff --git a/packages/sdk/src/FuelWalletConnection.ts b/packages/sdk/src/FuelWalletConnection.ts deleted file mode 100644 index 69793460b..000000000 --- a/packages/sdk/src/FuelWalletConnection.ts +++ /dev/null @@ -1,129 +0,0 @@ -import type { - AbiMap, - Asset, - FuelEventArg, - FuelProviderConfig, - FuelEvents, - Network, -} from '@fuel-wallet/types'; -import type { JsonAbi, TransactionRequestLike } from 'fuels'; -import { transactionRequestify } from 'fuels'; - -import { WindowConnection } from './connections/WindowConnection'; -import { getTransactionSigner } from './utils/getTransactionSigner'; - -export class FuelWalletConnection extends WindowConnection { - async ping(): Promise { - return this.client.timeout(1000).request('ping', {}); - } - - async isConnected(): Promise { - // If the wallet not exists or not connected, return false - try { - return await this.client.request('isConnected', {}); - } catch { - return false; - } - } - - async connect(): Promise { - return this.client.request('connect', {}); - } - - async disconnect(): Promise { - return this.client.request('disconnect', {}); - } - - async accounts(): Promise> { - return this.client.request('accounts', {}); - } - - async currentAccount(): Promise { - return this.client.request('currentAccount', {}); - } - - async signMessage(address: string, message: string): Promise { - if (!message.trim()) { - throw new Error('Message is required'); - } - return this.client.request('signMessage', { - address, - message, - }); - } - - async sendTransaction( - transaction: TransactionRequestLike & { signer?: string }, - providerConfig: FuelProviderConfig, - signer?: string - ): Promise { - if (!transaction) { - throw new Error('Transaction is required'); - } - // Transform transaction object to a transaction request - const txRequest = transactionRequestify(transaction); - - const address = - signer || transaction.signer || getTransactionSigner(txRequest); - - return this.client.request('sendTransaction', { - address, - provider: providerConfig, - transaction: JSON.stringify(txRequest), - }); - } - - async assets(): Promise> { - return this.client.request('assets', {}); - } - - async addAsset(asset: Asset): Promise { - return this.addAssets([asset]); - } - - async addAssets(assets: Asset[]): Promise { - return this.client.request('addAssets', { - assets, - }); - } - - async addAbi(abiMap: AbiMap): Promise { - return this.client.request('addAbi', { - abiMap, - }); - } - - async getAbi(contractId: string): Promise { - return this.client.request('getAbi', { - contractId, - }); - } - - async hasAbi(contractId: string): Promise { - const abi = await this.getAbi(contractId); - return !!abi; - } - - async network(): Promise { - return this.client.request('network', {}); - } - - async networks(): Promise { - return this.client.request('networks', {}); - } - - async addNetwork(network: Network): Promise { - return this.client.request('addNetwork', { network }); - } - - async version(): Promise { - return this.client.request('version', {}); - } - - on>( - eventName: E, - listener: (data: D) => void - ): this { - return super.on(eventName, listener); - } -} diff --git a/packages/sdk/src/FuelWalletLocked.ts b/packages/sdk/src/FuelWalletLocked.ts index a9e9f5cf6..4a05ea1f1 100644 --- a/packages/sdk/src/FuelWalletLocked.ts +++ b/packages/sdk/src/FuelWalletLocked.ts @@ -5,29 +5,34 @@ import type { } from 'fuels'; import { WalletLocked } from 'fuels'; +import type { FuelConnector } from './FuelConnector'; import type { FuelWalletProvider } from './FuelWalletProvider'; export class FuelWalletLocked extends WalletLocked { + connector: FuelConnector; provider: FuelWalletProvider; - constructor(address: string | AbstractAddress, provider: FuelWalletProvider) { + constructor( + address: string | AbstractAddress, + connector: FuelConnector, + provider: FuelWalletProvider + ) { super(address, provider); + this.connector = connector; this.provider = provider; } async signMessage(message: string): Promise { - return this.provider.walletConnection.signMessage( - this.address.toString(), - message - ); + return this.connector.signMessage(this.address.toString(), message); } async sendTransaction( transaction: TransactionRequestLike ): Promise { - return this.provider.sendTransaction({ - ...transaction, - signer: this.address.toString(), - }); + const transactionId = await this.connector.sendTransaction( + this.address.toString(), + transaction + ); + return this.provider.getTransactionResponse(transactionId); } } diff --git a/packages/sdk/src/FuelWalletProvider.ts b/packages/sdk/src/FuelWalletProvider.ts index 5cf2d41b9..d12ecd923 100644 --- a/packages/sdk/src/FuelWalletProvider.ts +++ b/packages/sdk/src/FuelWalletProvider.ts @@ -1,37 +1,30 @@ -import type { ProviderOptions, TransactionRequestLike } from 'fuels'; +import type { ProviderOptions } from 'fuels'; import { TransactionResponse, Provider } from 'fuels'; -import type { FuelWalletConnection } from './FuelWalletConnection'; - -type FuelWalletProviderOptions = ProviderOptions & { - walletConnection: FuelWalletConnection; -}; - +/** + * @todo: We should add getTransactionResponse to TS-SDK in this way + * a provider becomes self contained enabling connectors to implement + * their on providers for customized responses. + * + * With the change we can remove the entire FuelWalletProvider. + */ export class FuelWalletProvider extends Provider { - walletConnection: FuelWalletConnection; - - constructor(url: string, options: FuelWalletProviderOptions) { + constructor(url: string, options?: ProviderOptions) { super(url, options); - this.walletConnection = options.walletConnection; } static async create( url: string, - options: FuelWalletProviderOptions + options?: ProviderOptions | undefined ): Promise { const provider = new FuelWalletProvider(url, options); await provider.fetchChainAndNodeInfo(); return provider; } - async sendTransaction( - transactionRequestLike: TransactionRequestLike & { signer?: string } + async getTransactionResponse( + transactionId: string ): Promise { - const transactionId = await this.walletConnection.sendTransaction( - transactionRequestLike, - { url: this.url } - ); - const response = new TransactionResponse(transactionId, this); - return response; + return new TransactionResponse(transactionId, this); } } diff --git a/packages/sdk-v2/src/api.ts b/packages/sdk/src/api.ts similarity index 94% rename from packages/sdk-v2/src/api.ts rename to packages/sdk/src/api.ts index 99010e87d..977634d70 100644 --- a/packages/sdk-v2/src/api.ts +++ b/packages/sdk/src/api.ts @@ -14,6 +14,7 @@ export enum FuelConnectorMethods { sendTransaction = 'sendTransaction', // Assets metadata methods assets = 'assets', + addAsset = 'addAsset', addAssets = 'addAssets', // Network methods networks = 'networks', @@ -33,5 +34,7 @@ export enum FuelConnectorEventTypes { currentAccount = 'currentAccount', networks = 'networks', currentNetwork = 'currentNetwork', + assets = 'assets', + abis = 'abis', } export const FuelConnectorEventType = 'FuelConnector'; diff --git a/packages/sdk/src/connections/WindowConnection.ts b/packages/sdk/src/connections/WindowConnection.ts deleted file mode 100644 index 7b27785e0..000000000 --- a/packages/sdk/src/connections/WindowConnection.ts +++ /dev/null @@ -1,205 +0,0 @@ -import { - CONTENT_SCRIPT_NAME, - EVENT_MESSAGE, - FuelWalletEvents, - MessageTypes, -} from '@fuel-wallet/types'; -import type { - CommunicationMessage, - FuelWalletConnector, -} from '@fuel-wallet/types'; -import type { JSONRPCRequest } from 'json-rpc-2.0'; - -import { hasWindow } from '../utils/hasWindow'; -import { deferPromise } from '../utils/promise'; - -import { BaseConnection } from './BaseConnection'; - -export class WindowConnection extends BaseConnection { - isListenerAdded = false; - queue: JSONRPCRequest[] = []; - _retry = 0; - _injectionTimeout: NodeJS.Timeout; - _hasWallet = deferPromise(); - connectorName: string; - private connectors: Array; - - constructor(connector?: FuelWalletConnector) { - super(); - this.connectorName = connector ? connector.name : ''; - this.connectors = connector ? [connector] : []; - this.handleFuelInjected(); - this._injectionTimeout = setInterval( - this.handleFuelInjected.bind(this), - 100 - ); - this.handleIsReady(); - } - - executeQueuedRequests() { - // Execute pending requests in the queue - let request = this.queue.shift(); - while (request) { - this.sendRequest(request); - request = this.queue.shift(); - } - } - - handleIsReady() { - if (typeof document === 'undefined') return; - document.addEventListener('FuelLoaded', () => { - this._retry = 0; - this._hasWallet.resolve(true); - this._hasWallet = deferPromise(); - this.handleFuelInjected(); - this.emit(FuelWalletEvents.load, true); - }); - } - - hasConnector(connectorName: string): boolean { - return !!this.connectors.find((c) => c.name === connectorName); - } - - addConnector(connector: FuelWalletConnector): void { - // Ensure Fuel Wallet is the default connector - if (connector.name === 'Fuel Wallet') { - this.connectorName = connector.name; - } - if (this.hasConnector(connector.name)) { - throw new Error(`"${connector.name}" connector already exists!`); - } - this.connectors.push(connector); - this.emit(FuelWalletEvents.connectors, this.listConnectors()); - } - - removeConnector(connectorName: string): void { - const connectorIndex = this.connectors.findIndex( - (c) => c.name === connectorName - ); - if (connectorIndex > -1) { - this.connectors.splice(connectorIndex, 1); - } - } - - listConnectors(): Array { - return this.connectors; - } - - async selectConnector(connectorName: string): Promise { - const previousConnector = this.connectorName; - this.connectorName = connectorName; - try { - const connectorName = await this.client - .timeout(1000) - .request('connectorName', {}); - // Check if the current connector is in the list of connectors - let connector = this.connectors.find((c) => c.name === connectorName); - // If not, add it to the list of connectors - if (!connector) { - connector = { name: connectorName }; - this.addConnector({ name: connectorName }); - } - // Emit the current connector - this.emit(FuelWalletEvents.currentConnector, connector); - } catch { - // If the connector is not found, revert the change and throw an error - this.connectorName = previousConnector; - throw new Error(`"${connectorName}" connector not found!`); - } - return true; - } - - acceptMessage(message: MessageEvent): boolean { - const { data: event } = message; - return ( - message.origin === window.origin && - event.target === this.connectorName && - event.type !== MessageTypes.request - ); - } - - async hasWallet(): Promise { - return this._hasWallet.promise; - } - - async sendRequest(request: JSONRPCRequest | null) { - if (!request) return; - if (!window.fuel && this.connectorName) { - this.queue.push(request); - } else { - this.postMessage({ - type: MessageTypes.request, - target: CONTENT_SCRIPT_NAME, - connectorName: this.connectorName, - request, - }); - } - } - - onMessage = (message: MessageEvent) => { - const messageFroze = Object.freeze(message); - if (!this.acceptMessage(messageFroze)) return; - const { data: event } = messageFroze; - this.onCommunicationMessage(event); - }; - - postMessage(message: CommunicationMessage, origin?: string) { - if (!this.hasConnector(this.connectorName)) { - throw new Error(`Wallet Connector ${this.connectorName} not found!`); - } - window.postMessage(message, origin || window.origin); - } - - bindFuelConnectors(fuel: Window['fuel']) { - // Prevent binding to self if this happen the - // object would enter on a infinite loop - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const isSelf = (fuel as any) === this; - if (!fuel || isSelf) return; - // Bind to fuel events to - // sync with current instace - fuel.on(FuelWalletEvents.connectors, (connectors) => { - this.connectors = connectors; - this.emit(FuelWalletEvents.connectors, connectors); - }); - fuel.on(FuelWalletEvents.currentConnector, (connector) => { - this.selectConnector(connector.name); - }); - // Update the current connectors list - this.connectors = fuel.listConnectors(); - // Trigger connectros list changed event - this.emit(FuelWalletEvents.connectors, this.listConnectors()); - // If connector is already selected, do nothing - if (!this.connectorName) { - // Sync the current connector - this.selectConnector(fuel.connectorName); - } - } - - handleFuelInjected() { - // Timeout after 10 retries i.e., 1 second - if (this._retry === 9) { - clearInterval(this._injectionTimeout); - this._hasWallet.resolve(false); - this.client.rejectAllPendingRequests( - 'Timeout fuel not detected on the window!' - ); - return; - } - - this._retry++; - - if (hasWindow) { - if (!this.isListenerAdded) { - window.addEventListener(EVENT_MESSAGE, this.onMessage.bind(this)); - this.isListenerAdded = true; - } - if (window.fuel) { - clearInterval(this._injectionTimeout); - this._hasWallet.resolve(true); - this.bindFuelConnectors(window.fuel); - this.executeQueuedRequests(); - } - } - } -} diff --git a/packages/sdk/src/connectors/FuelWallet.ts b/packages/sdk/src/connectors/FuelWallet.ts new file mode 100644 index 000000000..84437037e --- /dev/null +++ b/packages/sdk/src/connectors/FuelWallet.ts @@ -0,0 +1,296 @@ +import { + MessageTypes, + EVENT_MESSAGE, + CONTENT_SCRIPT_NAME, + CONNECTOR_SCRIPT, +} from '@fuel-wallet/types'; +import type { + Asset, + ResponseMessage, + EventMessage, + CommunicationMessage, + AssetData, + AssetFuel, +} from '@fuel-wallet/types'; +import { + Provider, + transactionRequestify, + type TransactionRequestLike, +} from 'fuels'; +import type { JSONRPCRequest } from 'json-rpc-2.0'; +import { JSONRPCClient } from 'json-rpc-2.0'; + +import { FuelConnector } from '../FuelConnector'; +import { FuelConnectorEventTypes } from '../api'; +import { + type ConnectorMetadata, + type FuelABI, + type Network, + type Version, +} from '../types'; + +export class FuelWalletConnector extends FuelConnector { + name: string = ''; + connected: boolean = false; + installed: boolean = false; + events = FuelConnectorEventTypes; + metadata: ConnectorMetadata = { + image: '/connectors/fuel-wallet.svg', + install: { + action: 'Install', + description: + 'To connect your Fuel Wallet, install the browser extension.', + link: 'https://chrome.google.com/webstore/detail/fuel-wallet/dldjpboieedgcmpkchcjcbijingjcgok', + }, + }; + + readonly client: JSONRPCClient; + + constructor(name: string = 'Fuel Wallet') { + super(); + this.name = name; + this.setMaxListeners(100); + this.client = new JSONRPCClient( + this.sendRequest.bind(this), + this.createRequestId + ); + this.setupListener(); + this.setupConnector(); + } + + /** + * ============================================================ + * Application communication methods + * ============================================================ + */ + private async setupConnector() { + if (typeof window !== 'undefined') { + this.ping() + .then(() => { + window.dispatchEvent( + new CustomEvent('FuelConnector', { detail: this }) + ); + }) + .catch(() => {}); + } + } + + private acceptMessage(message: MessageEvent): boolean { + const { data: event } = message; + return ( + message.origin === window.origin && + event.type !== MessageTypes.request && + event.connectorName === this.name && + event.target === CONNECTOR_SCRIPT + ); + } + + private setupListener() { + if (typeof window === 'undefined') return; + window.addEventListener(EVENT_MESSAGE, this.onMessage.bind(this)); + } + + private createRequestId(): string { + return crypto.randomUUID(); + } + + private postMessage(message: CommunicationMessage, origin?: string) { + window.postMessage(message, origin || window.origin); + } + + private async sendRequest(request: JSONRPCRequest | null) { + if (!request) return; + this.postMessage({ + type: MessageTypes.request, + target: CONTENT_SCRIPT_NAME, + connectorName: this.name, + request, + }); + } + + private onResponse(message: ResponseMessage): void { + this.client.receive(message.response); + } + + private onEvent(message: EventMessage): void { + message.events.forEach((eventData) => { + if (eventData.event === 'start') { + this.setupConnector(); + } else { + this.emit(eventData.event, ...eventData.params); + } + }); + } + + private onMessage = (message: MessageEvent) => { + const messageFroze = Object.freeze(message); + if (!this.acceptMessage(messageFroze)) return; + const { data: event } = messageFroze; + this.onCommunicationMessage(event); + }; + + private onCommunicationMessage = (message: CommunicationMessage) => { + switch (message.type) { + case MessageTypes.response: + this.onResponse(message); + break; + case MessageTypes.event: + this.onEvent(message); + break; + default: + } + }; + + /** + * ============================================================ + * Connector methods + * ============================================================ + */ + async ping(): Promise { + return this.client.timeout(800).request('ping', {}); + } + + async isConnected(): Promise { + // If the wallet not exists or not connected, return false + try { + return await this.client.request('isConnected', {}); + } catch { + return false; + } + } + + async connect(): Promise { + return this.client.request('connect', {}); + } + + async disconnect(): Promise { + return this.client.request('disconnect', {}); + } + + async accounts(): Promise> { + return this.client.request('accounts', {}); + } + + async currentAccount(): Promise { + return this.client.request('currentAccount', {}); + } + + async signMessage(address: string, message: string): Promise { + if (!message.trim()) { + throw new Error('Message is required'); + } + return this.client.request('signMessage', { + address, + message, + }); + } + + async sendTransaction( + address: string, + transaction: TransactionRequestLike + ): Promise { + if (!transaction) { + throw new Error('Transaction is required'); + } + // Transform transaction object to a transaction request + const txRequest = transactionRequestify(transaction); + + /** + * @todo We should remove this once the chainId standard start to be used and chainId is required + * to be correct according to the network the transaction wants to target. + */ + const network = await this.currentNetwork(); + const provider = { + url: network.url, + }; + + return this.client.request('sendTransaction', { + address, + transaction: JSON.stringify(txRequest), + provider, + }); + } + + async assets(): Promise> { + return this.client.request('assets', {}); + } + + async addAsset(asset: Asset): Promise { + return this.addAssets([asset]); + } + + async addAssets(assets: Asset[]): Promise { + /** + * @todo: Remove this once Fuel Wallet supports assets with multiple networks + */ + const assetsData: Array = assets.map((asset) => { + const fuelNetworkAsset = asset.networks.find( + (n) => n.type === 'fuel' + ) as AssetFuel; + if (!fuelNetworkAsset) { + throw new Error('Asset for Fuel Network not found!'); + } + return { + ...asset, + imageUrl: asset.icon, + decimals: fuelNetworkAsset.decimals, + assetId: fuelNetworkAsset.assetId, + }; + }); + return this.client.request('addAssets', { + assets: assetsData, + }); + } + + async addABI(contractId: string, abi: FuelABI): Promise { + return this.client.request('addAbi', { + abiMap: { + [contractId]: abi, + }, + }); + } + + async getABI(contractId: string): Promise { + return this.client.request('getAbi', { + contractId, + }); + } + + async hasABI(contractId: string): Promise { + const abi = await this.getABI(contractId); + return !!abi; + } + + async currentNetwork(): Promise { + return this.client.request('network', {}); + } + + async selectNetwork(_network: Network): Promise { + throw new Error('Method not implemented.'); + } + + async networks(): Promise { + return this.client.request('networks', {}); + } + + async addNetwork(networkUrl: string): Promise { + /** + * @todo: Remove fetch provider once Fuel Wallet supports adding networks + * by URL + */ + const provider = await Provider.create(networkUrl); + return this.client.request('addNetwork', { + network: { + url: provider.url, + name: provider.getChain().name, + }, + }); + } + + async version(): Promise { + return this.client.request('version', { + app: '0.0.0', + network: '0.0.0', + }); + } +} diff --git a/packages/sdk/src/connectors/FuelWalletDevelopment.ts b/packages/sdk/src/connectors/FuelWalletDevelopment.ts new file mode 100644 index 000000000..f3a3fa7a4 --- /dev/null +++ b/packages/sdk/src/connectors/FuelWalletDevelopment.ts @@ -0,0 +1,19 @@ +import type { ConnectorMetadata } from '../types'; + +import { FuelWalletConnector } from './FuelWallet'; + +export class FuelWalletDevelopmentConnector extends FuelWalletConnector { + metadata: ConnectorMetadata = { + image: '/connectors/fuel-wallet-dev.svg', + install: { + action: 'Install', + description: + 'To connect your Fuel Wallet, you need to install the browser extension first.', + link: 'https://chrome.google.com/webstore/detail/fuel-wallet-development/hcgmehahnlbhpilepakbdinkhhaackmc', + }, + }; + + constructor() { + super('Fuel Wallet Development'); + } +} diff --git a/packages/sdk/src/connectors/FueletWallet.ts b/packages/sdk/src/connectors/FueletWallet.ts new file mode 100644 index 000000000..dc93ad314 --- /dev/null +++ b/packages/sdk/src/connectors/FueletWallet.ts @@ -0,0 +1,22 @@ +import type { ConnectorMetadata } from '../types'; + +import { FuelWalletConnector } from './FuelWallet'; + +export class FueletWalletConnector extends FuelWalletConnector { + name = 'Fuelet Wallet'; + metadata: ConnectorMetadata = { + image: { + light: '/connectors/fuelet-light.svg', + dark: '/connectors/fuelet-dark.svg', + }, + install: { + action: 'Install', + description: 'Install Fuelet Wallet in order to connect it.', + link: 'https://fuelet.app/download/', + }, + }; + + constructor() { + super('Fuelet Wallet'); + } +} diff --git a/packages/sdk/src/connectors/defaultConnectors.ts b/packages/sdk/src/connectors/defaultConnectors.ts new file mode 100644 index 000000000..612bbe30b --- /dev/null +++ b/packages/sdk/src/connectors/defaultConnectors.ts @@ -0,0 +1,15 @@ +import { FuelWalletConnector } from './FuelWallet'; +import { FuelWalletDevelopmentConnector } from './FuelWalletDevelopment'; +import { FueletWalletConnector } from './FueletWallet'; + +type DefaultConnectors = { + devMode?: boolean; +}; + +export function defaultConnectors({ devMode }: DefaultConnectors = {}) { + const connectors = [new FuelWalletConnector(), new FueletWalletConnector()]; + if (devMode) { + connectors.push(new FuelWalletDevelopmentConnector()); + } + return connectors; +} diff --git a/packages/sdk/src/connectors/index.ts b/packages/sdk/src/connectors/index.ts new file mode 100644 index 000000000..d2628aec0 --- /dev/null +++ b/packages/sdk/src/connectors/index.ts @@ -0,0 +1,4 @@ +export * from './FuelWallet'; +export * from './FuelWalletDevelopment'; +export * from './FueletWallet'; +export * from './defaultConnectors'; diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts index a1971f6f0..ea81b4581 100644 --- a/packages/sdk/src/index.ts +++ b/packages/sdk/src/index.ts @@ -1,7 +1,9 @@ -export * from '@fuel-wallet/types'; +export * from './api'; +export * from './types'; +export * from './utils'; export * from './Fuel'; -export * from './FuelWalletConnection'; +export * from './FuelConnector'; export * from './FuelWalletProvider'; export * from './FuelWalletLocked'; -export * from './utils'; -export * from './connections'; +export * from './connectors'; +export * from '@fuel-wallet/types'; diff --git a/packages/sdk/src/tests/Fuel.test.ts b/packages/sdk/src/tests/Fuel.test.ts deleted file mode 100644 index b12972cdc..000000000 --- a/packages/sdk/src/tests/Fuel.test.ts +++ /dev/null @@ -1,285 +0,0 @@ -import type { WalletUnlocked } from 'fuels'; -import { - Address, - bn, - BaseAssetId, - ScriptTransactionRequest, - Wallet, -} from 'fuels'; - -import type { Fuel } from '../Fuel'; -import { getGasConfig } from '../utils'; - -import type { MockServices } from './__mock__'; -import { - createToWallet, - mockFuel, - seedWallet, - AbiContractId, - FlatAbi, -} from './__mock__'; -import { FUEL_NETWORK } from './constants'; - -describe('Fuel', () => { - let mocks: MockServices; - let fuel: Fuel; - let toWallet: WalletUnlocked; - - beforeAll(async () => { - mocks = await mockFuel(); - toWallet = await createToWallet(); - fuel = window.fuel!; - }); - - afterAll(() => { - mocks.destroy(); - }); - - test('version', async () => { - const version = await fuel.version(); - expect(version).toEqual('0.1.1'); - }); - - test('hasWallet', async () => { - const hasWallet = await fuel.hasWallet(); - expect(hasWallet).toBeTruthy(); - }); - - test('isConnected', async () => { - const isConnected = await fuel.isConnected(); - expect(isConnected).toBeTruthy(); - }); - - test('connect', async () => { - const isConnected = await fuel.connect(); - expect(isConnected).toBeTruthy(); - }); - - test('disconnect', async () => { - const isConnected = await fuel.disconnect(); - expect(isConnected).toBeTruthy(); - }); - - test('accounts', async () => { - const accounts = await fuel.accounts(); - expect(accounts).toEqual([ - mocks.backgroundService.state.wallet.address.toAddress(), - ]); - }); - - test('currentAccount', async () => { - const currentAccount = await fuel.currentAccount(); - expect(currentAccount).toEqual( - mocks.backgroundService.state.wallet.address.toAddress() - ); - }); - - test('assets', async () => { - const assets = await fuel.assets(); - expect(assets.length).toEqual(0); - }); - - test('addAsset', async () => { - const asset = { assetId: BaseAssetId }; - const isAdded = await fuel.addAsset(asset); - expect(isAdded).toEqual(true); - }); - - test('addAssets', async () => { - const asset = { assetId: BaseAssetId }; - const isAdded = await fuel.addAssets([asset]); - expect(isAdded).toEqual(true); - }); - - test('network', async () => { - const network = await fuel.network(); - expect(network).toStrictEqual({ url: process.env.PUBLIC_PROVIDER_URL! }); - }); - - test('networks', async () => { - const networks = await fuel.networks(); - expect(networks).toStrictEqual([ - { url: process.env.PUBLIC_PROVIDER_URL! }, - FUEL_NETWORK, - ]); - }); - - test('addNetwork', async () => { - const isNetworkAdded = await fuel.addNetwork(FUEL_NETWORK); - expect(isNetworkAdded).toEqual(true); - }); - - test('addAbi', async () => { - const abiMap = { - [AbiContractId]: FlatAbi, - }; - const isAdded = await fuel.addAbi(abiMap); - expect(isAdded).toEqual(true); - }); - - test('getAbi', async () => { - const abiMap = { - [AbiContractId]: FlatAbi, - }; - await fuel.addAbi(abiMap); - const abi = await fuel.getAbi(AbiContractId); - - expect(abi).toStrictEqual(FlatAbi); - }); - - test('hasAbi', async () => { - const abiMap = { - [AbiContractId]: FlatAbi, - }; - await fuel.addAbi(abiMap); - const hasAbi = await fuel.hasAbi(AbiContractId); - - expect(hasAbi).toBeTruthy(); - }); - - test('signMessage', async () => { - const accounts = await fuel.accounts(); - const account = accounts[0]; - - // Test example like docs - const signedMessage = await fuel.signMessage(account, 'test'); - const signedMessageSpec = - await mocks.backgroundService.state.wallet.signMessage('test'); - expect(signedMessage).toEqual(signedMessageSpec); - }); - - test('sendTransaction', async () => { - const accounts = await fuel.accounts(); - const account = accounts[0]; - const toAccount = toWallet.address.toAddress(); - - // Seed wallet with funds - await seedWallet(account, bn.parseUnits('1')); - - const { gasLimit, gasPrice } = await getGasConfig(toWallet.provider); - - // Test example like docs - const transactionRequest = new ScriptTransactionRequest({ - gasLimit, - gasPrice, - }); - - const toAddress = Address.fromString(toAccount); - const amount = bn.parseUnits('0.1'); - transactionRequest.addCoinOutput(toAddress, amount); - - const wallet = await fuel.getWallet(account); - const resources = await wallet.getResourcesToSpend([[amount, BaseAssetId]]); - - transactionRequest.addResources(resources); - const response = await wallet.sendTransaction(transactionRequest); - - // wait for transaction to be completed - await response.wait(); - - // query the balance of the destination wallet - const addrWallet = await fuel.getWallet(toAddress); - const balance = await addrWallet.getBalance(BaseAssetId); - expect(balance.toNumber()).toBeGreaterThanOrEqual(amount.toNumber()); - }); - - test('getWallet', async () => { - const accounts = await fuel.accounts(); - const account = accounts[0]; - const toAccount = toWallet.address.toString(); - - // Test example like docs - const wallet = await fuel.getWallet(account); - const toAddress = Address.fromString(toAccount); - const amount = bn.parseUnits('0.1'); - - const gasLimit = ( - await wallet.provider.getChain() - ).consensusParameters.maxGasPerTx.div(2); - const gasPrice = (await wallet.provider.fetchNode()).minGasPrice; - const response = await wallet.transfer(toAddress, amount, BaseAssetId, { - gasPrice, - gasLimit, - }); - - // wait for transaction to be completed - await response.wait(); - - // query the balance of the destination wallet - const addrWallet = await fuel.getWallet(toAddress); - const balance = await addrWallet.getBalance(BaseAssetId); - expect(balance.toNumber()).toBeGreaterThanOrEqual(amount.toNumber()); - }); - - test('getProvider', async () => { - const provider = await fuel.getProvider(); - const nodeInfo = await provider.fetchNode(); - expect(nodeInfo.nodeVersion).toBeTruthy(); - }); - - test('User getProvider on fuels-ts Wallet', async () => { - const accounts = await fuel.accounts(); - const account = accounts[0]; - const toAccount = toWallet.address.toString(); - - // Test example like docs - const provider = await fuel.getProvider(); - const walletLocked = Wallet.fromAddress(account, provider); - const toAddress = Address.fromString(toAccount); - - const { gasLimit, gasPrice } = await getGasConfig(walletLocked.provider); - const response = await walletLocked.transfer( - toAddress, - bn.parseUnits('0.1'), - BaseAssetId, - { gasLimit, gasPrice } - ); - - // wait for transaction to be completed - await response.wait(); - }); -}); - -describe('Fuel Events', () => { - let mocks: MockServices; - let fuel: Fuel; - - beforeAll(async () => { - mocks = await mockFuel(); - fuel = window.fuel!; - }); - - afterAll(() => { - mocks.destroy(); - }); - - test('Events: Connection events', async () => { - const handleConnectionEvent = jest.fn(); - fuel.on(fuel.events.connection, handleConnectionEvent); - await fuel.connect(); - expect(handleConnectionEvent).toBeCalledWith(true); - await fuel.disconnect(); - expect(handleConnectionEvent).toBeCalledWith(false); - }); - - test('Events: Accounts events', async () => { - const handleAccountsEvent = jest.fn(); - fuel.on(fuel.events.accounts, handleAccountsEvent); - const accounts = await fuel.accounts(); - expect(handleAccountsEvent).toBeCalledWith(accounts); - }); - - test('Events: CurrentAccount events', async () => { - const handleCurrentAccountEvent = jest.fn(); - fuel.on(fuel.events.currentAccount, handleCurrentAccountEvent); - const currentAccount = await fuel.currentAccount(); - expect(handleCurrentAccountEvent).toBeCalledWith(currentAccount); - }); - - test('Events: Network events', async () => { - const handleNetworkEvent = jest.fn(); - fuel.on(fuel.events.network, handleNetworkEvent); - const network = await fuel.network(); - expect(handleNetworkEvent).toBeCalledWith(network); - }); -}); diff --git a/packages/sdk/src/tests/FuelError.test.ts b/packages/sdk/src/tests/FuelError.test.ts deleted file mode 100644 index b5ed4f8e9..000000000 --- a/packages/sdk/src/tests/FuelError.test.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Fuel } from '../Fuel'; - -import './__mock__/MockConnections'; - -describe('Fuel Error', () => { - const fuel = new Fuel(); - - test('fuel not detected', async () => { - const hasWallet = await fuel.hasWallet(); - expect(hasWallet).toBeFalsy(); - }); -}); diff --git a/packages/sdk/src/tests/FuelTimeout.test.ts b/packages/sdk/src/tests/FuelTimeout.test.ts deleted file mode 100644 index a6f7218d7..000000000 --- a/packages/sdk/src/tests/FuelTimeout.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Fuel } from '../Fuel'; - -import { cleanFuelMocks, mockFuel } from './__mock__'; - -import './__mock__/MockConnections'; - -describe('Fuel Timeout', () => { - afterEach(() => { - cleanFuelMocks(); - }); - - test('hasWallet with timeout', async () => { - const fuel = new Fuel(); - - // Inject `fuel` on `window` after 500ms - setTimeout(() => { - mockFuel({ name: 'Fuel Wallet' }); - }, 500); - - const hasWallet = await fuel.hasWallet(); - expect(hasWallet).toBeTruthy(); - }); - - test('Should be able to connect if Wallet changes to ready', async () => { - const fuel = new Fuel(); - - // Should fail first as fuel is not detected - const hasWallet = await fuel.hasWallet(); - expect(hasWallet).toBeFalsy(); - - const onReadyChange = jest.fn(); - fuel.on(fuel.events.load, onReadyChange); - await mockFuel({ name: 'Fuel Wallet' }); - expect(onReadyChange).toBeCalledTimes(1); - - // Should pass as fuel is detected - const hasWallet2 = await fuel.hasWallet(); - expect(hasWallet2).toBeTruthy(); - }); -}); diff --git a/packages/sdk-v2/src/tests/FuelWallet.test.ts b/packages/sdk/src/tests/FuelWallet.test.ts similarity index 93% rename from packages/sdk-v2/src/tests/FuelWallet.test.ts rename to packages/sdk/src/tests/FuelWallet.test.ts index 268fc59a6..8da375a97 100644 --- a/packages/sdk-v2/src/tests/FuelWallet.test.ts +++ b/packages/sdk/src/tests/FuelWallet.test.ts @@ -10,7 +10,7 @@ import { import { Fuel } from '../Fuel'; import { FuelConnectorEventType } from '../api'; -import { FuelConnectorEvent } from '../types'; +import { dispatchFuelConnectorEvent } from '../utils'; import { MockConnector } from './MockConnector'; import { promiseCallback } from './utils/promiseCallback'; @@ -20,10 +20,25 @@ describe('Fuel Wallet SDK multiple connectors', () => { window.localStorage.clear(); }); + test('Create using default connectors', async () => { + const fuel = new Fuel(); + const connectors = await fuel.connectors(); + expect(connectors.length).toBe(2); + }); + + test('Create using default connectors devMode', async () => { + const fuel = new Fuel({ + devMode: true, + }); + const connectors = await fuel.connectors(); + expect(connectors.length).toBe(3); + }); + test('Add connector using event of a custom EventBus', async () => { const eventBus = new EventEmitter(); const fuel = new Fuel({ targetObject: eventBus, + connectors: [], storage: null, }); let connectors = await fuel.connectors(); @@ -48,6 +63,7 @@ describe('Fuel Wallet SDK multiple connectors', () => { test('Add connector using window events', async () => { const fuel = new Fuel({ + connectors: [], storage: null, }); let connectors = await fuel.connectors(); @@ -58,8 +74,7 @@ describe('Fuel Wallet SDK multiple connectors', () => { fuel.on(fuel.events.connectors, onConnectors); // Trigger event to add connector - const event = new FuelConnectorEvent(new MockConnector()); - window.dispatchEvent(event); + dispatchFuelConnectorEvent(new MockConnector()); // wait for the event to be triggered await onConnectors.promise; @@ -104,7 +119,7 @@ describe('Fuel Wallet SDK multiple connectors', () => { const provider = await Provider.create('http://localhost:4001/graphql'); const wallets = [ Wallet.fromPrivateKey( - '0xa449b1ffee0e2205fa924c6740cc48b3b473aa28587df6dab12abc245d1f5298', + '0xa349d39f614a3085b7f7f8cef63fd5189136924fc1238e6d25ccdaa43a901cd0', provider ), ]; @@ -132,7 +147,7 @@ describe('Fuel Wallet SDK multiple connectors', () => { BaseAssetId, { gasPrice: bn(1), - gasLimit: bn(1_000_000), + gasLimit: bn(100_000), } ); const { status } = await response.waitForResult(); diff --git a/packages/sdk-v2/src/tests/FuelWalletConnector.test.ts b/packages/sdk/src/tests/FuelWalletConnector.test.ts similarity index 89% rename from packages/sdk-v2/src/tests/FuelWalletConnector.test.ts rename to packages/sdk/src/tests/FuelWalletConnector.test.ts index f1d04e949..3d092f268 100644 --- a/packages/sdk-v2/src/tests/FuelWalletConnector.test.ts +++ b/packages/sdk/src/tests/FuelWalletConnector.test.ts @@ -10,7 +10,7 @@ import { import { Fuel } from '../Fuel'; import { FuelConnectorEventType } from '../api'; -import { FuelConnectorEvent } from '../types'; +import { dispatchFuelConnectorEvent } from '../utils'; import { MockConnector } from './MockConnector'; import { promiseCallback } from './utils/promiseCallback'; @@ -24,6 +24,7 @@ describe('Fuel Wallet SDK Connector actions', () => { const eventBus = new EventEmitter(); const fuel = new Fuel({ targetObject: eventBus, + connectors: [], storage: null, }); let connectors = await fuel.connectors(); @@ -48,6 +49,7 @@ describe('Fuel Wallet SDK Connector actions', () => { test('Add connector using window events', async () => { const fuel = new Fuel({ + connectors: [], storage: null, }); let connectors = await fuel.connectors(); @@ -58,8 +60,7 @@ describe('Fuel Wallet SDK Connector actions', () => { fuel.on(fuel.events.connectors, onConnectors); // Trigger event to add connector - const event = new FuelConnectorEvent(new MockConnector()); - window.dispatchEvent(event); + dispatchFuelConnectorEvent(new MockConnector()); // wait for the event to be triggered await onConnectors.promise; @@ -190,9 +191,10 @@ describe('Fuel Wallet SDK Connector actions', () => { storage: null, connectors: [new MockConnector()], }); + const networkUrl = 'https://beta-5.fuel.network'; const newNetwork = { - url: 'https://beta-5.fuel.network', - chainId: 1, + url: networkUrl, + chainId: 0, }; // listen to connection event @@ -201,10 +203,10 @@ describe('Fuel Wallet SDK Connector actions', () => { fuel.on(fuel.events.networks, onNetworks); fuel.on(fuel.events.currentNetwork, onCurrentNetwork); - const isNetworkAdded = await fuel.addNetwork(newNetwork); + const isNetworkAdded = await fuel.addNetwork(networkUrl); const networks = await fuel.networks(); expect(isNetworkAdded).toEqual(true); - expect(networks).toContain(newNetwork); + expect(networks).toContainEqual(newNetwork); expect(onNetworks).toBeCalledTimes(1); expect(onNetworks).toBeCalledWith(networks); expect(onCurrentNetwork).toBeCalledTimes(1); @@ -232,6 +234,27 @@ describe('Fuel Wallet SDK Connector actions', () => { }); test('addAsset', async () => { + const fuel = new Fuel({ + storage: null, + connectors: [new MockConnector()], + }); + const isAdded = await fuel.addAsset({ + name: 'Asset', + symbol: 'AST', + icon: 'ast.png', + networks: [ + { + type: 'fuel', + assetId: BaseAssetId, + decimals: 9, + chainId: 0, + }, + ], + }); + expect(isAdded).toEqual(true); + }); + + test('addAssets', async () => { const fuel = new Fuel({ storage: null, connectors: [new MockConnector()], @@ -239,11 +262,16 @@ describe('Fuel Wallet SDK Connector actions', () => { const isAdded = await fuel.addAssets([ { name: 'Asset', - description: '...', symbol: 'AST', icon: 'ast.png', - assetId: BaseAssetId, - networks: [], + networks: [ + { + type: 'fuel', + assetId: BaseAssetId, + decimals: 9, + chainId: 0, + }, + ], }, ]); expect(isAdded).toEqual(true); @@ -306,7 +334,7 @@ describe('Fuel Wallet SDK Connector actions', () => { const provider = await Provider.create('http://localhost:4001/graphql'); const wallets = [ Wallet.fromPrivateKey( - '0xa449b1ffee0e2205fa924c6740cc48b3b473aa28587df6dab12abc245d1f5298', + '0xba9e8401405cd4327119548bccf0cd8b195c3fb716c848d9571c60bb230c6978', provider ), ]; @@ -334,7 +362,7 @@ describe('Fuel Wallet SDK Connector actions', () => { BaseAssetId, { gasPrice: bn(1), - gasLimit: bn(1_000_000), + gasLimit: bn(100_000), } ); const { status } = await response.waitForResult(); diff --git a/packages/sdk/src/tests/FuelWalletConnectors.test.ts b/packages/sdk/src/tests/FuelWalletConnectors.test.ts deleted file mode 100644 index 738918707..000000000 --- a/packages/sdk/src/tests/FuelWalletConnectors.test.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { Fuel } from '../Fuel'; - -import type { MockServices } from './__mock__'; -import { mockFuel } from './__mock__'; - -describe('Fuel Connectors', () => { - let mocksConnector1: MockServices; - let mocksConnector2: MockServices; - let fuel: Fuel; - let fuelSDK: Fuel; - - beforeAll(async () => { - fuelSDK = new Fuel(); - mocksConnector1 = await mockFuel(); - mocksConnector2 = await mockFuel({ name: 'Third Wallet' }); - fuel = window.fuel!; - }); - - afterAll(() => { - mocksConnector1.destroy(); - mocksConnector2.destroy(); - }); - - test('listConnectors', async () => { - const connectors = fuel.listConnectors(); - await fuelSDK.hasWallet(); - const connectorsSDK = fuelSDK.listConnectors(); - const expectedConnectors = ['Fuel Wallet', 'Third Wallet']; - - expect(connectors.map((c) => c.name)).toEqual(expectedConnectors); - expect(connectorsSDK.map((c) => c.name)).toEqual(expectedConnectors); - }); - - test('hasConnector', () => { - expect(fuel.hasConnector('Fuel Wallet')).toBeTruthy(); - expect(fuel.hasConnector('Third Wallet')).toBeTruthy(); - }); - - test('Fuel Wallet should be the default connector', async () => { - expect(fuel.connectorName).toEqual('Fuel Wallet'); - }); - - test('selectConnector', async () => { - expect(await fuel.selectConnector('Fuel Wallet')).toBeTruthy(); - expect(await fuel.selectConnector('Third Wallet')).toBeTruthy(); - }); - - test('selectConnector that is not install should throw a Error', async () => { - const connectorName = 'Another Wallet'; - fuel.addConnector({ name: connectorName }); - const connectors = fuel.listConnectors(); - expect(connectors.find((i) => i.name === connectorName)).toBeTruthy(); - expect(fuel.selectConnector(connectorName)).rejects.toThrow( - `"${connectorName}" connector not found!` - ); - }); - - test('removeConnector', async () => { - const connectorName = 'Another Wallet'; - expect( - fuel.listConnectors().find((i) => i.name === connectorName) - ).toBeTruthy(); - fuel.removeConnector(connectorName); - expect( - fuel.listConnectors().find((i) => i.name === connectorName) - ).toBeFalsy(); - }); - - test('addConnector', async () => { - const connectorName = 'Second Wallet'; - fuel.addConnector({ name: connectorName }); - expect(fuel.hasConnector(connectorName)).toBeTruthy(); - }); - - test('Message should go to the correct Connector', async () => { - // Change the state of the second connector - mocksConnector2.backgroundService.state.isConnected = false; - - const hasConnector = await fuel.selectConnector('Fuel Wallet'); - expect(hasConnector).toBeTruthy(); - const isConnected = await fuel.isConnected(); - expect(isConnected).toBeTruthy(); - const hasConnector2 = await fuel.selectConnector('Third Wallet'); - expect(hasConnector2).toBeTruthy(); - const isConnected2 = await fuel.isConnected(); - expect(isConnected2).toBeFalsy(); - - // Change the state back of the second connector - mocksConnector2.backgroundService.state.isConnected = true; - }); -}); - -describe('Fuel Connectors Events', () => { - let mocksConnector1: MockServices; - let mocksConnector2: MockServices; - let fuel: Fuel; - - beforeAll(async () => { - mocksConnector1 = await mockFuel(); - mocksConnector2 = await mockFuel({ name: 'Third Wallet' }); - fuel = window.fuel!; - }); - - afterAll(() => { - mocksConnector1.destroy(); - mocksConnector2.destroy(); - }); - - test('Event: Connector Added', async () => { - const handleConnectorEvent = jest.fn(); - fuel.on(fuel.events.connectors, handleConnectorEvent); - const walletConnector = { name: 'Another Connector' }; - fuel.addConnector(walletConnector); - expect(handleConnectorEvent).toBeCalledWith(fuel.listConnectors()); - }); - - test('Event: Current Connector Change', async () => { - const handleConnectorChangeEvent = jest.fn(); - fuel.on(fuel.events.currentConnector, handleConnectorChangeEvent); - await fuel.selectConnector('Third Wallet'); - expect(handleConnectorChangeEvent).toBeCalledWith({ name: 'Third Wallet' }); - }); -}); diff --git a/packages/sdk-v2/src/tests/FuelWalletOptions.test.ts b/packages/sdk/src/tests/FuelWalletOptions.test.ts similarity index 100% rename from packages/sdk-v2/src/tests/FuelWalletOptions.test.ts rename to packages/sdk/src/tests/FuelWalletOptions.test.ts diff --git a/packages/sdk-v2/src/tests/MockConnector.ts b/packages/sdk/src/tests/MockConnector.ts similarity index 78% rename from packages/sdk-v2/src/tests/MockConnector.ts rename to packages/sdk/src/tests/MockConnector.ts index 11c2ddcb1..d35d0d361 100644 --- a/packages/sdk-v2/src/tests/MockConnector.ts +++ b/packages/sdk/src/tests/MockConnector.ts @@ -1,10 +1,10 @@ -import type { Asset } from '@fuels/assets'; +import type { Asset } from '@fuel-wallet/types'; import type { WalletUnlocked, TransactionRequestLike } from 'fuels'; import { setTimeout } from 'timers/promises'; -import { FuelWalletConnector } from '../FuelWalletConnector'; +import { FuelConnector } from '../FuelConnector'; import { FuelConnectorEventTypes } from '../api'; -import type { FuelABI, Network, WalletConnectorMetadata } from '../types'; +import type { FuelABI, Network, ConnectorMetadata } from '../types'; import { generateAccounts } from './utils/generateAccounts'; @@ -14,15 +14,24 @@ type MockConnectorOptions = { networks?: Array; wallets?: Array; pingDelay?: number; - metadata?: Partial; + metadata?: Partial; }; -export class MockConnector extends FuelWalletConnector { +export class MockConnector extends FuelConnector { _accounts: Array; _networks: Array; _wallets: Array; _pingDelay: number; name = 'Fuel Wallet'; + metadata: ConnectorMetadata = { + image: '/connectors/fuel-wallet.svg', + install: { + action: 'Install', + description: + 'To connect your Fuel Wallet, install the browser extension.', + link: 'https://chrome.google.com/webstore/detail/fuel-wallet/dldjpboieedgcmpkchcjcbijingjcgok', + }, + }; constructor(options: MockConnectorOptions = {}) { super(); @@ -42,14 +51,7 @@ export class MockConnector extends FuelWalletConnector { this._pingDelay = options.pingDelay ?? 900; this.name = options.name ?? this.name; this.metadata = { - image: '/connectors/fuel-wallet.svg', - connector: 'Fuel Wallet', - install: { - action: 'Install', - description: - 'To connect your Fuel Wallet, install the browser extension.', - link: 'https://chrome.google.com/webstore/detail/fuel-wallet/dldjpboieedgcmpkchcjcbijingjcgok', - }, + ...this.metadata, ...options.metadata, }; } @@ -116,14 +118,22 @@ export class MockConnector extends FuelWalletConnector { return []; } + async addAsset(_asset: Asset) { + return true; + } + async addAssets(_assets: Array) { return true; } - async addNetwork(_network: Network) { - this._networks.push(_network); + async addNetwork(_network: string) { + const newNetwork = { + chainId: 0, + url: _network, + }; + this._networks.push(newNetwork); this.emit(FuelConnectorEventTypes.networks, this._networks); - this.emit(FuelConnectorEventTypes.currentNetwork, _network); + this.emit(FuelConnectorEventTypes.currentNetwork, newNetwork); return true; } diff --git a/packages/sdk/src/tests/__mock__/MockBackgroundService.ts b/packages/sdk/src/tests/__mock__/MockBackgroundService.ts deleted file mode 100644 index 18059abb3..000000000 --- a/packages/sdk/src/tests/__mock__/MockBackgroundService.ts +++ /dev/null @@ -1,204 +0,0 @@ -import type { AbiMap, CommunicationMessage } from '@fuel-wallet/types'; -import { - FuelWalletEvents, - BACKGROUND_SCRIPT_NAME, - CONTENT_SCRIPT_NAME, - MessageTypes, -} from '@fuel-wallet/types'; -import type { WalletUnlocked } from 'fuels'; -import { Provider, transactionRequestify, Wallet } from 'fuels'; -import type { JSONRPCResponse } from 'json-rpc-2.0'; - -import { BaseConnection } from '../../connections/BaseConnection'; -import { FUEL_NETWORK } from '../constants'; - -import { AbiContractId, FlatAbi } from './abi'; - -const CACHE: Record = {}; - -export const createToWallet = async () => { - if (CACHE.toWallet) return CACHE.toWallet; - const provider = await Provider.create(process.env.PUBLIC_PROVIDER_URL!); - CACHE.toWallet = Wallet.generate({ provider }); - return CACHE.toWallet; -}; - -export class MockBackgroundService extends BaseConnection { - connection: chrome.runtime.Port; - - state: { - wallet: WalletUnlocked; - isConnected: boolean; - accounts: Array; - network: { url: string }; - abiMap: AbiMap; - }; - - constructor(extensionId: string, wallet: WalletUnlocked) { - super(); - // Mock commnucation protocol isolated by extension id - this.connection = chrome.runtime.connect(extensionId); - this.connection.onMessage.addListener(this.onMessage.bind(this)); - this.externalMethods([ - this.version, - this.ping, - this.connect, - this.disconnect, - this.isConnected, - this.accounts, - this.network, - this.networks, - this.signMessage, - this.sendTransaction, - this.currentAccount, - this.addAssets, - this.assets, - this.addNetwork, - this.addAbi, - this.getAbi, - this.hasAbi, - ]); - this.state = { - wallet, - isConnected: true, - accounts: [wallet.address.toAddress()], - network: { - url: process.env.PUBLIC_PROVIDER_URL!, - }, - abiMap: { - [AbiContractId]: FlatAbi, - }, - }; - } - - onMessage(message: CommunicationMessage) { - if (message.target === BACKGROUND_SCRIPT_NAME) { - this.onCommunicationMessage(message); - } - } - - sendResponse(response: JSONRPCResponse | null): void { - this.connection.postMessage({ - type: MessageTypes.response, - response, - target: CONTENT_SCRIPT_NAME, - } as CommunicationMessage); - } - - sendEvent(event: string, params: Array): void { - const data: CommunicationMessage = { - type: MessageTypes.event, - events: [ - { - event, - params, - }, - ], - target: CONTENT_SCRIPT_NAME, - }; - this.connection.postMessage(data); - } - - static async start(extensionId: string) { - // Mock state of the background service - // declared in this way to enable replacement - // of the state object for testing purposes - const provider = await Provider.create(process.env.PUBLIC_PROVIDER_URL!); - const wallet = Wallet.generate({ provider }); - return new MockBackgroundService(extensionId, wallet); - } - - /** - * JSON RPC Methods - */ - async ping() { - return true; - } - - async version() { - return '0.1.1'; - } - - async isConnected() { - return this.state.isConnected; - } - - async connect() { - this.sendEvent(FuelWalletEvents.connection, [true]); - return true; - } - - async network() { - const network = this.state.network; - this.sendEvent(FuelWalletEvents.network, [network]); - return network; - } - - async networks() { - return [this.state.network, FUEL_NETWORK]; - } - - async disconnect() { - this.sendEvent(FuelWalletEvents.connection, [false]); - return true; - } - - async accounts() { - const accounts = this.state.accounts; - this.sendEvent(FuelWalletEvents.accounts, [accounts]); - return accounts; - } - - async signMessage(params: { - account: string; - message: string; - address: string; - }) { - return this.state.wallet.signMessage(params.message); - } - - async sendTransaction(params: { - address: string; - transaction: string; - message: string; - }) { - const transaction = transactionRequestify(JSON.parse(params.transaction)); - const response = await this.state.wallet.sendTransaction(transaction); - return response.id; - } - - async currentAccount() { - const account = this.state.wallet.address.toAddress(); - this.sendEvent(FuelWalletEvents.currentAccount, [account]); - return account; - } - - async assets() { - const assets = await this.state.wallet.getBalances(); - return assets; - } - - async addAsset(): Promise { - return true; - } - - async addAssets(): Promise { - return true; - } - - async addNetwork(): Promise { - return true; - } - - async addAbi(): Promise { - return true; - } - - async getAbi() { - return this.state.abiMap[AbiContractId]; - } - - async hasAbi(): Promise { - return true; - } -} diff --git a/packages/sdk/src/tests/__mock__/MockConnections.ts b/packages/sdk/src/tests/__mock__/MockConnections.ts deleted file mode 100644 index 4a05592b3..000000000 --- a/packages/sdk/src/tests/__mock__/MockConnections.ts +++ /dev/null @@ -1,59 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import EventEmitter from 'events'; - -export const windowEventBus = new EventEmitter(); -export const documentEventBus = new EventEmitter(); -export const proxyConnectorEventBus = new EventEmitter(); - -global.window = { - location: { - origin: 'http://origin.com', - }, - origin: 'http://origin.com', - addEventListener(event: string, cb: () => any) { - windowEventBus.on(event, cb); - }, - postMessage(message: any): void { - windowEventBus.emit('message', { - data: message, - origin: 'http://origin.com', - }); - }, -} as any; - -global.CustomEvent = Event as any; - -global.document = { - addEventListener(event: string, cb: () => any) { - documentEventBus.on(event, cb); - }, - dispatchEvent(event: CustomEvent): void { - documentEventBus.emit(event.type, event); - }, -} as any; - -global.chrome = { - runtime: { - connect: (id: string) => { - if (!id) { - throw new Error('No extension id provided'); - } - return { - disconnect: () => {}, - onMessage: { - addListener: (cb: any) => { - proxyConnectorEventBus.on(`${id}:message`, cb); - }, - }, - onDisconnect: { - addListener: (cb: any) => { - proxyConnectorEventBus.on(`${id}:disconnect`, cb); - }, - }, - postMessage: (data: any) => { - proxyConnectorEventBus.emit(`${id}:message`, data); - }, - }; - }, - }, -} as any; diff --git a/packages/sdk/src/tests/__mock__/MockFuel.ts b/packages/sdk/src/tests/__mock__/MockFuel.ts deleted file mode 100644 index b8816f204..000000000 --- a/packages/sdk/src/tests/__mock__/MockFuel.ts +++ /dev/null @@ -1,52 +0,0 @@ -import type { FuelWalletConnector } from '@fuel-wallet/types'; - -import { ContentProxyConnection } from '../../connections'; -import { createConnector, createUUID } from '../../utils'; - -import './MockConnections'; -import { MockBackgroundService } from './MockBackgroundService'; - -export type MockServices = { - contentProxy: ContentProxyConnection; - backgroundService: MockBackgroundService; - destroy: () => void; -}; - -const FUEL_MOCK_SERVICES: Array = []; - -function registerMockFuel(mockService: MockServices) { - FUEL_MOCK_SERVICES.push(mockService); -} - -export function cleanFuelMocks() { - FUEL_MOCK_SERVICES.map((mock) => mock.destroy()); -} - -export async function mockFuel( - connector: FuelWalletConnector = { name: 'Fuel Wallet' } -): Promise { - // Create a unique id for the extension - // This creates the ability to have multiple - // mock extensions running at the same time - global.chrome.runtime.id = createUUID(); - // Start the content proxy connection with - // the connector name - const contentProxy = ContentProxyConnection.start(connector.name); - // Create a instance of the background service - // with the extension id related to it - const backgroundService = await MockBackgroundService.start( - global.chrome.runtime.id - ); - // Create the connector and inject Fuel on Window - createConnector(connector); - // Create destroy function to clean the mock - function destroy() { - contentProxy.destroy(); - delete global.window.fuel; - } - - registerMockFuel({ contentProxy, backgroundService, destroy }); - - // Return the content proxy instance for cleaning - return { contentProxy, backgroundService, destroy }; -} diff --git a/packages/sdk/src/tests/__mock__/abi.ts b/packages/sdk/src/tests/__mock__/abi.ts deleted file mode 100644 index a11386390..000000000 --- a/packages/sdk/src/tests/__mock__/abi.ts +++ /dev/null @@ -1,72 +0,0 @@ -export const AbiContractId = - '0xd58568036bb3c01142d3149f238bcf2d75478c01fa97dfc1b8caee0f808651ff'; -export const FlatAbi = { - types: [ - { - typeId: 0, - type: '()', - components: [], - typeParameters: null, - }, - { - typeId: 1, - type: 'b256', - components: null, - typeParameters: null, - }, - { - typeId: 2, - type: 'struct Address', - components: [ - { - name: 'value', - type: 1, - typeArguments: null, - }, - ], - typeParameters: null, - }, - { - typeId: 3, - type: 'u64', - components: null, - typeParameters: null, - }, - ], - functions: [ - { - inputs: [ - { - name: 'amount', - type: 3, - typeArguments: null, - }, - { - name: 'address', - type: 2, - typeArguments: null, - }, - { - name: 'amount2', - type: 3, - typeArguments: null, - }, - ], - name: 'mint_to_address', - output: { - name: '', - type: 0, - typeArguments: null, - }, - attributes: [ - { - name: 'storage', - arguments: ['read', 'write'], - }, - ], - }, - ], - loggedTypes: [], - messagesTypes: [], - configurables: [], -}; diff --git a/packages/sdk/src/tests/__mock__/index.ts b/packages/sdk/src/tests/__mock__/index.ts deleted file mode 100644 index 5af3e304f..000000000 --- a/packages/sdk/src/tests/__mock__/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './abi'; -export * from './MockFuel'; -export * from './MockBackgroundService'; -export * from './utils'; diff --git a/packages/sdk/src/tests/__mock__/utils.ts b/packages/sdk/src/tests/__mock__/utils.ts deleted file mode 100644 index fc45381ad..000000000 --- a/packages/sdk/src/tests/__mock__/utils.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { BN } from 'fuels'; -import { BaseAssetId, Address, Wallet, Provider } from 'fuels'; - -import { getGasConfig } from '../../utils'; - -export async function seedWallet(address: string, amount: BN) { - const provider = await Provider.create(process.env.PUBLIC_PROVIDER_URL!); - const genesisWallet = Wallet.fromPrivateKey( - process.env.PUBLIC_GENESIS_SECRET!, - provider - ); - const { gasLimit, gasPrice } = await getGasConfig(genesisWallet.provider); - const response = await genesisWallet.transfer( - Address.fromString(address), - amount, - BaseAssetId, - { gasLimit, gasPrice } - ); - await response.wait(); -} diff --git a/packages/sdk/src/tests/constants.ts b/packages/sdk/src/tests/constants.ts deleted file mode 100644 index a48ced3ad..000000000 --- a/packages/sdk/src/tests/constants.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const FUEL_NETWORK = { - name: 'Fuel Testnet', - url: 'https://beta-5.fuel.network/graphql', -}; diff --git a/packages/sdk-v2/src/tests/utils/generateAccounts.ts b/packages/sdk/src/tests/utils/generateAccounts.ts similarity index 100% rename from packages/sdk-v2/src/tests/utils/generateAccounts.ts rename to packages/sdk/src/tests/utils/generateAccounts.ts diff --git a/packages/sdk-v2/src/tests/utils/promiseCallback.ts b/packages/sdk/src/tests/utils/promiseCallback.ts similarity index 100% rename from packages/sdk-v2/src/tests/utils/promiseCallback.ts rename to packages/sdk/src/tests/utils/promiseCallback.ts diff --git a/packages/sdk-v2/src/types.ts b/packages/sdk/src/types.ts similarity index 86% rename from packages/sdk-v2/src/types.ts rename to packages/sdk/src/types.ts index 431a1dac6..2c9c3bf8c 100644 --- a/packages/sdk-v2/src/types.ts +++ b/packages/sdk/src/types.ts @@ -1,10 +1,9 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import type { Asset } from '@fuels/assets'; +import type { Asset } from '@fuel-wallet/types'; import type { JsonAbi } from 'fuels'; -import type { FuelWalletConnector } from './FuelWalletConnector'; +import type { FuelConnector } from './FuelConnector'; import type { FuelConnectorEventTypes } from './api'; -import { FuelConnectorEventType } from './api'; /**** * ======================================================================================== @@ -101,7 +100,7 @@ export type NetworksEvent = { */ export type ConnectorsEvent = { type: FuelConnectorEventTypes.connectors; - data: Array; + data: Array; }; /** @@ -114,7 +113,20 @@ export type ConnectorsEvent = { */ export type ConnectorEvent = { type: FuelConnectorEventTypes.currentConnector; - data: FuelWalletConnector; + data: FuelConnector; +}; + +/** + * Event trigger when the assets list of metadata changed. + * + * @event AssetsEvent + * @type {object} + * @property {string} type - The event type. + * @property {Array} data - The list of assets + */ +export type AssetsEvent = { + type: FuelConnectorEventTypes.assets; + data: Array; }; /** @@ -127,7 +139,8 @@ export type FuelConnectorEvents = | AccountEvent | AccountsEvent | ConnectorsEvent - | ConnectorEvent; + | ConnectorEvent + | AssetsEvent; export type FuelConnectorEventsType = FuelConnectorEvents['type']; @@ -165,13 +178,6 @@ export type Network = { chainId: number; }; -/** - * Asset metadata that represents a asset_id from Fuel Network. - * - * Read more at: https://github.com/FuelLabs/fuels-npm-packs/tree/main/packages/assets - */ -export type FuelAsset = Asset; - /** * ABI that represents a binary code interface from Sway. * @@ -185,14 +191,13 @@ export type FuelABI = JsonAbi; * ======================================================================================== */ -export type WalletConnectorMetadata = { - image: +export type ConnectorMetadata = { + image?: | string | { light: string; dark: string; }; - connector: string; install: { action: string; link: string; @@ -230,14 +235,3 @@ export interface FuelStorage { getItem: (key: string) => string | null; removeItem: (key: string) => void; } - -/** - * Fuel Connector Event is a custom event that can be used by the connector to - * inform the Fuel Connector Manager that a new connector is available. - */ -export class FuelConnectorEvent extends CustomEvent { - static type = FuelConnectorEventType; - constructor(connector: FuelWalletConnector) { - super(FuelConnectorEventType, { detail: connector }); - } -} diff --git a/packages/sdk/src/utils/blockExplorer.ts b/packages/sdk/src/utils/blockExplorer.ts deleted file mode 100644 index 26d4c7444..000000000 --- a/packages/sdk/src/utils/blockExplorer.ts +++ /dev/null @@ -1,14 +0,0 @@ -export const BLOCK_EXPLORER_URL = - 'https://fuellabs.github.io/block-explorer-v2/'; - -export function getBlockExplorerLink({ - path, - providerUrl, -}: { - path: string; - providerUrl?: string; -}) { - return `${BLOCK_EXPLORER_URL}${path}${ - providerUrl ? `?providerUrl=${encodeURIComponent(providerUrl)}` : '' - }`; -} diff --git a/packages/sdk-v2/src/utils/cache.ts b/packages/sdk/src/utils/cache.ts similarity index 100% rename from packages/sdk-v2/src/utils/cache.ts rename to packages/sdk/src/utils/cache.ts diff --git a/packages/sdk/src/utils/createConnector.ts b/packages/sdk/src/utils/createConnector.ts deleted file mode 100644 index 7ef0e473d..000000000 --- a/packages/sdk/src/utils/createConnector.ts +++ /dev/null @@ -1,36 +0,0 @@ -import type { FuelWalletConnector } from '@fuel-wallet/types'; - -import { Fuel } from '../Fuel'; - -import { createReadOnly } from './createReadOnly'; - -type ObjectTarget = object & { fuel?: Fuel }; - -function injectFuel(fuel: Fuel, target: object & { fuel?: Fuel }) { - const fuelObj = createReadOnly(fuel); - Object.defineProperty(target, 'fuel', { - value: fuel, - writable: false, - enumerable: true, - configurable: true, - }); - - if (typeof document !== 'undefined') { - // Dispatch event fuel loaded into the document - const fuelLoadedEvent = new CustomEvent('FuelLoaded', { - detail: fuelObj, - }); - document.dispatchEvent(fuelLoadedEvent); - } -} - -export function createConnector( - connector: FuelWalletConnector, - target: ObjectTarget = window as ObjectTarget -) { - if (target?.fuel) { - target.fuel.addConnector(connector); - return; - } - injectFuel(new Fuel(connector), target); -} diff --git a/packages/sdk/src/utils/createReadOnly.ts b/packages/sdk/src/utils/createReadOnly.ts deleted file mode 100644 index c9ce5058f..000000000 --- a/packages/sdk/src/utils/createReadOnly.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { Fuel } from '../Fuel'; - -export const createReadOnly = (fuel: Fuel) => { - return new Proxy(fuel, { - get(target, prop) { - return target[prop]; - }, - set(target, key, value) { - // Avoid change keys of Fuel, except _eventsCount and _events - // This keys are constantly updated by the EventEmitter witch Fuel - // extends from. - if ( - Object.hasOwn(target, key) && - ['_eventsCount', '_events', 'connectorName'].includes(key as string) - ) { - target[key] = value; - return true; - } - return false; - }, - defineProperty(target, key) { - if (Object.hasOwn(target, key)) return target[key]; - return false; - }, - deleteProperty() { - return false; - }, - }); -}; diff --git a/packages/sdk/src/utils/dispatchFuelConnectorEvent.ts b/packages/sdk/src/utils/dispatchFuelConnectorEvent.ts new file mode 100644 index 000000000..493d63cf4 --- /dev/null +++ b/packages/sdk/src/utils/dispatchFuelConnectorEvent.ts @@ -0,0 +1,14 @@ +import type { FuelConnector } from '../FuelConnector'; +import { FuelConnectorEventType } from '../api'; + +/** + * Fuel Connector Event is a custom event that can be used by the connector to + * inform the Fuel Connector Manager that a new connector is available. + */ +export function dispatchFuelConnectorEvent(connector: FuelConnector) { + window.dispatchEvent( + new CustomEvent(FuelConnectorEventType, { + detail: connector, + }) + ); +} diff --git a/packages/sdk/src/utils/getAssetByChain.ts b/packages/sdk/src/utils/getAssetByChain.ts new file mode 100644 index 000000000..f630a0fae --- /dev/null +++ b/packages/sdk/src/utils/getAssetByChain.ts @@ -0,0 +1,23 @@ +import type { Asset, AssetData, AssetFuel } from '@fuel-wallet/types'; + +export function getAssetByChain( + asset: Asset, + chainId: number, + network: string = 'fuel' +): AssetData { + const assetFuelNetwork = asset.networks.find( + (item) => item.chainId === chainId && item.type === network + ) as AssetFuel; + + if (!assetFuelNetwork) { + throw new Error('Asset not found for the given chain and network.'); + } + + return { + ...asset, + assetId: assetFuelNetwork.assetId, + decimals: assetFuelNetwork.decimals, + chainId: assetFuelNetwork.chainId, + network: assetFuelNetwork.type, + }; +} diff --git a/packages/sdk/src/utils/getTransactionSigner.ts b/packages/sdk/src/utils/getTransactionSigner.ts deleted file mode 100644 index ab221b5b5..000000000 --- a/packages/sdk/src/utils/getTransactionSigner.ts +++ /dev/null @@ -1,21 +0,0 @@ -import type { TransactionRequestLike } from 'fuels'; -import { hexlify, Address, InputType } from 'fuels'; - -export function getTransactionSigner(transaction: TransactionRequestLike) { - const address = transaction.inputs?.map((i) => { - switch (i.type) { - case InputType.Message: - return i.recipient; - case InputType.Coin: - return i.owner; - default: - return undefined; - } - })[0]; - - if (!address) { - throw new Error('No possible signer found!'); - } - - return Address.fromB256(hexlify(address)).toString(); -} diff --git a/packages/sdk/src/utils/index.ts b/packages/sdk/src/utils/index.ts index 815b2784f..2b91c1658 100644 --- a/packages/sdk/src/utils/index.ts +++ b/packages/sdk/src/utils/index.ts @@ -1,8 +1,4 @@ -export * from './blockExplorer'; -export * from './createReadOnly'; -export * from './createUUID'; -export * from './getTransactionSigner'; -export * from './createConnector'; -export * from './hasWindow'; +export * from './cache'; export * from './promise'; -export * from './provider'; +export * from './getAssetByChain'; +export * from './dispatchFuelConnectorEvent'; diff --git a/packages/sdk/src/utils/promise.ts b/packages/sdk/src/utils/promise.ts index dd3789300..3f752fbef 100644 --- a/packages/sdk/src/utils/promise.ts +++ b/packages/sdk/src/utils/promise.ts @@ -15,3 +15,15 @@ export function deferPromise() { return defer; } + +export async function withTimeout, RT = Awaited>( + promise: F, + timeout: number = 1050 +): Promise { + const timeoutPromise = new Promise((_, reject) => { + setTimeout(() => { + reject(new Error('Promise timed out')); + }, timeout); + }); + return Promise.race([timeoutPromise, promise]) as any; +} diff --git a/packages/sdk/tsconfig.json b/packages/sdk/tsconfig.json index 9f1fb67d7..b2ad2455d 100644 --- a/packages/sdk/tsconfig.json +++ b/packages/sdk/tsconfig.json @@ -3,6 +3,7 @@ "compilerOptions": { "keyofStringsOnly": true, "ignoreDeprecations": "5.0", + "resolveJsonModule": true, "outDir": "./dist", "baseUrl": ".", "rootDir": "." diff --git a/packages/sdk/tsup.config.ts b/packages/sdk/tsup.config.ts index 98095ee6a..7d100b414 100644 --- a/packages/sdk/tsup.config.ts +++ b/packages/sdk/tsup.config.ts @@ -1,15 +1,9 @@ -import { getPublicEnvs } from './load.envs'; - export default { sourcemap: true, shims: true, treeshake: true, format: ['cjs', 'esm'], - minify: process.env.NODE_ENV === 'production', + minify: true, entry: ['./src/index.ts'], - noExternal: ['@fuel-wallet/types'], - define: { - 'process.env': JSON.stringify(getPublicEnvs()), - }, dts: true, }; diff --git a/packages/types/package.json b/packages/types/package.json index a9ae8f8cd..a895284fa 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -3,8 +3,25 @@ "version": "0.14.3", "license": "Apache-2.0", "main": "src/index.ts", + "publishConfig": { + "main": "dist/index.js", + "module": "dist/index.mjs", + "types": "dist/index.d.ts", + "typings": "dist/index.d.ts", + "exports": { + ".": { + "require": "./dist/index.js", + "types": "./dist/index.d.ts", + "default": "./dist/index.mjs" + } + } + }, + "scripts": { + "build": "pnpm ts:check && tsup", + "ts:check": "tsc --noEmit" + }, "dependencies": { - "@types/chrome": "^0.0.246", + "@fuels/assets": "^0.1.1", "dexie-observable": "4.0.1-beta.13", "json-rpc-2.0": "^1.6.0" }, @@ -12,6 +29,7 @@ "fuels": ">=0.71.1" }, "devDependencies": { - "fuels": "0.71.1" + "fuels": "0.71.1", + "tsup": "^7.2.0" } } diff --git a/packages/types/src/asset.ts b/packages/types/src/asset.ts index c61876315..6c9d74df5 100644 --- a/packages/types/src/asset.ts +++ b/packages/types/src/asset.ts @@ -1,14 +1,19 @@ import type { BNInput } from 'fuels'; +export type { Asset } from '@fuels/assets'; +export type { Fuel as AssetFuel } from '@fuels/assets'; +export type { Ethereum as AssetEthereum } from '@fuels/assets'; -export type Asset = { +export type AssetData = { name?: string; assetId: string; imageUrl?: string; symbol?: string; decimals?: number; isCustom?: boolean; + chainId?: number; + network?: string; }; -export type AssetAmount = Asset & { +export type AssetAmount = AssetData & { amount?: BNInput; }; diff --git a/packages/types/src/constants.ts b/packages/types/src/constants.ts index e4e550247..ebd1a8666 100644 --- a/packages/types/src/constants.ts +++ b/packages/types/src/constants.ts @@ -1,3 +1,4 @@ +export const CONNECTOR_SCRIPT = 'FuelConnectorScript'; export const CONTENT_SCRIPT_NAME = 'FuelContentScript'; export const BACKGROUND_SCRIPT_NAME = 'FuelBackgroundScript'; export const POPUP_SCRIPT_NAME = 'FuelPopUpScript'; diff --git a/packages/types/src/fuel.ts b/packages/types/src/fuel.ts index 33ee242c2..5bbe7f739 100644 --- a/packages/types/src/fuel.ts +++ b/packages/types/src/fuel.ts @@ -5,59 +5,6 @@ import type { } from 'dexie-observable/api'; import type { JSONRPCRequest, JSONRPCResponse } from 'json-rpc-2.0'; -import type { Asset } from './asset'; -import type { Network } from './network'; - -export const FuelWalletEvents = { - accounts: 'accounts', - currentAccount: 'currentAccount', - connection: 'connection', - network: 'network', - assets: 'assets', - connectors: 'connectors', - currentConnector: 'currentConnector', - load: 'load', -} as const; - -export type FuelEvents = - | { - type: typeof FuelWalletEvents.accounts; - data: Array; - } - | { - type: typeof FuelWalletEvents.currentAccount; - data: string | null; - } - | { - type: typeof FuelWalletEvents.connection; - data: boolean; - } - | { - type: typeof FuelWalletEvents.network; - data: Network; - } - | { - type: typeof FuelWalletEvents.assets; - data: Array; - } - | { - type: typeof FuelWalletEvents.connectors; - data: Array; - } - | { - type: typeof FuelWalletEvents.currentConnector; - data: FuelWalletConnector; - } - | { - type: typeof FuelWalletEvents.load; - data: boolean; - }; - -export type FuelEventArg = Extract< - FuelEvents, - { type: T } ->['data']; - export enum MessageTypes { ping = 'ping', uiEvent = 'uiEvent', @@ -67,11 +14,24 @@ export enum MessageTypes { removeConnection = 'removeConnection', } +export interface MessageSender { + id?: string | undefined; + origin?: string | undefined; + tab?: { + id?: number | undefined; + index?: number | undefined; + windowId?: number | undefined; + url?: string | undefined; + title?: string | undefined; + favIconUrl?: string | undefined; + }; +} + export type BaseEvent = { readonly target: string; readonly connectorName?: string; readonly id?: string; - readonly sender?: chrome.runtime.Port['sender']; + readonly sender?: MessageSender; } & T; export type UIEventMessage = BaseEvent<{ @@ -134,8 +94,3 @@ export type FuelProviderConfig = { id?: string; url: string; }; - -export type FuelWalletConnector = { - name: string; - imageUrl?: string; -}; diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index c02a30b7f..8e96b6466 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -1,4 +1,3 @@ -/// export * from './asset'; export * from './coin'; export * from './accounts'; diff --git a/packages/types/src/network.ts b/packages/types/src/network.ts index 87f163910..d5fca234c 100644 --- a/packages/types/src/network.ts +++ b/packages/types/src/network.ts @@ -1,4 +1,4 @@ -export type Network = { +export type NetworkData = { id?: string; name: string; url: string; diff --git a/packages/types/tsup.config.ts b/packages/types/tsup.config.ts new file mode 100644 index 000000000..7d100b414 --- /dev/null +++ b/packages/types/tsup.config.ts @@ -0,0 +1,9 @@ +export default { + sourcemap: true, + shims: true, + treeshake: true, + format: ['cjs', 'esm'], + minify: true, + entry: ['./src/index.ts'], + dts: true, +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7618534a3..71382e819 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,7 @@ settings: excludeLinksFromLockfile: false overrides: + follow-redirects: '>=1.15.4' glob-parent@<5.1.2: '>=5.1.2' json5: '>=2.2.2' trim-newlines@<3.0.1: '>=3.0.1' @@ -19,6 +20,7 @@ overrides: '@adobe/css-tools': '>=4.3.1' postcss@<8.4.31: '>=8.4.31' zod@<=3.22.2: '>=3.22.3' + nth-check: '>=2.1.1' '@adobe/css-tools@<4.3.2': '>=4.3.2' '@babel/traverse@<7.23.2': '>=7.23.2' @@ -130,6 +132,39 @@ importers: specifier: ^15.0.2 version: 15.0.2 + examples/cra-dapp: + dependencies: + '@fuel-wallet/react': + specifier: workspace:* + version: link:../../packages/react + '@types/node': + specifier: ^16.18.61 + version: 16.18.68 + '@types/react': + specifier: ^18.2.37 + version: 18.2.45 + '@types/react-dom': + specifier: ^18.2.15 + version: 18.2.17 + fuels: + specifier: 0.67.0 + version: 0.67.0 + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + react-scripts: + specifier: 5.0.1 + version: 5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(esbuild@0.19.5)(eslint@8.51.0)(react@18.2.0)(ts-node@10.9.1)(typescript@4.9.5) + typescript: + specifier: ^4.9.5 + version: 4.9.5 + web-vitals: + specifier: ^2.1.4 + version: 2.1.4 + packages/app: dependencies: '@fontsource/source-code-pro': @@ -150,6 +185,9 @@ importers: '@fuel-ui/test-utils': specifier: 0.17.0 version: 0.17.0(@babel/core@7.23.2)(@jest/types@29.6.3)(@types/node@20.8.4)(esbuild@0.19.5)(react@18.2.0)(ts-node@10.9.1)(typescript@5.2.2) + '@fuel-wallet/connections': + specifier: workspace:* + version: link:../connections '@fuel-wallet/sdk': specifier: workspace:* version: link:../sdk @@ -274,6 +312,9 @@ importers: '@crxjs/vite-plugin': specifier: ^1.0.14 version: 1.0.14(vite@4.5.2) + '@fuel-wallet/react': + specifier: workspace:* + version: link:../react '@graphql-codegen/cli': specifier: ^5.0.0 version: 5.0.0(@types/node@20.8.4)(graphql@16.8.1) @@ -425,6 +466,46 @@ importers: specifier: ^4.2.1 version: 4.2.1(typescript@5.2.2)(vite@4.5.2) + packages/connections: + dependencies: + '@fuel-wallet/sdk': + specifier: workspace:* + version: link:../sdk + '@fuel-wallet/types': + specifier: workspace:* + version: link:../types + '@fuels/assets': + specifier: 0.0.11 + version: 0.0.11 + '@types/chrome': + specifier: ^0.0.246 + version: 0.0.246 + events: + specifier: ^3.3.0 + version: 3.3.0 + json-rpc-2.0: + specifier: ^1.6.0 + version: 1.6.0 + uuid: + specifier: ^9.0.1 + version: 9.0.1 + devDependencies: + '@fuel-ts/wallet': + specifier: 0.71.1 + version: 0.71.1 + '@types/uuid': + specifier: ^9.0.5 + version: 9.0.5 + fuels: + specifier: 0.71.1 + version: 0.71.1 + jest-environment-jsdom: + specifier: 29.6.2 + version: 29.6.2 + tsup: + specifier: ^7.2.0 + version: 7.2.0(ts-node@10.9.1)(typescript@5.2.2) + packages/docs: dependencies: '@docsearch/css': @@ -442,6 +523,9 @@ importers: '@fuel-ui/react': specifier: 0.23.0 version: 0.23.0(@types/react-dom@18.2.13)(@types/react@18.2.28)(csstype@3.1.2) + '@fuel-wallet/react': + specifier: workspace:* + version: link:../react '@fuel-wallet/sdk': specifier: workspace:* version: link:../sdk @@ -581,6 +665,9 @@ importers: react-dom: specifier: ^18.2.0 version: 18.2.0(react@18.2.0) + react-error-boundary: + specifier: ^4.0.11 + version: 4.0.12(react@18.2.0) react-hot-toast: specifier: ^2.4.1 version: 2.4.1(csstype@3.1.2)(react-dom@18.2.0)(react@18.2.0) @@ -630,31 +717,31 @@ importers: packages/react: dependencies: - '@fuel-ui/css': - specifier: 0.23.0 - version: 0.23.0 - '@fuel-ui/react': - specifier: 0.23.0 - version: 0.23.0(@types/react-dom@18.2.13)(@types/react@18.2.28)(csstype@3.1.2) - '@fuel-wallet/sdk': - specifier: workspace:* - version: link:../sdk - '@fuel-wallet/types': - specifier: workspace:* - version: link:../types + '@radix-ui/react-dialog': + specifier: ^1.0.5 + version: 1.0.5(@types/react-dom@18.2.13)(@types/react@18.2.28)(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-query': specifier: ^4.36.1 version: 4.36.1(react@18.2.0) - compare-versions: - specifier: ^6.1.0 - version: 6.1.0 + events: + specifier: ^3.3.0 + version: 3.3.0 react: specifier: '*' version: 18.2.0 devDependencies: + '@fuel-wallet/sdk': + specifier: workspace:* + version: link:../sdk + compare-versions: + specifier: ^6.1.0 + version: 6.1.0 fuels: specifier: 0.71.1 version: 0.71.1 + styled-components: + specifier: ^6.1.1 + version: 6.1.8(react@18.2.0) tsup: specifier: ^7.2.0 version: 7.2.0(ts-node@10.9.1)(typescript@5.2.2) @@ -664,47 +751,13 @@ importers: '@fuel-wallet/types': specifier: workspace:* version: link:../types - dexie-observable: - specifier: 4.0.1-beta.13 - version: 4.0.1-beta.13(dexie@3.2.4) events: specifier: ^3.3.0 version: 3.3.0 json-rpc-2.0: specifier: ^1.6.0 version: 1.6.0 - uuid: - specifier: ^9.0.1 - version: 9.0.1 - xstate: - specifier: ^4.38.2 - version: 4.38.2 - devDependencies: - '@types/uuid': - specifier: ^9.0.5 - version: 9.0.5 - fuels: - specifier: 0.71.1 - version: 0.71.1 - jest-webextension-mock: - specifier: ^3.8.9 - version: 3.8.9 - tsup: - specifier: ^7.2.0 - version: 7.2.0(ts-node@10.9.1)(typescript@5.2.2) - - packages/sdk-v2: - dependencies: - '@fuels/assets': - specifier: 0.0.11 - version: 0.0.11 - events: - specifier: ^3.3.0 - version: 3.3.0 devDependencies: - '@fuel-ts/wallet': - specifier: 0.71.1 - version: 0.71.1 fuels: specifier: 0.71.1 version: 0.71.1 @@ -736,9 +789,9 @@ importers: packages/types: dependencies: - '@types/chrome': - specifier: ^0.0.246 - version: 0.0.246 + '@fuels/assets': + specifier: ^0.1.1 + version: 0.1.4 dexie-observable: specifier: 4.0.1-beta.13 version: 4.0.1-beta.13(dexie@3.2.4) @@ -749,6 +802,9 @@ importers: fuels: specifier: 0.71.1 version: 0.71.1 + tsup: + specifier: ^7.2.0 + version: 7.2.0(ts-node@10.9.1)(typescript@5.2.2) packages/update-sdk: dependencies: @@ -813,7 +869,6 @@ packages: /@aashutoshrathi/word-wrap@1.2.6: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - dev: true /@adobe/css-tools@4.3.2: resolution: {integrity: sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==} @@ -956,6 +1011,11 @@ packages: '@algolia/requester-common': 4.19.1 dev: false + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + dev: false + /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} @@ -963,6 +1023,18 @@ packages: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 + /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0): + resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} + engines: {node: '>=10'} + peerDependencies: + ajv: '>=8' + dependencies: + ajv: 8.12.0 + json-schema: 0.4.0 + jsonpointer: 5.0.1 + leven: 3.1.0 + dev: false + /@ardatan/relay-compiler@12.0.0(graphql@16.8.1): resolution: {integrity: sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q==} hasBin: true @@ -1027,7 +1099,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.22.5 - dev: true /@babel/compat-data@7.22.9: resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} @@ -1055,6 +1126,20 @@ packages: transitivePeerDependencies: - supports-color + /@babel/eslint-parser@7.23.3(@babel/core@7.23.2)(eslint@8.51.0): + resolution: {integrity: sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + eslint: ^7.5.0 || ^8.0.0 + dependencies: + '@babel/core': 7.23.2 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 8.51.0 + eslint-visitor-keys: 2.1.0 + semver: 7.5.4 + dev: false + /@babel/generator@7.22.10: resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} engines: {node: '>=6.9.0'} @@ -1089,14 +1174,12 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 - dev: true /@babel/helper-builder-binary-assignment-operator-visitor@7.22.5: resolution: {integrity: sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 - dev: true /@babel/helper-compilation-targets@7.22.10: resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} @@ -1107,7 +1190,6 @@ packages: browserslist: 4.21.10 lru-cache: 5.1.1 semver: 7.5.4 - dev: true /@babel/helper-compilation-targets@7.22.15: resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} @@ -1135,7 +1217,24 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 semver: 7.5.4 - dev: true + + /@babel/helper-create-class-features-plugin@7.23.7(@babel/core@7.23.2): + resolution: {integrity: sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.2) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 7.5.4 + dev: false /@babel/helper-create-regexp-features-plugin@7.22.9(@babel/core@7.23.2): resolution: {integrity: sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==} @@ -1147,7 +1246,6 @@ packages: '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 semver: 7.5.4 - dev: true /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.23.2): resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==} @@ -1162,7 +1260,36 @@ packages: resolve: 1.22.4 transitivePeerDependencies: - supports-color - dev: true + + /@babel/helper-define-polyfill-provider@0.4.4(@babel/core@7.23.2): + resolution: {integrity: sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.4 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-define-polyfill-provider@0.5.0(@babel/core@7.23.2): + resolution: {integrity: sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.4 + transitivePeerDependencies: + - supports-color + dev: false /@babel/helper-environment-visitor@7.22.20: resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} @@ -1171,7 +1298,6 @@ packages: /@babel/helper-environment-visitor@7.22.5: resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-function-name@7.22.5: resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} @@ -1179,7 +1305,6 @@ packages: dependencies: '@babel/template': 7.22.5 '@babel/types': 7.23.0 - dev: true /@babel/helper-function-name@7.23.0: resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} @@ -1199,7 +1324,13 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 - dev: true + + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: false /@babel/helper-module-imports@7.22.15: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} @@ -1212,7 +1343,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 - dev: true /@babel/helper-module-transforms@7.22.9(@babel/core@7.23.2): resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} @@ -1226,7 +1356,6 @@ packages: '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 - dev: true /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.2): resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} @@ -1246,7 +1375,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 - dev: true /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} @@ -1262,7 +1390,18 @@ packages: '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.5 '@babel/helper-wrap-function': 7.22.9 - dev: true + + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.2): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: false /@babel/helper-replace-supers@7.22.9(@babel/core@7.23.2): resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==} @@ -1274,7 +1413,6 @@ packages: '@babel/helper-environment-visitor': 7.22.5 '@babel/helper-member-expression-to-functions': 7.22.5 '@babel/helper-optimise-call-expression': 7.22.5 - dev: true /@babel/helper-simple-access@7.22.5: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} @@ -1287,7 +1425,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 - dev: true /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} @@ -1314,7 +1451,6 @@ packages: /@babel/helper-validator-option@7.22.5: resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-wrap-function@7.22.9: resolution: {integrity: sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==} @@ -1323,7 +1459,6 @@ packages: '@babel/helper-function-name': 7.22.5 '@babel/template': 7.22.5 '@babel/types': 7.23.0 - dev: true /@babel/helpers@7.23.2: resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} @@ -1350,7 +1485,6 @@ packages: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 - dev: true /@babel/parser@7.22.11: resolution: {integrity: sha512-R5zb8eJIBPJriQtbH/htEQy4k7E2dHWlD2Y2VT07JCzwYZHBxV5ZYtM0UhXSNMT74LyxuM+b1jdL7pSesXbC/g==} @@ -1365,7 +1499,6 @@ packages: hasBin: true dependencies: '@babel/types': 7.22.11 - dev: true /@babel/parser@7.23.0: resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} @@ -1382,7 +1515,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==} @@ -1394,7 +1526,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-transform-optional-chaining': 7.22.6(@babel/core@7.23.2) - dev: true /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.2): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} @@ -1406,7 +1537,18 @@ packages: '@babel/core': 7.23.2 '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - dev: true + + /@babel/plugin-proposal-decorators@7.23.7(@babel/core@7.23.2): + resolution: {integrity: sha512-b1s5JyeMvqj7d9m9KhJNHKc18gEJiSyVzVX3bwbiPalQBQpuvfPh6lA9F7Kk/dWH0TIiXRpB9yicwijY6buPng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-decorators': 7.23.3(@babel/core@7.23.2) + dev: false /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.2): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} @@ -1418,7 +1560,18 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) - dev: true + + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.23.2): + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) + dev: false /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.23.2): resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} @@ -1445,7 +1598,18 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) - dev: true + + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.23.2): + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + dev: false /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.2): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} @@ -1454,19 +1618,31 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.2 - dev: true - /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.23.2): - resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} - engines: {node: '>=4'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead. + /@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.23.2): + resolution: {integrity: sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.2 - '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.23.2) + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.23.2) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2) + dev: false + + /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.23.2): + resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} + engines: {node: '>=4'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.2): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} @@ -1500,7 +1676,16 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true + + /@babel/plugin-syntax-decorators@7.23.3(@babel/core@7.23.2): + resolution: {integrity: sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: false /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} @@ -1509,7 +1694,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} @@ -1518,7 +1702,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} @@ -1528,7 +1711,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} @@ -1538,7 +1720,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} @@ -1548,7 +1729,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.2): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} @@ -1631,7 +1811,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.2): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} @@ -1660,7 +1839,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} @@ -1670,7 +1848,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-async-generator-functions@7.22.7(@babel/core@7.23.2): resolution: {integrity: sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg==} @@ -1683,7 +1860,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.23.2) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.2) - dev: true /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} @@ -1695,7 +1871,6 @@ packages: '@babel/helper-module-imports': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.23.2) - dev: true /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} @@ -1705,7 +1880,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-block-scoping@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==} @@ -1715,7 +1889,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} @@ -1726,7 +1899,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-class-static-block@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==} @@ -1738,7 +1910,6 @@ packages: '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.2) - dev: true /@babel/plugin-transform-classes@7.22.6(@babel/core@7.23.2): resolution: {integrity: sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==} @@ -1756,7 +1927,6 @@ packages: '@babel/helper-replace-supers': 7.22.9(@babel/core@7.23.2) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 - dev: true /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} @@ -1767,7 +1937,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/template': 7.22.5 - dev: true /@babel/plugin-transform-destructuring@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==} @@ -1777,7 +1946,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} @@ -1788,7 +1956,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} @@ -1798,7 +1965,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-dynamic-import@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==} @@ -1809,7 +1975,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.2) - dev: true /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} @@ -1820,7 +1985,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-export-namespace-from@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==} @@ -1831,7 +1995,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.2) - dev: true /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==} @@ -1842,7 +2005,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.2) - dev: true /@babel/plugin-transform-for-of@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==} @@ -1852,7 +2014,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} @@ -1864,7 +2025,6 @@ packages: '@babel/helper-compilation-targets': 7.22.10 '@babel/helper-function-name': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-json-strings@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==} @@ -1875,7 +2035,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.2) - dev: true /@babel/plugin-transform-literals@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} @@ -1885,7 +2044,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-logical-assignment-operators@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==} @@ -1896,7 +2054,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.2) - dev: true /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} @@ -1906,7 +2063,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==} @@ -1917,7 +2073,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-module-transforms': 7.22.9(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-modules-commonjs@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==} @@ -1929,7 +2084,6 @@ packages: '@babel/helper-module-transforms': 7.22.9(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 - dev: true /@babel/plugin-transform-modules-systemjs@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==} @@ -1942,7 +2096,6 @@ packages: '@babel/helper-module-transforms': 7.22.9(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-identifier': 7.22.5 - dev: true /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} @@ -1953,7 +2106,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-module-transforms': 7.22.9(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} @@ -1964,7 +2116,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} @@ -1974,7 +2125,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-nullish-coalescing-operator@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==} @@ -1985,7 +2135,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.2) - dev: true /@babel/plugin-transform-numeric-separator@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==} @@ -1996,7 +2145,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.2) - dev: true /@babel/plugin-transform-object-rest-spread@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==} @@ -2010,7 +2158,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.2) '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.23.2) - dev: true /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} @@ -2021,7 +2168,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-replace-supers': 7.22.9(@babel/core@7.23.2) - dev: true /@babel/plugin-transform-optional-catch-binding@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==} @@ -2032,7 +2178,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.2) - dev: true /@babel/plugin-transform-optional-chaining@7.22.6(@babel/core@7.23.2): resolution: {integrity: sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==} @@ -2044,7 +2189,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.2) - dev: true /@babel/plugin-transform-parameters@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==} @@ -2054,7 +2198,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} @@ -2065,7 +2208,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-private-property-in-object@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==} @@ -2078,7 +2220,6 @@ packages: '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.2) - dev: true /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} @@ -2088,7 +2229,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-react-constant-elements@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA==} @@ -2098,7 +2238,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} @@ -2108,7 +2247,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} @@ -2118,7 +2256,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.23.2) - dev: true /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} @@ -2152,7 +2289,6 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) '@babel/types': 7.22.11 - dev: true /@babel/plugin-transform-react-pure-annotations@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} @@ -2163,7 +2299,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-regenerator@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==} @@ -2174,7 +2309,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 regenerator-transform: 0.15.1 - dev: true /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} @@ -2184,7 +2318,23 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true + + /@babel/plugin-transform-runtime@7.23.7(@babel/core@7.23.2): + resolution: {integrity: sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + babel-plugin-polyfill-corejs2: 0.4.8(@babel/core@7.23.2) + babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.23.2) + babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.23.2) + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: false /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} @@ -2194,7 +2344,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} @@ -2205,7 +2354,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - dev: true /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} @@ -2215,7 +2363,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} @@ -2225,7 +2372,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} @@ -2235,7 +2381,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-typescript@7.22.9(@babel/core@7.23.2): resolution: {integrity: sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg==} @@ -2248,7 +2393,6 @@ packages: '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.2) - dev: true /@babel/plugin-transform-unicode-escapes@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==} @@ -2258,7 +2402,6 @@ packages: dependencies: '@babel/core': 7.23.2 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} @@ -2269,7 +2412,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} @@ -2280,7 +2422,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} @@ -2291,7 +2432,6 @@ packages: '@babel/core': 7.23.2 '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.23.2) '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/preset-env@7.22.9(@babel/core@7.23.2): resolution: {integrity: sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==} @@ -2382,7 +2522,6 @@ packages: semver: 7.5.4 transitivePeerDependencies: - supports-color - dev: true /@babel/preset-flow@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-ta2qZ+LSiGCrP5pgcGt8xMnnkXQrq8Sa4Ulhy06BOlF5QbLw9q5hIx7bn5MrsvyTGAfh6kTOo07Q+Pfld/8Y5Q==} @@ -2407,7 +2546,6 @@ packages: '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.23.2) '@babel/types': 7.22.11 esutils: 2.0.3 - dev: true /@babel/preset-react@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ==} @@ -2422,7 +2560,6 @@ packages: '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.23.2) '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.2) '@babel/plugin-transform-react-pure-annotations': 7.22.5(@babel/core@7.23.2) - dev: true /@babel/preset-typescript@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==} @@ -2436,7 +2573,6 @@ packages: '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.23.2) '@babel/plugin-transform-typescript': 7.22.9(@babel/core@7.23.2) - dev: true /@babel/register@7.22.5(@babel/core@7.23.2): resolution: {integrity: sha512-vV6pm/4CijSQ8Y47RH5SopXzursN35RQINfGJkmOlcpAtGuf94miFvIPhCKGQN7WGIcsgG1BHEX2KVdTYwTwUQ==} @@ -2454,7 +2590,6 @@ packages: /@babel/regjsgen@0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - dev: true /@babel/runtime@7.22.6: resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} @@ -2477,7 +2612,6 @@ packages: '@babel/code-frame': 7.22.5 '@babel/parser': 7.22.7 '@babel/types': 7.22.5 - dev: true /@babel/traverse@7.23.2: resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} @@ -2511,7 +2645,6 @@ packages: '@babel/helper-string-parser': 7.22.5 '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 - dev: true /@babel/types@7.23.0: resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} @@ -2771,6 +2904,163 @@ packages: dependencies: '@jridgewell/trace-mapping': 0.3.9 + /@csstools/normalize.css@12.1.1: + resolution: {integrity: sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==} + dev: false + + /@csstools/postcss-cascade-layers@1.1.1(postcss@8.4.32): + resolution: {integrity: sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.13) + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + dev: false + + /@csstools/postcss-color-function@1.1.1(postcss@8.4.32): + resolution: {integrity: sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.32) + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /@csstools/postcss-font-format-keywords@1.0.1(postcss@8.4.32): + resolution: {integrity: sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /@csstools/postcss-hwb-function@1.0.2(postcss@8.4.32): + resolution: {integrity: sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /@csstools/postcss-ic-unit@1.0.1(postcss@8.4.32): + resolution: {integrity: sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.32) + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /@csstools/postcss-is-pseudo-class@2.0.7(postcss@8.4.32): + resolution: {integrity: sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.13) + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + dev: false + + /@csstools/postcss-nested-calc@1.0.0(postcss@8.4.32): + resolution: {integrity: sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /@csstools/postcss-normalize-display-values@1.0.1(postcss@8.4.32): + resolution: {integrity: sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /@csstools/postcss-oklab-function@1.1.1(postcss@8.4.32): + resolution: {integrity: sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.32) + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /@csstools/postcss-progressive-custom-properties@1.3.0(postcss@8.4.32): + resolution: {integrity: sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /@csstools/postcss-stepped-value-functions@1.0.1(postcss@8.4.32): + resolution: {integrity: sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /@csstools/postcss-text-decoration-shorthand@1.0.0(postcss@8.4.32): + resolution: {integrity: sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /@csstools/postcss-trigonometric-functions@1.0.2(postcss@8.4.32): + resolution: {integrity: sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==} + engines: {node: ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /@csstools/postcss-unset-value@1.0.2(postcss@8.4.32): + resolution: {integrity: sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + dev: false + + /@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.0.13): + resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss-selector-parser: ^6.0.10 + dependencies: + postcss-selector-parser: 6.0.13 + dev: false + /@discoveryjs/json-ext@0.5.7: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} @@ -2817,12 +3107,26 @@ packages: dev: false optional: true + /@emotion/is-prop-valid@1.2.1: + resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==} + dependencies: + '@emotion/memoize': 0.8.1 + dev: true + /@emotion/memoize@0.7.4: resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} requiresBuild: true dev: false optional: true + /@emotion/memoize@0.8.1: + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + dev: true + + /@emotion/unitless@0.8.0: + resolution: {integrity: sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==} + dev: true + /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0): resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} peerDependencies: @@ -3391,12 +3695,10 @@ packages: dependencies: eslint: 8.51.0 eslint-visitor-keys: 3.4.3 - dev: true /@eslint-community/regexpp@4.6.2: resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true /@eslint/eslintrc@2.1.2: resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} @@ -3413,12 +3715,10 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - dev: true /@eslint/js@8.51.0: resolution: {integrity: sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true /@fal-works/esbuild-plugin-global-externals@2.1.2: resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} @@ -3491,6 +3791,22 @@ packages: tslib: 2.6.1 dev: false + /@fuel-ts/abi-coder@0.67.0: + resolution: {integrity: sha512-RK24LruD8fuQcHACDWSHWVGl52RWne4RxlMDqQAkcQ4ja9qs/RiqxblyJTQi3e4ffRFwqNtd/aRQWBxA+w30xw==} + engines: {node: ^18.14.1} + dependencies: + '@fuel-ts/crypto': 0.67.0 + '@fuel-ts/errors': 0.67.0 + '@fuel-ts/math': 0.67.0 + '@fuel-ts/utils': 0.67.0 + '@fuel-ts/versions': 0.67.0 + ethers: 6.8.1 + type-fest: 3.13.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + /@fuel-ts/abi-coder@0.71.1: resolution: {integrity: sha512-TgdJjXNVWeA4XN3GEPuO4BIirygS6ZxUJUmUtToZXrDTlhZ0XFTQppyA/0sDW98UM8sTmQO9GrcPIlwqFUbPWg==} engines: {node: ^18.17.1} @@ -3506,6 +3822,26 @@ packages: - bufferutil - utf-8-validate + /@fuel-ts/abi-typegen@0.67.0: + resolution: {integrity: sha512-koNJrRtX3q5BYWQ0QhJMh8oGiqmK3Bsg6Rjq7b7ECLKy4SBahwyNqo+Q9psnTXMbIFkzvaR/Ly/8jcDISwetDg==} + engines: {node: ^18.14.1} + hasBin: true + dependencies: + '@fuel-ts/errors': 0.67.0 + '@fuel-ts/utils': 0.67.0 + '@fuel-ts/versions': 0.67.0 + commander: 9.5.0 + ethers: 6.8.1 + glob: 10.3.10 + handlebars: 4.7.7 + mkdirp: 1.0.4 + ramda: 0.29.0 + rimraf: 3.0.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + /@fuel-ts/abi-typegen@0.71.1: resolution: {integrity: sha512-qgbxHwMKVx5c33tgGRnX+RcgNsVFV220UraZIpdn/fX6jg0uSC3ZTopY5zbtwcAnzAbNBETqH4nRdYpc2BdfTg==} engines: {node: ^18.17.1} @@ -3525,6 +3861,21 @@ packages: - bufferutil - utf-8-validate + /@fuel-ts/address@0.67.0: + resolution: {integrity: sha512-RdFY8DknACkDxiyYVfV+4lchHG6jzxSjZriz10W98NBk1LcIr5kO8l7cfxe8x7U5DqXFQTcqsU/oi1aEiYjo0g==} + engines: {node: ^18.14.1} + dependencies: + '@fuel-ts/crypto': 0.67.0 + '@fuel-ts/errors': 0.67.0 + '@fuel-ts/interfaces': 0.67.0 + '@fuel-ts/versions': 0.67.0 + bech32: 2.0.0 + ethers: 6.8.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + /@fuel-ts/address@0.71.1: resolution: {integrity: sha512-hsFnZDN7/hhSvO+RvuZut51NTGeWTWNDeYFrPXwYxDa/ElrIJXfiw5X+KbpOZ0OldHlvQHiMUVCyie3cDfw78Q==} engines: {node: ^18.17.1} @@ -3539,13 +3890,36 @@ packages: - bufferutil - utf-8-validate - /@fuel-ts/contract@0.71.1: - resolution: {integrity: sha512-Ew3E5e9oGUiP+Nn1s7egkTbof75IDVbYBd5M/7MnoaKz7K/8QKfl4IfN80KECUug1wtvddsro33Pg0phpGEPQQ==} - engines: {node: ^18.17.1} - dependencies: - '@fuel-ts/abi-coder': 0.71.1 - '@fuel-ts/address': 0.71.1 - '@fuel-ts/crypto': 0.71.1 + /@fuel-ts/contract@0.67.0: + resolution: {integrity: sha512-+2MjWjtpQi6FRxM/PeRkTMHpNwvEvv367329IniYlZjhrVRhRu3jIUR8uqRIeeH6Vx9DKDCEw4uHQDiHF9cWgQ==} + engines: {node: ^18.14.1} + dependencies: + '@fuel-ts/abi-coder': 0.67.0 + '@fuel-ts/address': 0.67.0 + '@fuel-ts/crypto': 0.67.0 + '@fuel-ts/errors': 0.67.0 + '@fuel-ts/merkle': 0.67.0 + '@fuel-ts/program': 0.67.0 + '@fuel-ts/providers': 0.67.0 + '@fuel-ts/transactions': 0.67.0 + '@fuel-ts/utils': 0.67.0 + '@fuel-ts/versions': 0.67.0 + '@fuel-ts/wallet': 0.67.0 + ethers: 6.8.1 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + + /@fuel-ts/contract@0.71.1: + resolution: {integrity: sha512-Ew3E5e9oGUiP+Nn1s7egkTbof75IDVbYBd5M/7MnoaKz7K/8QKfl4IfN80KECUug1wtvddsro33Pg0phpGEPQQ==} + engines: {node: ^18.17.1} + dependencies: + '@fuel-ts/abi-coder': 0.71.1 + '@fuel-ts/address': 0.71.1 + '@fuel-ts/crypto': 0.71.1 '@fuel-ts/errors': 0.71.1 '@fuel-ts/merkle': 0.71.1 '@fuel-ts/program': 0.71.1 @@ -3561,6 +3935,18 @@ packages: - supports-color - utf-8-validate + /@fuel-ts/crypto@0.67.0: + resolution: {integrity: sha512-EDRf/kPk2fvDaQbslwRR1S1Vjq4JfUyh+QV96Q5yVASW+ZpT1l42lJeH4VIDi64c4cc/H5HMkFSFYPxASMgkow==} + engines: {node: ^18.14.1} + dependencies: + '@fuel-ts/errors': 0.67.0 + ethereum-cryptography: 2.1.2 + ethers: 6.8.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + /@fuel-ts/crypto@0.71.1: resolution: {integrity: sha512-1/EwSBvB9b+NotVjsxD6iLx0nTrG23Omfl2e7UQMN3bA+qSAbvY3pB/Ido4MLmCvvRC1rTZiCXU9UR1J8oWzww==} engines: {node: ^18.17.1} @@ -3572,12 +3958,29 @@ packages: - bufferutil - utf-8-validate + /@fuel-ts/errors@0.67.0: + resolution: {integrity: sha512-p56zsTOHebh8QfYINN4r8lnsrxMn5HlQqKnOQiG4f1HnNOKVGEU9tgesXJZPk31wE4AusPbpSI/g97V2FJwC/A==} + engines: {node: ^18.14.1} + dependencies: + '@fuel-ts/versions': 0.67.0 + dev: false + /@fuel-ts/errors@0.71.1: resolution: {integrity: sha512-DYo30/iICuFeOqxN+qYOkvrTOPFxbFV3DPanfUsUwPKTNlwv8kjv97JaFYQjAJG0QZ7AAGlyGNqp5RDajpWg6Q==} engines: {node: ^18.17.1} dependencies: '@fuel-ts/versions': 0.71.1 + /@fuel-ts/forc@0.67.0: + resolution: {integrity: sha512-gMvzPXHAcXuO27fTjVxWBNfpsCSgVxQqPnXptC5IzEORpS9/uNLC4FEcvzksL8tJzuIO+bb5+9jMUfBWQcqSRQ==} + hasBin: true + requiresBuild: true + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + /@fuel-ts/forc@0.71.1: resolution: {integrity: sha512-l2XuzZ0JuvgGy7eazY7BEGCr9hk9QxJxnIkl4Z0s4+M+3sORFcOsEb6QEtK8CB6aJ0cghCMWJ+s4MsnJz4BPlA==} hasBin: true @@ -3588,6 +3991,16 @@ packages: transitivePeerDependencies: - encoding + /@fuel-ts/fuel-core@0.67.0: + resolution: {integrity: sha512-O5EAh1dd1enuq0WGbdvfI5V3TTAQ9sUecxGmbhRCus3buh3mrmQ83bDVR5v3d85QRFm9Ucw0SHKzERz9fMGiuA==} + hasBin: true + requiresBuild: true + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + /@fuel-ts/fuel-core@0.71.1: resolution: {integrity: sha512-2vcQvbpvpZB19e4I1TU++gw/GmzlcG+2ziPW9H7pMkOVtOOMVvFLh7jlu1CvpUGQLndN6koDwbnmazIgBtXmAA==} hasBin: true @@ -3598,6 +4011,24 @@ packages: transitivePeerDependencies: - encoding + /@fuel-ts/hasher@0.67.0: + resolution: {integrity: sha512-3I08ujP3MC7yIt7zepbxfKjfjX0skzYZAIGA1YOJj/ppSLrjU3DKj4ZwWDFnoAl2lXCOTBgXOcu94bbMMY8nUA==} + engines: {node: ^18.14.1} + dependencies: + '@fuel-ts/address': 0.67.0 + '@fuel-ts/crypto': 0.67.0 + '@fuel-ts/math': 0.67.0 + '@fuel-ts/providers': 0.67.0 + '@fuel-ts/transactions': 0.67.0 + '@fuel-ts/utils': 0.67.0 + ethers: 6.8.1 + ramda: 0.29.0 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + /@fuel-ts/hasher@0.71.1: resolution: {integrity: sha512-YtYJ9kfrSOMoR15DVQeE0YQop5YKNbeNs7XBnPZO3/VjqC//mRJSTs3V5eSCdYwMlAMrmF2C0QEaNEufSP3XcQ==} engines: {node: ^18.17.1} @@ -3612,6 +4043,21 @@ packages: - bufferutil - utf-8-validate + /@fuel-ts/hdwallet@0.67.0: + resolution: {integrity: sha512-938HeUB59/iRmxEe6eivUjrgjCF9CwTiGFpcBORY4GI/al1hmHRnHirYNbQMD7Y65d+GQp8XCHQrzuAApJIKBQ==} + engines: {node: ^18.14.1} + dependencies: + '@fuel-ts/errors': 0.67.0 + '@fuel-ts/math': 0.67.0 + '@fuel-ts/mnemonic': 0.67.0 + '@fuel-ts/signer': 0.67.0 + ethers: 6.8.1 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + /@fuel-ts/hdwallet@0.71.1: resolution: {integrity: sha512-FZVuxOuxMopu+YXwpvmt6YkoTsZXntr07TqTFxUnCvUv05csp24Prq66hiAzoLOsCtG9WLM2vZ6+0DQR2a6FiQ==} engines: {node: ^18.17.1} @@ -3625,10 +4071,24 @@ packages: - bufferutil - utf-8-validate + /@fuel-ts/interfaces@0.67.0: + resolution: {integrity: sha512-6DMtHewADzsFHMAC+WV2wWZHiqmBstj1NzHxSMXiaZz/e4LbbRrzc9PsYUAjRwHZKuDpsCQO7NLHPzlCiZWXdQ==} + engines: {node: ^18.14.1} + dev: false + /@fuel-ts/interfaces@0.71.1: resolution: {integrity: sha512-kYKoV8W2eYPEO+KSFcMMYF1wj3uHCxz/8D24YnnLhMNauwfQDa3r0r3oOK6K/4uHeR4/GLomErTWAs1/xy92TA==} engines: {node: ^18.17.1} + /@fuel-ts/math@0.67.0: + resolution: {integrity: sha512-b6vbHs1886e5EQ9F+Vzu5rqG2SsA22avKqs7lV7+UMTdqigucm7kkM62y9xinNsIE36UGU1npebEQmtqtO7DzQ==} + engines: {node: ^18.14.1} + dependencies: + '@fuel-ts/errors': 0.67.0 + '@types/bn.js': 5.1.1 + bn.js: 5.2.1 + dev: false + /@fuel-ts/math@0.71.1: resolution: {integrity: sha512-DiQFY3ec8OYAoDRmcVjA/5QaIo5MyXziLqbg9w0KHA0bmSTe64TddPDQi6jCffPZYdlPbj6b3yXD7KlRclSNjQ==} engines: {node: ^18.17.1} @@ -3637,6 +4097,17 @@ packages: '@types/bn.js': 5.1.1 bn.js: 5.2.1 + /@fuel-ts/merkle@0.67.0: + resolution: {integrity: sha512-LDyOAs71jF2rMDItEaxlODPrLdz+YVTToIyqjLbORJSe9wvXHcxg+9t/LK1+M67FWHbbvIZ8jVdhBYCr1h9oCQ==} + engines: {node: ^18.14.1} + dependencies: + '@fuel-ts/math': 0.67.0 + ethers: 6.8.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + /@fuel-ts/merkle@0.71.1: resolution: {integrity: sha512-Oib8CYu7QAjVcuvQTX399ksxDL3I6LB2lOFqHa7EU6vVvRklmoJwzl6Rc115fFFdeqwQD3XCXPBXjz55lq44LA==} engines: {node: ^18.17.1} @@ -3647,6 +4118,19 @@ packages: - bufferutil - utf-8-validate + /@fuel-ts/mnemonic@0.67.0: + resolution: {integrity: sha512-/eec0CHP9S4KwFHySMJuY1JfudcGbRkSZ3mEiBK+aAyFeVjEIBmE33aOJ4VZ0lXVqD8kRpDJDWEfPZ/1rJUNKQ==} + engines: {node: ^18.14.1} + dependencies: + '@fuel-ts/crypto': 0.67.0 + '@fuel-ts/errors': 0.67.0 + '@fuel-ts/wordlists': 0.67.0 + ethers: 6.8.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + /@fuel-ts/mnemonic@0.71.1: resolution: {integrity: sha512-beUvSLcsHHlnyw0Qt/yuMga4FGMqQQsPxPaGblx+p9ukQYldlHQwsqn0utPdwBfHXZrxXhhoUSVjSjFiXnGyYQ==} engines: {node: ^18.17.1} @@ -3659,6 +4143,29 @@ packages: - bufferutil - utf-8-validate + /@fuel-ts/predicate@0.67.0: + resolution: {integrity: sha512-VHn2agmEGcwmoXzNMMFZ/+5nm5AHBDHmmzKxSXfS+x57inIzZnZHdPVQl2jdP2zkAoc8vNx+QBtkgZC8jMeXMg==} + engines: {node: ^18.14.1} + dependencies: + '@fuel-ts/abi-coder': 0.67.0 + '@fuel-ts/address': 0.67.0 + '@fuel-ts/errors': 0.67.0 + '@fuel-ts/hasher': 0.67.0 + '@fuel-ts/interfaces': 0.67.0 + '@fuel-ts/merkle': 0.67.0 + '@fuel-ts/providers': 0.67.0 + '@fuel-ts/transactions': 0.67.0 + '@fuel-ts/utils': 0.67.0 + '@fuel-ts/versions': 0.67.0 + '@fuel-ts/wallet': 0.67.0 + ethers: 6.8.1 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + /@fuel-ts/predicate@0.71.1: resolution: {integrity: sha512-zD7kELGunLpGx37hBecp+Um5dXuYS+VEUzj9tX0WF8Cbyb3n90ea4yeBLi3G4qFZYAyjgjIOE1NQdl32hVgUJw==} engines: {node: ^18.17.1} @@ -3681,6 +4188,29 @@ packages: - supports-color - utf-8-validate + /@fuel-ts/program@0.67.0: + resolution: {integrity: sha512-AKI7GiKTbp6ed/MxxsdrxelqRWY8FGRaJtKaA/JXY29WGJtMy81K+j8R5xbNQRgZrdwyl8DkyvxevPfL1ubG8A==} + engines: {node: ^18.14.1} + dependencies: + '@fuel-ts/abi-coder': 0.67.0 + '@fuel-ts/address': 0.67.0 + '@fuel-ts/errors': 0.67.0 + '@fuel-ts/interfaces': 0.67.0 + '@fuel-ts/math': 0.67.0 + '@fuel-ts/providers': 0.67.0 + '@fuel-ts/transactions': 0.67.0 + '@fuel-ts/utils': 0.67.0 + '@fuel-ts/versions': 0.67.0 + '@fuel-ts/wallet': 0.67.0 + '@fuels/vm-asm': 0.36.1 + ethers: 6.8.1 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + /@fuel-ts/program@0.71.1: resolution: {integrity: sha512-b4FiJG/pl+n4fjhhj7yTG+CXTEtJ7t7Momjol7CQW5n69TefUFwaEVvorI2C3Nm80uW4mNTiKhMIE48A7ECcmQ==} engines: {node: ^18.17.1} @@ -3704,6 +4234,30 @@ packages: - supports-color - utf-8-validate + /@fuel-ts/providers@0.67.0: + resolution: {integrity: sha512-rUzs5ToIlLJ8D/S5uFoV/rax8RJKB6t+8bi1OVhn4ANbqn8SLdG92caEIoUnh/REKYPxXWqohIdW4dnduluzSA==} + engines: {node: ^18.14.1} + dependencies: + '@fuel-ts/abi-coder': 0.67.0 + '@fuel-ts/address': 0.67.0 + '@fuel-ts/crypto': 0.67.0 + '@fuel-ts/errors': 0.67.0 + '@fuel-ts/interfaces': 0.67.0 + '@fuel-ts/math': 0.67.0 + '@fuel-ts/transactions': 0.67.0 + '@fuel-ts/versions': 0.67.0 + ethers: 6.8.1 + graphql: 16.8.1 + graphql-request: 5.2.0(graphql@16.8.1) + graphql-tag: 2.12.6(graphql@16.8.1) + ramda: 0.29.0 + tai64: 1.0.0 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + /@fuel-ts/providers@0.71.1: resolution: {integrity: sha512-1uaGfDA+waXInS+z73jkSBPnL63qL4G15d4LJzxK1F6kuquyTXCUmX3rxvOMMKJj+7NXrt3TzvAaOX59fQNqdQ==} engines: {node: ^18.17.1} @@ -3728,6 +4282,29 @@ packages: - encoding - utf-8-validate + /@fuel-ts/script@0.67.0: + resolution: {integrity: sha512-dy+uQHVZyYvnUOoxjBycOOf3rM7gtaQtEfBp9nAdJio5rpFBfe0H1oz364mVI8zpCi641QgdIt7ohxsOaKlA1g==} + engines: {node: ^18.14.1} + dependencies: + '@fuel-ts/abi-coder': 0.67.0 + '@fuel-ts/abi-typegen': 0.67.0 + '@fuel-ts/address': 0.67.0 + '@fuel-ts/errors': 0.67.0 + '@fuel-ts/interfaces': 0.67.0 + '@fuel-ts/math': 0.67.0 + '@fuel-ts/program': 0.67.0 + '@fuel-ts/providers': 0.67.0 + '@fuel-ts/transactions': 0.67.0 + '@fuel-ts/utils': 0.67.0 + '@fuel-ts/wallet': 0.67.0 + ethers: 6.8.1 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + /@fuel-ts/script@0.71.1: resolution: {integrity: sha512-+kSML2a0dKKVpQPDva1WXEqOThIn2xJACa/NhcTPdTbqocts3cKq0kAGLXBfhryXoFYK4KkjdWu76l4nn38QRw==} engines: {node: ^18.17.1} @@ -3750,6 +4327,22 @@ packages: - supports-color - utf-8-validate + /@fuel-ts/signer@0.67.0: + resolution: {integrity: sha512-KiI1kTyWkj/moV8Ij0+XnqmgGmZS/NELvxBzeyqO0JcIdLZopOYXi3+eylLFdCB9Kr4MRATA1YWhMbjNaUSxjQ==} + engines: {node: ^18.14.1} + dependencies: + '@fuel-ts/address': 0.67.0 + '@fuel-ts/crypto': 0.67.0 + '@fuel-ts/hasher': 0.67.0 + '@fuel-ts/math': 0.67.0 + elliptic: 6.5.4 + ethers: 6.8.1 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + /@fuel-ts/signer@0.71.1: resolution: {integrity: sha512-t1eTu7XJ1NKd1DqznG74ulXRAZm6blp4UuVfxhWgqbCxPGTSUdF0PzB25uXnxXi+OHuTzy6ELFKewXHHS2X3iw==} engines: {node: ^18.17.1} @@ -3764,6 +4357,21 @@ packages: - bufferutil - utf-8-validate + /@fuel-ts/transactions@0.67.0: + resolution: {integrity: sha512-C05DLkLfVPsA2g/e7uIks8Tqva9hwDD6IU0BiXqcUqknNO/O48l+XJ9+P2uTofTyZAZKItqtCg4L3b6G/d/O0Q==} + engines: {node: ^18.14.1} + dependencies: + '@fuel-ts/abi-coder': 0.67.0 + '@fuel-ts/address': 0.67.0 + '@fuel-ts/errors': 0.67.0 + '@fuel-ts/math': 0.67.0 + '@fuel-ts/utils': 0.67.0 + ethers: 6.8.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + /@fuel-ts/transactions@0.71.1: resolution: {integrity: sha512-Va7PQADkWVaoPyLFcszGgRa6TToQM9byXeVLlKx3iqgIL27jB2Zo4jwJnMkJJlQoxFDud+lFNLctwW68Xgnf4Q==} engines: {node: ^18.17.1} @@ -3778,6 +4386,18 @@ packages: - bufferutil - utf-8-validate + /@fuel-ts/utils@0.67.0: + resolution: {integrity: sha512-AE4vjyQa+pLANPUvXVRuwPNg8coFakdG5pFwNzpsmPVjYkTIpal82DEPjYRN7QR3nG7ixotx5YHQCEyYsTwClg==} + engines: {node: ^18.14.1} + dependencies: + ethers: 6.8.1 + ramda: 0.29.0 + rimraf: 3.0.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + /@fuel-ts/utils@0.71.1: resolution: {integrity: sha512-7ety+qLKFseDw5mxguQQMk2p9lTg6OueXKP3AXFs/Y/YsmEdEEPQ8H1Resu4f5NWYyJiRPVuKfe4PxRnLg/bxQ==} engines: {node: ^18.17.1} @@ -3789,6 +4409,16 @@ packages: - bufferutil - utf-8-validate + /@fuel-ts/versions@0.67.0: + resolution: {integrity: sha512-CR1iroYL9Rj6q+IbC8RQm78koync/uGR6JL1wNK+ubOlF5n2wZtAdpNe3vBiDakfTPRZCI8PukDIO90xUnxOVg==} + engines: {node: ^18.14.1} + hasBin: true + dependencies: + chalk: 4.1.2 + cli-table: 0.3.11 + semver: 7.5.4 + dev: false + /@fuel-ts/versions@0.71.1: resolution: {integrity: sha512-13Bqqkmrq0mNLBixuw0rzxdPzGFTWgDdK1CZMzWGANzZJBbk10sO+yLRtmmdM481DDObMOfsnd1HXw+trDxIHg==} engines: {node: ^18.17.1} @@ -3798,6 +4428,25 @@ packages: cli-table: 0.3.11 semver: 7.5.4 + /@fuel-ts/wallet-manager@0.67.0: + resolution: {integrity: sha512-4/zpWvP4ixvw7jAGvAg6tMdWedo2Hq4q8ovOfokFqC1afuWdb1ZuE3V58HWCd6clI2aQwHufxcYnjlRc8TryjQ==} + engines: {node: ^18.14.1} + dependencies: + '@fuel-ts/address': 0.67.0 + '@fuel-ts/crypto': 0.67.0 + '@fuel-ts/errors': 0.67.0 + '@fuel-ts/interfaces': 0.67.0 + '@fuel-ts/mnemonic': 0.67.0 + '@fuel-ts/providers': 0.67.0 + '@fuel-ts/wallet': 0.67.0 + events: 3.3.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + /@fuel-ts/wallet-manager@0.71.1: resolution: {integrity: sha512-O6XtYuBtThyb5AzkWzd7mqLWRB91yNedzu6vhq7NGz9a8KNM8uzIPBEFmCuM1gvHNI4tSVhyI4j+Fsv+gaBwqg==} engines: {node: ^18.17.1} @@ -3816,6 +4465,36 @@ packages: - supports-color - utf-8-validate + /@fuel-ts/wallet@0.67.0: + resolution: {integrity: sha512-Xww/NpUbHw+2XiaWQFsA0men0NmEZEcBu+QkpSf4y7W7Xv9dDOfpmsivEg+UnKGOc7fG/dBX5kv/aAOUUwpdXw==} + engines: {node: ^18.14.1} + dependencies: + '@fuel-ts/abi-coder': 0.67.0 + '@fuel-ts/address': 0.67.0 + '@fuel-ts/crypto': 0.67.0 + '@fuel-ts/errors': 0.67.0 + '@fuel-ts/fuel-core': 0.67.0 + '@fuel-ts/hasher': 0.67.0 + '@fuel-ts/hdwallet': 0.67.0 + '@fuel-ts/interfaces': 0.67.0 + '@fuel-ts/math': 0.67.0 + '@fuel-ts/mnemonic': 0.67.0 + '@fuel-ts/providers': 0.67.0 + '@fuel-ts/signer': 0.67.0 + '@fuel-ts/transactions': 0.67.0 + '@fuel-ts/utils': 0.67.0 + '@fuels/vm-asm': 0.36.1 + ethers: 6.8.1 + portfinder: 1.0.32 + tree-kill: 1.2.2 + uuid: 9.0.1 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + /@fuel-ts/wallet@0.71.1: resolution: {integrity: sha512-T8mVbJnZlnM/mbIOVQkSyCftzs9gl45ncdm0H7u6eYmM1QfE091ZCgnmtBlB7b0k/PoqDknUBa0S2xP/MCjmjA==} engines: {node: ^18.17.1} @@ -3845,6 +4524,11 @@ packages: - supports-color - utf-8-validate + /@fuel-ts/wordlists@0.67.0: + resolution: {integrity: sha512-exmtp+jpeJLNvX4R6HOqzPwEF8fKhsMzkegZ8Eeo9PXJu2XnTUQ0fxX2BtCd366vXluXNC7JUjbKe9ZegiuchA==} + engines: {node: ^18.14.1} + dev: false + /@fuel-ts/wordlists@0.71.1: resolution: {integrity: sha512-CePHfyzaz2BeYexscSoQuJ8O5VQEctWBvGCp65y3WpOTvR+4VMvM9X35DwpXh30hhQUyS/1mEiALljF3YNB71g==} engines: {node: ^18.17.1} @@ -4043,6 +4727,10 @@ packages: typescript: 5.2.2 dev: true + /@fuels/vm-asm@0.36.1: + resolution: {integrity: sha512-MXtNDk0WXONIrDJOlk07+X7GegpCz2hfbAgSIWycOD0th2z1GndvMqBryiw/pTVDHLnHe+5TGIODLsprI4RiEw==} + dev: false + /@fuels/vm-asm@0.42.1: resolution: {integrity: sha512-5e0IDHen26hrKc93ejYNDhQFbqi+EQ7xPpFJcUnSrz0+6zPdPhA2dtwh5UqN0fYDM5AcEFd0wpq+r7Pd2XS5AQ==} @@ -4752,16 +5440,13 @@ packages: minimatch: 3.1.2 transitivePeerDependencies: - supports-color - dev: true /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - dev: true /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - dev: true /@internationalized/date@3.5.0: resolution: {integrity: sha512-nw0Q+oRkizBWMioseI8+2TeUPEyopJVz5YxoYVzR0W1v+2YytiYah7s/ot35F149q/xAg4F1gT/6eTd+tsUpFQ==} @@ -4813,6 +5498,30 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} + /@jest/console@27.5.1: + resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 20.8.4 + chalk: 4.1.2 + jest-message-util: 27.5.1 + jest-util: 27.5.1 + slash: 3.0.0 + dev: false + + /@jest/console@28.1.3: + resolution: {integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + '@types/node': 20.8.4 + chalk: 4.1.2 + jest-message-util: 28.1.3 + jest-util: 28.1.3 + slash: 3.0.0 + dev: false + /@jest/console@29.7.0: resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4824,6 +5533,51 @@ packages: jest-util: 29.7.0 slash: 3.0.0 + /@jest/core@27.5.1(ts-node@10.9.1): + resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 27.5.1 + '@jest/reporters': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.8.4 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.8.1 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 27.5.1 + jest-config: 27.5.1(ts-node@10.9.1) + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-resolve-dependencies: 27.5.1 + jest-runner: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + jest-watcher: 27.5.1 + micromatch: 4.0.5 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: false + /@jest/core@29.7.0(ts-node@10.9.1): resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4866,6 +5620,16 @@ packages: - supports-color - ts-node + /@jest/environment@27.5.1: + resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.8.4 + jest-mock: 27.5.1 + dev: false + /@jest/environment@29.7.0: resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4896,6 +5660,18 @@ packages: transitivePeerDependencies: - supports-color + /@jest/fake-timers@27.5.1: + resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@sinonjs/fake-timers': 8.1.0 + '@types/node': 20.8.4 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-util: 27.5.1 + dev: false + /@jest/fake-timers@29.7.0: resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4907,6 +5683,15 @@ packages: jest-mock: 29.7.0 jest-util: 29.7.0 + /@jest/globals@27.5.1: + resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/types': 27.5.1 + expect: 27.5.1 + dev: false + /@jest/globals@29.7.0: resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4918,9 +5703,9 @@ packages: transitivePeerDependencies: - supports-color - /@jest/reporters@29.7.0: - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /@jest/reporters@27.5.1: + resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -4928,11 +5713,10 @@ packages: optional: true dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.18 + '@jest/console': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 '@types/node': 20.8.4 chalk: 4.1.2 collect-v8-coverage: 1.0.2 @@ -4940,23 +5724,62 @@ packages: glob: 7.2.3 graceful-fs: 4.2.11 istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 6.0.1 + istanbul-lib-instrument: 5.2.1 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 istanbul-reports: 3.1.6 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - jest-worker: 29.7.0 + jest-haste-map: 27.5.1 + jest-resolve: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 slash: 3.0.0 + source-map: 0.6.1 string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.1.0 + terminal-link: 2.1.1 + v8-to-istanbul: 8.1.1 transitivePeerDependencies: - supports-color + dev: false - /@jest/schemas@28.1.3: - resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + /@jest/reporters@29.7.0: + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.18 + '@types/node': 20.8.4 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 6.0.1 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.6 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.1.0 + transitivePeerDependencies: + - supports-color + + /@jest/schemas@28.1.3: + resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@sinclair/typebox': 0.24.51 dev: false @@ -4967,6 +5790,15 @@ packages: dependencies: '@sinclair/typebox': 0.27.8 + /@jest/source-map@27.5.1: + resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + callsites: 3.1.0 + graceful-fs: 4.2.11 + source-map: 0.6.1 + dev: false + /@jest/source-map@29.6.3: resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4975,6 +5807,26 @@ packages: callsites: 3.1.0 graceful-fs: 4.2.11 + /@jest/test-result@27.5.1: + resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.5.1 + '@jest/types': 27.5.1 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.2 + dev: false + + /@jest/test-result@28.1.3: + resolution: {integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/console': 28.1.3 + '@jest/types': 28.1.3 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.2 + dev: false + /@jest/test-result@29.7.0: resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4984,6 +5836,18 @@ packages: '@types/istanbul-lib-coverage': 2.0.4 collect-v8-coverage: 1.0.2 + /@jest/test-sequencer@27.5.1: + resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.5.1 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-runtime: 27.5.1 + transitivePeerDependencies: + - supports-color + dev: false + /@jest/test-sequencer@29.7.0: resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4993,6 +5857,29 @@ packages: jest-haste-map: 29.7.0 slash: 3.0.0 + /@jest/transform@27.5.1: + resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.23.2 + '@jest/types': 27.5.1 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 1.9.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-regex-util: 27.5.1 + jest-util: 27.5.1 + micromatch: 4.0.5 + pirates: 4.0.6 + slash: 3.0.0 + source-map: 0.6.1 + write-file-atomic: 3.0.3 + transitivePeerDependencies: + - supports-color + dev: false + /@jest/transform@29.6.2: resolution: {integrity: sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5048,6 +5935,18 @@ packages: '@types/yargs': 16.0.5 chalk: 4.1.2 + /@jest/types@28.1.3: + resolution: {integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/schemas': 28.1.3 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 20.8.4 + '@types/yargs': 17.0.24 + chalk: 4.1.2 + dev: false + /@jest/types@29.6.3: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5101,7 +6000,6 @@ packages: dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 - dev: true /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} @@ -5124,6 +6022,10 @@ packages: /@juggle/resize-observer@3.4.0: resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + /@leichtgewicht/ip-codec@2.0.4: + resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} + dev: false + /@manypkg/find-root@1.1.0: resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} dependencies: @@ -5318,6 +6220,12 @@ packages: dev: false optional: true + /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1: + resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + dependencies: + eslint-scope: 5.1.1 + dev: false + /@noble/curves@1.1.0: resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} dependencies: @@ -5645,6 +6553,46 @@ packages: playwright: 1.39.0 dev: true + /@pmmmwh/react-refresh-webpack-plugin@0.5.10(react-refresh@0.11.0)(webpack-dev-server@4.15.1)(webpack@5.88.2): + resolution: {integrity: sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==} + engines: {node: '>= 10.13'} + peerDependencies: + '@types/webpack': 4.x || 5.x + react-refresh: '>=0.10.0 <1.0.0' + sockjs-client: ^1.4.0 + type-fest: '>=0.17.0 <4.0.0' + webpack: '>=4.43.0 <6.0.0' + webpack-dev-server: 3.x || 4.x + webpack-hot-middleware: 2.x + webpack-plugin-serve: 0.x || 1.x + peerDependenciesMeta: + '@types/webpack': + optional: true + sockjs-client: + optional: true + type-fest: + optional: true + webpack-dev-server: + optional: true + webpack-hot-middleware: + optional: true + webpack-plugin-serve: + optional: true + dependencies: + ansi-html-community: 0.0.8 + common-path-prefix: 3.0.0 + core-js-pure: 3.32.0 + error-stack-parser: 2.1.4 + find-up: 5.0.0 + html-entities: 2.4.0 + loader-utils: 2.0.4 + react-refresh: 0.11.0 + schema-utils: 3.3.0 + source-map: 0.7.4 + webpack: 5.88.2(esbuild@0.19.5) + webpack-dev-server: 4.15.1(webpack@5.88.2) + dev: false + /@pmmmwh/react-refresh-webpack-plugin@0.5.10(react-refresh@0.11.0)(webpack@5.88.2): resolution: {integrity: sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==} engines: {node: '>= 10.13'} @@ -8395,6 +9343,60 @@ packages: resolution: {integrity: sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA==} dev: true + /@rollup/plugin-babel@5.3.1(@babel/core@7.23.2)(rollup@2.79.1): + resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} + engines: {node: '>= 10.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-module-imports': 7.22.15 + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + rollup: 2.79.1 + dev: false + + /@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1): + resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + '@types/resolve': 1.17.1 + builtin-modules: 3.3.0 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.4 + rollup: 2.79.1 + dev: false + + /@rollup/plugin-replace@2.4.2(rollup@2.79.1): + resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + magic-string: 0.25.9 + rollup: 2.79.1 + dev: false + + /@rollup/pluginutils@3.1.0(rollup@2.79.1): + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 2.79.1 + dev: false + /@rollup/pluginutils@4.2.1: resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} engines: {node: '>= 8.0.0'} @@ -8419,7 +9421,6 @@ packages: /@rushstack/eslint-patch@1.5.1: resolution: {integrity: sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==} - dev: true /@scure/base@1.1.3: resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==} @@ -8513,6 +9514,12 @@ packages: /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + /@sinonjs/commons@1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + dependencies: + type-detect: 4.0.8 + dev: false + /@sinonjs/commons@3.0.0: resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} dependencies: @@ -8523,6 +9530,12 @@ packages: dependencies: '@sinonjs/commons': 3.0.0 + /@sinonjs/fake-timers@8.1.0: + resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: false + /@storybook/addon-a11y@7.4.6(@types/react-dom@18.2.13)(@types/react@18.2.28)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-RE8sXk9KEqgmjsFmG31eObgPMTOvvWnoNZIaZEHs88X30tNHtFwjc0jzvCR/xriKsBtQdYQTUSsB7pSjaJHNzQ==} peerDependencies: @@ -9032,10 +10045,10 @@ packages: '@storybook/node-logger': 7.4.6 '@types/ejs': 3.1.2 '@types/find-cache-dir': 3.2.1 - '@yarnpkg/esbuild-plugin-pnp': 3.0.0-rc.15(esbuild@0.18.17) + '@yarnpkg/esbuild-plugin-pnp': 3.0.0-rc.15(esbuild@0.18.20) browser-assert: 1.2.1 ejs: 3.1.9 - esbuild: 0.18.17 + esbuild: 0.18.20 esbuild-plugin-alias: 0.2.1 express: 4.18.2 find-cache-dir: 3.3.2 @@ -9838,6 +10851,20 @@ packages: '@types/express': 4.17.17 file-system-cache: 2.3.0 + /@surma/rollup-plugin-off-main-thread@2.2.3: + resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + dependencies: + ejs: 3.1.9 + json5: 2.2.3 + magic-string: 0.25.9 + string.prototype.matchall: 4.0.8 + dev: false + + /@svgr/babel-plugin-add-jsx-attribute@5.4.0: + resolution: {integrity: sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==} + engines: {node: '>=10'} + dev: false + /@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.23.2): resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} engines: {node: '>=14'} @@ -9847,6 +10874,11 @@ packages: '@babel/core': 7.23.2 dev: true + /@svgr/babel-plugin-remove-jsx-attribute@5.4.0: + resolution: {integrity: sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==} + engines: {node: '>=10'} + dev: false + /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.23.2): resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} engines: {node: '>=14'} @@ -9856,6 +10888,11 @@ packages: '@babel/core': 7.23.2 dev: true + /@svgr/babel-plugin-remove-jsx-empty-expression@5.0.1: + resolution: {integrity: sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==} + engines: {node: '>=10'} + dev: false + /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.23.2): resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} engines: {node: '>=14'} @@ -9865,6 +10902,11 @@ packages: '@babel/core': 7.23.2 dev: true + /@svgr/babel-plugin-replace-jsx-attribute-value@5.0.1: + resolution: {integrity: sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==} + engines: {node: '>=10'} + dev: false + /@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.23.2): resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} engines: {node: '>=14'} @@ -9874,6 +10916,11 @@ packages: '@babel/core': 7.23.2 dev: true + /@svgr/babel-plugin-svg-dynamic-title@5.4.0: + resolution: {integrity: sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==} + engines: {node: '>=10'} + dev: false + /@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.23.2): resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} engines: {node: '>=14'} @@ -9883,6 +10930,11 @@ packages: '@babel/core': 7.23.2 dev: true + /@svgr/babel-plugin-svg-em-dimensions@5.4.0: + resolution: {integrity: sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==} + engines: {node: '>=10'} + dev: false + /@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.23.2): resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} engines: {node: '>=14'} @@ -9892,6 +10944,11 @@ packages: '@babel/core': 7.23.2 dev: true + /@svgr/babel-plugin-transform-react-native-svg@5.4.0: + resolution: {integrity: sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==} + engines: {node: '>=10'} + dev: false + /@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.23.2): resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} engines: {node: '>=14'} @@ -9901,6 +10958,11 @@ packages: '@babel/core': 7.23.2 dev: true + /@svgr/babel-plugin-transform-svg-component@5.5.0: + resolution: {integrity: sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==} + engines: {node: '>=10'} + dev: false + /@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.23.2): resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} engines: {node: '>=12'} @@ -9910,6 +10972,20 @@ packages: '@babel/core': 7.23.2 dev: true + /@svgr/babel-preset@5.5.0: + resolution: {integrity: sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==} + engines: {node: '>=10'} + dependencies: + '@svgr/babel-plugin-add-jsx-attribute': 5.4.0 + '@svgr/babel-plugin-remove-jsx-attribute': 5.4.0 + '@svgr/babel-plugin-remove-jsx-empty-expression': 5.0.1 + '@svgr/babel-plugin-replace-jsx-attribute-value': 5.0.1 + '@svgr/babel-plugin-svg-dynamic-title': 5.4.0 + '@svgr/babel-plugin-svg-em-dimensions': 5.4.0 + '@svgr/babel-plugin-transform-react-native-svg': 5.4.0 + '@svgr/babel-plugin-transform-svg-component': 5.5.0 + dev: false + /@svgr/babel-preset@8.1.0(@babel/core@7.23.2): resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} engines: {node: '>=14'} @@ -9927,6 +11003,17 @@ packages: '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.23.2) dev: true + /@svgr/core@5.5.0: + resolution: {integrity: sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==} + engines: {node: '>=10'} + dependencies: + '@svgr/plugin-jsx': 5.5.0 + camelcase: 6.3.0 + cosmiconfig: 7.1.0 + transitivePeerDependencies: + - supports-color + dev: false + /@svgr/core@8.1.0: resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} engines: {node: '>=14'} @@ -9940,6 +11027,13 @@ packages: - supports-color dev: true + /@svgr/hast-util-to-babel-ast@5.5.0: + resolution: {integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==} + engines: {node: '>=10'} + dependencies: + '@babel/types': 7.23.0 + dev: false + /@svgr/hast-util-to-babel-ast@8.0.0: resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} engines: {node: '>=14'} @@ -9948,6 +11042,18 @@ packages: entities: 4.5.0 dev: true + /@svgr/plugin-jsx@5.5.0: + resolution: {integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.23.2 + '@svgr/babel-preset': 5.5.0 + '@svgr/hast-util-to-babel-ast': 5.5.0 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: false + /@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0): resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==} engines: {node: '>=14'} @@ -9963,6 +11069,15 @@ packages: - supports-color dev: true + /@svgr/plugin-svgo@5.5.0: + resolution: {integrity: sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==} + engines: {node: '>=10'} + dependencies: + cosmiconfig: 7.1.0 + deepmerge: 4.3.1 + svgo: 1.3.2 + dev: false + /@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0): resolution: {integrity: sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==} engines: {node: '>=14'} @@ -9975,6 +11090,22 @@ packages: svgo: 3.0.2 dev: true + /@svgr/webpack@5.5.0: + resolution: {integrity: sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.23.2 + '@babel/plugin-transform-react-constant-elements': 7.22.5(@babel/core@7.23.2) + '@babel/preset-env': 7.22.9(@babel/core@7.23.2) + '@babel/preset-react': 7.22.5(@babel/core@7.23.2) + '@svgr/core': 5.5.0 + '@svgr/plugin-jsx': 5.5.0 + '@svgr/plugin-svgo': 5.5.0 + loader-utils: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: false + /@svgr/webpack@8.1.0: resolution: {integrity: sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==} engines: {node: '>=14'} @@ -10250,6 +11381,11 @@ packages: dependencies: '@testing-library/dom': 9.3.1 + /@tootallnate/once@1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + dev: false + /@tootallnate/once@2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} @@ -10334,8 +11470,14 @@ packages: '@types/connect': 3.4.35 '@types/node': 20.8.4 - /@types/btoa-lite@1.0.2: - resolution: {integrity: sha512-ZYbcE2x7yrvNFJiU7xJGrpF/ihpkM7zKgw8bha3LNJSesvTtUNxbpzaT7WXBIryf6jovisrxTBvymxMeLLj1Mg==} + /@types/bonjour@3.5.13: + resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + dependencies: + '@types/node': 20.8.4 + dev: false + + /@types/btoa-lite@1.0.2: + resolution: {integrity: sha512-ZYbcE2x7yrvNFJiU7xJGrpF/ihpkM7zKgw8bha3LNJSesvTtUNxbpzaT7WXBIryf6jovisrxTBvymxMeLLj1Mg==} dev: false /@types/chrome@0.0.246: @@ -10344,6 +11486,13 @@ packages: '@types/filesystem': 0.0.32 '@types/har-format': 1.2.11 + /@types/connect-history-api-fallback@1.5.4: + resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + dependencies: + '@types/express-serve-static-core': 4.17.35 + '@types/node': 20.8.4 + dev: false + /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: @@ -10389,14 +11538,12 @@ packages: dependencies: '@types/eslint': 8.44.1 '@types/estree': 1.0.1 - dev: true /@types/eslint@8.44.1: resolution: {integrity: sha512-XpNDc4Z5Tb4x+SW1MriMVeIsMoONHCkWFMkR/aPJbzEsxqHy+4Glu/BqTdPrApfDeMaXbtNh6bseNgl5KaWrSg==} dependencies: '@types/estree': 1.0.1 '@types/json-schema': 7.0.12 - dev: true /@types/estree-jsx@1.0.0: resolution: {integrity: sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==} @@ -10404,6 +11551,10 @@ packages: '@types/estree': 1.0.1 dev: false + /@types/estree@0.0.39: + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + dev: false + /@types/estree@0.0.51: resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} dev: true @@ -10467,11 +11618,16 @@ packages: /@types/html-minifier-terser@6.1.0: resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} - dev: true /@types/http-errors@2.0.1: resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} + /@types/http-proxy@1.17.14: + resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} + dependencies: + '@types/node': 20.8.4 + dev: false + /@types/is-ci@3.0.0: resolution: {integrity: sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ==} dependencies: @@ -10520,7 +11676,6 @@ packages: /@types/json-schema@7.0.12: resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - dev: true /@types/json-stable-stringify@1.0.34: resolution: {integrity: sha512-s2cfwagOQAS8o06TcwKfr9Wx11dNGbH2E9vJz1cqV+a/LOyhWNLUNd6JSRYNzvB4d29UuJX2M0Dj9vE1T8fRXw==} @@ -10528,7 +11683,6 @@ packages: /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true /@types/jsonwebtoken@9.0.5: resolution: {integrity: sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==} @@ -10591,6 +11745,12 @@ packages: form-data: 3.0.1 dev: true + /@types/node-forge@1.3.11: + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + dependencies: + '@types/node': 20.8.4 + dev: false + /@types/node@10.12.18: resolution: {integrity: sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==} @@ -10600,7 +11760,6 @@ packages: /@types/node@16.18.68: resolution: {integrity: sha512-sG3hPIQwJLoewrN7cr0dwEy+yF5nD4D/4FxtQpFciRD/xwUzgD+G05uxZHv5mhfXo4F9Jkp13jjn0CC2q325sg==} - dev: true /@types/node@18.15.13: resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} @@ -10616,11 +11775,9 @@ packages: /@types/parse-json@4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} - dev: true /@types/prettier@2.7.3: resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} - dev: true /@types/pretty-hrtime@1.0.1: resolution: {integrity: sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==} @@ -10633,6 +11790,10 @@ packages: /@types/prop-types@15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + /@types/q@1.5.8: + resolution: {integrity: sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==} + dev: false + /@types/qs@6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} @@ -10687,12 +11848,21 @@ packages: '@types/scheduler': 0.16.3 csstype: 3.1.2 + /@types/resolve@1.17.1: + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + dependencies: + '@types/node': 20.8.4 + dev: false + + /@types/retry@0.12.0: + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + dev: false + /@types/scheduler@0.16.3: resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} /@types/semver@7.5.0: resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} - dev: true /@types/semver@7.5.6: resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} @@ -10704,6 +11874,12 @@ packages: '@types/mime': 1.3.2 '@types/node': 20.8.4 + /@types/serve-index@1.9.4: + resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + dependencies: + '@types/express': 4.17.17 + dev: false + /@types/serve-static@1.15.2: resolution: {integrity: sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==} dependencies: @@ -10717,9 +11893,19 @@ packages: '@types/node': 20.8.4 dev: true + /@types/sockjs@0.3.36: + resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + dependencies: + '@types/node': 20.8.4 + dev: false + /@types/stack-utils@2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + /@types/stylis@4.2.0: + resolution: {integrity: sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==} + dev: true + /@types/testing-library__jest-dom@5.14.9: resolution: {integrity: sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==} dependencies: @@ -10729,6 +11915,10 @@ packages: /@types/tough-cookie@4.0.2: resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==} + /@types/trusted-types@2.0.7: + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + dev: false + /@types/unist@2.0.7: resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==} @@ -10744,7 +11934,6 @@ packages: resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} dependencies: '@types/node': 20.8.4 - dev: true /@types/yargs-parser@21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} @@ -10759,6 +11948,34 @@ packages: dependencies: '@types/yargs-parser': 21.0.0 + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.51.0)(typescript@4.9.5): + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.6.2 + '@typescript-eslint/parser': 5.62.0(eslint@8.51.0)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.51.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.51.0)(typescript@4.9.5) + debug: 4.3.4 + eslint: 8.51.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + semver: 7.5.4 + tsutils: 3.21.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: false + /@typescript-eslint/eslint-plugin@6.7.5(@typescript-eslint/parser@6.7.5)(eslint@8.51.0)(typescript@5.2.2): resolution: {integrity: sha512-JhtAwTRhOUcP96D0Y6KYnwig/MRQbOoLGXTON2+LlyB/N35SP9j1boai2zzwXb7ypKELXMx3DVk9UTaEq1vHEw==} engines: {node: ^16.0.0 || >=18.0.0} @@ -10788,6 +12005,39 @@ packages: - supports-color dev: true + /@typescript-eslint/experimental-utils@5.62.0(eslint@8.51.0)(typescript@4.9.5): + resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} + 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.62.0(eslint@8.51.0)(typescript@4.9.5) + eslint: 8.51.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + + /@typescript-eslint/parser@5.62.0(eslint@8.51.0)(typescript@4.9.5): + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + debug: 4.3.4 + eslint: 8.51.0 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: false + /@typescript-eslint/parser@6.7.5(eslint@8.51.0)(typescript@5.2.2): resolution: {integrity: sha512-bIZVSGx2UME/lmhLcjdVc7ePBwn7CLqKarUBL4me1C5feOd663liTGjMBGVcGr+BhnSLeP4SgwdvNnnkbIdkCw==} engines: {node: ^16.0.0 || >=18.0.0} @@ -10815,7 +12065,6 @@ packages: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - dev: true /@typescript-eslint/scope-manager@6.7.5: resolution: {integrity: sha512-GAlk3eQIwWOJeb9F7MKQ6Jbah/vx1zETSDw8likab/eFcqkjSD7BI75SDAeC5N2L0MmConMoPvTsmkrg71+B1A==} @@ -10825,6 +12074,26 @@ packages: '@typescript-eslint/visitor-keys': 6.7.5 dev: true + /@typescript-eslint/type-utils@5.62.0(eslint@8.51.0)(typescript@4.9.5): + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.51.0)(typescript@4.9.5) + debug: 4.3.4 + eslint: 8.51.0 + tsutils: 3.21.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: false + /@typescript-eslint/type-utils@6.7.5(eslint@8.51.0)(typescript@5.2.2): resolution: {integrity: sha512-Gs0qos5wqxnQrvpYv+pf3XfcRXW6jiAn9zE/K+DlmYf6FcpxeNYN0AIETaPR7rHO4K2UY+D0CIbDP9Ut0U4m1g==} engines: {node: ^16.0.0 || >=18.0.0} @@ -10848,13 +12117,33 @@ packages: /@typescript-eslint/types@5.62.0: resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true /@typescript-eslint/types@6.7.5: resolution: {integrity: sha512-WboQBlOXtdj1tDFPyIthpKrUb+kZf2VroLZhxKa/VlwLlLyqv/PwUNgL30BlTVZV1Wu4Asu2mMYPqarSO4L5ZQ==} engines: {node: ^16.0.0 || >=18.0.0} dev: true + /@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: false + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.2.2): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -10897,6 +12186,26 @@ packages: - supports-color dev: true + /@typescript-eslint/utils@5.62.0(eslint@8.51.0)(typescript@4.9.5): + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + 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.51.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + eslint: 8.51.0 + eslint-scope: 5.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + /@typescript-eslint/utils@5.62.0(eslint@8.51.0)(typescript@5.2.2): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -10942,7 +12251,6 @@ packages: dependencies: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 - dev: true /@typescript-eslint/visitor-keys@6.7.5: resolution: {integrity: sha512-3MaWdDZtLlsexZzDSdQWsFQ9l9nL8B80Z4fImSpyllFC/KLqWQRdEcB+gGGO+N3Q2uL40EsG66wZLsohPxNXvg==} @@ -10989,19 +12297,15 @@ packages: dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - dev: true /@webassemblyjs/floating-point-hex-parser@1.11.6: resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - dev: true /@webassemblyjs/helper-api-error@1.11.6: resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - dev: true /@webassemblyjs/helper-buffer@1.11.6: resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} - dev: true /@webassemblyjs/helper-numbers@1.11.6: resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} @@ -11009,11 +12313,9 @@ packages: '@webassemblyjs/floating-point-hex-parser': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 '@xtuc/long': 4.2.2 - dev: true /@webassemblyjs/helper-wasm-bytecode@1.11.6: resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - dev: true /@webassemblyjs/helper-wasm-section@1.11.6: resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} @@ -11022,23 +12324,19 @@ packages: '@webassemblyjs/helper-buffer': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/wasm-gen': 1.11.6 - dev: true /@webassemblyjs/ieee754@1.11.6: resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} dependencies: '@xtuc/ieee754': 1.2.0 - dev: true /@webassemblyjs/leb128@1.11.6: resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} dependencies: '@xtuc/long': 4.2.2 - dev: true /@webassemblyjs/utf8@1.11.6: resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - dev: true /@webassemblyjs/wasm-edit@1.11.6: resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} @@ -11051,7 +12349,6 @@ packages: '@webassemblyjs/wasm-opt': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 '@webassemblyjs/wast-printer': 1.11.6 - dev: true /@webassemblyjs/wasm-gen@1.11.6: resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} @@ -11061,7 +12358,6 @@ packages: '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - dev: true /@webassemblyjs/wasm-opt@1.11.6: resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} @@ -11070,7 +12366,6 @@ packages: '@webassemblyjs/helper-buffer': 1.11.6 '@webassemblyjs/wasm-gen': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 - dev: true /@webassemblyjs/wasm-parser@1.11.6: resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} @@ -11081,14 +12376,12 @@ packages: '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - dev: true /@webassemblyjs/wast-printer@1.11.6: resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} dependencies: '@webassemblyjs/ast': 1.11.6 '@xtuc/long': 4.2.2 - dev: true /@webcomponents/custom-elements@1.6.0: resolution: {integrity: sha512-CqTpxOlUCPWRNUPZDxT5v2NnHXA4oox612iUGnmTUGQFhZ1Gkj8kirtl/2wcF6MqX7+PqqicZzOCBKKfIn0dww==} @@ -11225,19 +12518,17 @@ packages: /@xtuc/ieee754@1.2.0: resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: true /@xtuc/long@4.2.2: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: true - /@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15(esbuild@0.18.17): + /@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15(esbuild@0.18.20): resolution: {integrity: sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==} engines: {node: '>=14.15.0'} peerDependencies: esbuild: '>=0.10.0' dependencies: - esbuild: 0.18.17 + esbuild: 0.18.20 tslib: 2.6.1 dev: true @@ -11272,7 +12563,13 @@ packages: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - dev: true + + /acorn-globals@6.0.0: + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + dev: false /acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} @@ -11286,7 +12583,6 @@ packages: acorn: ^8 dependencies: acorn: 8.10.0 - dev: true /acorn-jsx@5.3.2(acorn@7.4.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -11321,7 +12617,6 @@ packages: /acorn-walk@7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} engines: {node: '>=0.4.0'} - dev: true /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} @@ -11331,7 +12626,6 @@ packages: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} hasBin: true - dev: true /acorn@8.10.0: resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} @@ -11341,7 +12635,14 @@ packages: /address@1.2.2: resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} engines: {node: '>= 10.0.0'} - dev: true + + /adjust-sourcemap-loader@4.0.0: + resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} + engines: {node: '>=8.9'} + dependencies: + loader-utils: 2.0.4 + regex-parser: 2.3.0 + dev: false /adm-zip@0.5.10: resolution: {integrity: sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==} @@ -11389,7 +12690,6 @@ packages: optional: true dependencies: ajv: 8.12.0 - dev: true /ajv-keywords@3.5.2(ajv@6.12.6): resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} @@ -11397,7 +12697,6 @@ packages: ajv: ^6.9.1 dependencies: ajv: 6.12.6 - dev: true /ajv-keywords@5.1.0(ajv@8.12.0): resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} @@ -11406,7 +12705,6 @@ packages: dependencies: ajv: 8.12.0 fast-deep-equal: 3.1.3 - dev: true /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -11415,7 +12713,6 @@ packages: fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true /ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} @@ -11424,7 +12721,6 @@ packages: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - dev: true /algoliasearch@4.19.1: resolution: {integrity: sha512-IJF5b93b2MgAzcE/tuzW0yOPnuUyRgGAtaPv5UUywXM8kzqfdwZTO4sPJBzoGz1eOy6H9uEchsJsBFTELZSu+g==} @@ -11467,7 +12763,6 @@ packages: resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} engines: {'0': node >= 0.8.0} hasBin: true - dev: true /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} @@ -11499,7 +12794,6 @@ packages: /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: true /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} @@ -11515,6 +12809,10 @@ packages: /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: false + /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: @@ -11547,7 +12845,6 @@ packages: /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - dev: true /array-includes@3.1.6: resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} @@ -11558,12 +12855,10 @@ packages: es-abstract: 1.22.1 get-intrinsic: 1.2.1 is-string: 1.0.7 - dev: true /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - dev: true /array.prototype.findlastindex@1.2.2: resolution: {integrity: sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==} @@ -11574,7 +12869,6 @@ packages: es-abstract: 1.22.1 es-shim-unscopables: 1.0.0 get-intrinsic: 1.2.1 - dev: true /array.prototype.flat@1.3.1: resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} @@ -11584,7 +12878,6 @@ packages: define-properties: 1.2.0 es-abstract: 1.22.1 es-shim-unscopables: 1.0.0 - dev: true /array.prototype.flatmap@1.3.1: resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} @@ -11594,7 +12887,17 @@ packages: define-properties: 1.2.0 es-abstract: 1.22.1 es-shim-unscopables: 1.0.0 - dev: true + + /array.prototype.reduce@1.0.6: + resolution: {integrity: sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-array-method-boxes-properly: 1.0.0 + is-string: 1.0.7 + dev: false /array.prototype.tosorted@1.1.1: resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} @@ -11604,7 +12907,6 @@ packages: es-abstract: 1.22.1 es-shim-unscopables: 1.0.0 get-intrinsic: 1.2.1 - dev: true /arraybuffer.prototype.slice@1.0.1: resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} @@ -11616,7 +12918,6 @@ packages: get-intrinsic: 1.2.1 is-array-buffer: 3.0.2 is-shared-array-buffer: 1.0.2 - dev: true /arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} @@ -11646,7 +12947,6 @@ packages: /ast-types-flow@0.0.7: resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} - dev: true /ast-types@0.14.2: resolution: {integrity: sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==} @@ -11690,22 +12990,41 @@ packages: /async@3.2.4: resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} - dev: true /asynciterator.prototype@1.0.0: resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} dependencies: has-symbols: 1.0.3 - dev: true /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: false + /auto-bind@4.0.0: resolution: {integrity: sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==} engines: {node: '>=8'} dev: true + /autoprefixer@10.4.17(postcss@8.4.32): + resolution: {integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: '>=8.4.31' + dependencies: + browserslist: 4.22.2 + caniuse-lite: 1.0.30001579 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} @@ -11718,7 +13037,6 @@ packages: /axe-core@4.7.2: resolution: {integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==} engines: {node: '>=4'} - dev: true /axios@1.6.5: resolution: {integrity: sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==} @@ -11734,7 +13052,6 @@ packages: resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} dependencies: dequal: 2.0.3 - dev: true /b4a@1.6.4: resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} @@ -11748,6 +13065,25 @@ packages: '@babel/core': 7.23.2 dev: true + /babel-jest@27.5.1(@babel/core@7.23.2): + resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.23.2 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__core': 7.20.2 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 27.5.1(@babel/core@7.23.2) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: false + /babel-jest@29.7.0(@babel/core@7.23.2): resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -11765,6 +13101,21 @@ packages: transitivePeerDependencies: - supports-color + /babel-loader@8.3.0(@babel/core@7.23.2)(webpack@5.88.2): + resolution: {integrity: sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==} + engines: {node: '>= 8.9'} + peerDependencies: + '@babel/core': ^7.0.0 + webpack: '>=2' + dependencies: + '@babel/core': 7.23.2 + find-cache-dir: 3.3.2 + loader-utils: 2.0.4 + make-dir: 3.1.0 + schema-utils: 2.7.1 + webpack: 5.88.2(esbuild@0.19.5) + dev: false + /babel-loader@9.1.3(@babel/core@7.23.2)(webpack@5.88.2): resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} engines: {node: '>= 14.15.0'} @@ -11794,14 +13145,41 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /babel-plugin-jest-hoist@27.5.1: + resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@babel/template': 7.22.15 '@babel/types': 7.23.0 '@types/babel__core': 7.20.2 '@types/babel__traverse': 7.20.1 + dev: false + + /babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 + '@types/babel__core': 7.20.2 + '@types/babel__traverse': 7.20.1 + + /babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + dependencies: + '@babel/runtime': 7.22.6 + cosmiconfig: 7.1.0 + resolve: 1.22.4 + dev: false + + /babel-plugin-named-asset-import@0.3.8(@babel/core@7.23.2): + resolution: {integrity: sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==} + peerDependencies: + '@babel/core': ^7.1.0 + dependencies: + '@babel/core': 7.23.2 + dev: false /babel-plugin-named-exports-order@0.0.2: resolution: {integrity: sha512-OgOYHOLoRK+/mvXU9imKHlG6GkPLYrUCvFXG/CM93R/aNNO8pOOF4aS+S8CCHMDQoNSeiOYEZb/G6RwL95Jktw==} @@ -11818,7 +13196,19 @@ packages: semver: 7.5.4 transitivePeerDependencies: - supports-color - dev: true + + /babel-plugin-polyfill-corejs2@0.4.8(@babel/core@7.23.2): + resolution: {integrity: sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/core': 7.23.2 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.2) + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: false /babel-plugin-polyfill-corejs3@0.8.3(@babel/core@7.23.2): resolution: {integrity: sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==} @@ -11830,7 +13220,18 @@ packages: core-js-compat: 3.32.0 transitivePeerDependencies: - supports-color - dev: true + + /babel-plugin-polyfill-corejs3@0.8.7(@babel/core@7.23.2): + resolution: {integrity: sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.2) + core-js-compat: 3.35.1 + transitivePeerDependencies: + - supports-color + dev: false /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.23.2): resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==} @@ -11841,7 +13242,17 @@ packages: '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.23.2) transitivePeerDependencies: - supports-color - dev: true + + /babel-plugin-polyfill-regenerator@0.5.5(@babel/core@7.23.2): + resolution: {integrity: sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.2 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.2) + transitivePeerDependencies: + - supports-color + dev: false /babel-plugin-react-docgen@4.2.1: resolution: {integrity: sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ==} @@ -11857,6 +13268,10 @@ packages: resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} dev: true + /babel-plugin-transform-react-remove-prop-types@0.4.24: + resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} + dev: false + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.2): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: @@ -11911,6 +13326,17 @@ packages: babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 dev: true + /babel-preset-jest@27.5.1(@babel/core@7.23.2): + resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.2 + babel-plugin-jest-hoist: 27.5.1 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) + dev: false + /babel-preset-jest@29.6.3(@babel/core@7.23.2): resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -11921,6 +13347,30 @@ packages: babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) + /babel-preset-react-app@10.0.1: + resolution: {integrity: sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==} + dependencies: + '@babel/core': 7.23.2 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-proposal-decorators': 7.23.7(@babel/core@7.23.2) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.2) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.23.2) + '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.23.2) + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-runtime': 7.23.7(@babel/core@7.23.2) + '@babel/preset-env': 7.22.9(@babel/core@7.23.2) + '@babel/preset-react': 7.22.5(@babel/core@7.23.2) + '@babel/preset-typescript': 7.22.5(@babel/core@7.23.2) + '@babel/runtime': 7.22.6 + babel-plugin-macros: 3.1.0 + babel-plugin-transform-react-remove-prop-types: 0.4.24 + transitivePeerDependencies: + - supports-color + dev: false + /bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} dev: false @@ -11947,6 +13397,10 @@ packages: safe-buffer: 5.1.2 dev: true + /batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + dev: false + /bech32@2.0.0: resolution: {integrity: sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==} @@ -11968,6 +13422,17 @@ packages: is-windows: 1.0.2 dev: true + /bfj@7.1.0: + resolution: {integrity: sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==} + engines: {node: '>= 8.0.0'} + dependencies: + bluebird: 3.7.2 + check-types: 11.2.3 + hoopy: 0.1.4 + jsonpath: 1.1.1 + tryer: 1.0.1 + dev: false + /big-integer@1.6.51: resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} engines: {node: '>=0.6'} @@ -11975,7 +13440,6 @@ packages: /big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - dev: true /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} @@ -11988,6 +13452,10 @@ packages: inherits: 2.0.4 readable-stream: 3.6.2 + /bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + dev: false + /bn.js@4.12.0: resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} @@ -12012,7 +13480,13 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: true + + /bonjour-service@1.2.1: + resolution: {integrity: sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==} + dependencies: + fast-deep-equal: 3.1.3 + multicast-dns: 7.2.5 + dev: false /boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -12058,6 +13532,10 @@ packages: resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} dev: true + /browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + dev: false + /browserify-zlib@0.1.4: resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} dependencies: @@ -12074,6 +13552,17 @@ packages: node-releases: 2.0.13 update-browserslist-db: 1.0.11(browserslist@4.21.10) + /browserslist@4.22.2: + resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001579 + electron-to-chromium: 1.4.643 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.22.2) + dev: false + /bs-logger@0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} engines: {node: '>= 6'} @@ -12106,6 +13595,11 @@ packages: base64-js: 1.5.1 ieee754: 1.2.1 + /builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: false + /bundle-name@3.0.0: resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} engines: {node: '>=12'} @@ -12141,12 +13635,10 @@ packages: /bytes@3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} - dev: true /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - dev: true /c8@7.14.0: resolution: {integrity: sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==} @@ -12187,7 +13679,11 @@ packages: dependencies: pascal-case: 3.1.2 tslib: 2.6.1 - dev: true + + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: false /camelcase-keys@6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} @@ -12206,9 +13702,26 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} + /camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + dev: true + + /caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + dependencies: + browserslist: 4.21.10 + caniuse-lite: 1.0.30001518 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + dev: false + /caniuse-lite@1.0.30001518: resolution: {integrity: sha512-rup09/e3I0BKjncL+FesTayKtPrdwKhUufQFd3riFw1hHg8JmIFoInYfB102cFcY/pPgGmdyl/iy+jgiDi2vdA==} + /caniuse-lite@1.0.30001579: + resolution: {integrity: sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==} + dev: false + /capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} dependencies: @@ -12220,7 +13733,6 @@ packages: /case-sensitive-paths-webpack-plugin@2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} engines: {node: '>=4'} - dev: true /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -12305,6 +13817,11 @@ packages: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} + /char-regex@2.0.1: + resolution: {integrity: sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==} + engines: {node: '>=12.20'} + dev: false + /character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} dev: false @@ -12334,6 +13851,10 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true + /check-types@11.2.3: + resolution: {integrity: sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==} + dev: false + /cheerio-select@2.1.0: resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} dependencies: @@ -12386,7 +13907,6 @@ packages: /chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} - dev: true /ci-info@3.8.0: resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} @@ -12404,7 +13924,6 @@ packages: engines: {node: '>= 10.0'} dependencies: source-map: 0.6.1 - dev: true /clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} @@ -12483,7 +14002,6 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} @@ -12516,6 +14034,15 @@ packages: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + /coa@2.0.2: + resolution: {integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==} + engines: {node: '>= 4.0'} + dependencies: + '@types/q': 1.5.8 + chalk: 2.4.2 + q: 1.5.1 + dev: false + /collect-v8-coverage@1.0.2: resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} @@ -12551,9 +14078,12 @@ packages: color-string: 1.9.1 dev: false + /colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + dev: false + /colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: true /colors@1.0.3: resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} @@ -12583,7 +14113,6 @@ packages: /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - dev: true /commander@6.2.1: resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} @@ -12597,7 +14126,6 @@ packages: /commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} - dev: true /commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} @@ -12605,16 +14133,13 @@ packages: /common-path-prefix@3.0.0: resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} - dev: true /common-tags@1.8.2: resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} engines: {node: '>=4.0.0'} - dev: true /commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - dev: true /compare-versions@6.1.0: resolution: {integrity: sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==} @@ -12624,7 +14149,6 @@ packages: engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 - dev: true /compression@1.7.4: resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} @@ -12639,7 +14163,6 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color - dev: true /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -12654,6 +14177,15 @@ packages: typedarray: 0.0.6 dev: true + /confusing-browser-globals@1.0.11: + resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + dev: false + + /connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + dev: false + /connect-injector@0.4.4: resolution: {integrity: sha512-hdBG8nXop42y2gWCqOV8y1O3uVk4cIU+SoxLCPyCUKRImyPiScoNiSulpHjoktRU1BdI0UzoUdxUa87thrcmHw==} engines: {node: '>= 0.8.0'} @@ -12683,12 +14215,10 @@ packages: engines: {node: '>= 0.6'} dependencies: safe-buffer: 5.2.1 - dev: true /content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - dev: true /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -12698,7 +14228,6 @@ packages: /cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - dev: true /cookie@0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} @@ -12708,7 +14237,6 @@ packages: /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} - dev: true /copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} @@ -12720,12 +14248,16 @@ packages: resolution: {integrity: sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==} dependencies: browserslist: 4.21.10 - dev: true + + /core-js-compat@3.35.1: + resolution: {integrity: sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==} + dependencies: + browserslist: 4.22.2 + dev: false /core-js-pure@3.32.0: resolution: {integrity: sha512-qsev1H+dTNYpDUEURRuOXMvpdtAnNEvQWS/FMJ2Vb5AY8ZP4rAPQldkE27joykZPJTe0+IVgHZYh1P5Xu1/i1g==} requiresBuild: true - dev: true /core-js@3.32.0: resolution: {integrity: sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww==} @@ -12734,13 +14266,23 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: true /corser@2.0.1: resolution: {integrity: sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==} engines: {node: '>= 0.4.0'} dev: true + /cosmiconfig@6.0.0: + resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} + engines: {node: '>=8'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: false + /cosmiconfig@7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} @@ -12750,7 +14292,6 @@ packages: parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 - dev: true /cosmiconfig@8.2.0: resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==} @@ -12820,24 +14361,110 @@ packages: /crypto-random-string@2.0.0: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} + + /css-blank-pseudo@3.0.3(postcss@8.4.32): + resolution: {integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==} + engines: {node: ^12 || ^14 || >=16} + hasBin: true + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + dev: false + + /css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} dev: true + /css-declaration-sorter@6.4.1(postcss@8.4.32): + resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==} + engines: {node: ^10 || ^12 || >=14} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + dev: false + + /css-has-pseudo@3.0.4(postcss@8.4.32): + resolution: {integrity: sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==} + engines: {node: ^12 || ^14 || >=16} + hasBin: true + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + dev: false + /css-loader@6.8.1(webpack@5.88.2): resolution: {integrity: sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.31) - postcss: 8.4.31 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.31) - postcss-modules-local-by-default: 4.0.3(postcss@8.4.31) - postcss-modules-scope: 3.0.0(postcss@8.4.31) - postcss-modules-values: 4.0.0(postcss@8.4.31) + icss-utils: 5.1.0(postcss@8.4.32) + postcss: 8.4.32 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.32) + postcss-modules-local-by-default: 4.0.3(postcss@8.4.32) + postcss-modules-scope: 3.0.0(postcss@8.4.32) + postcss-modules-values: 4.0.0(postcss@8.4.32) postcss-value-parser: 4.2.0 semver: 7.5.4 - webpack: 5.88.2(@swc/core@1.3.92)(esbuild@0.19.5) - dev: true + webpack: 5.88.2(esbuild@0.19.5) + + /css-minimizer-webpack-plugin@3.4.1(esbuild@0.19.5)(webpack@5.88.2): + resolution: {integrity: sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==} + engines: {node: '>= 12.13.0'} + peerDependencies: + '@parcel/css': '*' + clean-css: '*' + csso: '*' + esbuild: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + '@parcel/css': + optional: true + clean-css: + optional: true + csso: + optional: true + esbuild: + optional: true + dependencies: + cssnano: 5.1.15(postcss@8.4.32) + esbuild: 0.19.5 + jest-worker: 27.5.1 + postcss: 8.4.32 + schema-utils: 4.2.0 + serialize-javascript: 6.0.1 + source-map: 0.6.1 + webpack: 5.88.2(esbuild@0.19.5) + dev: false + + /css-prefers-color-scheme@6.0.3(postcss@8.4.32): + resolution: {integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==} + engines: {node: ^12 || ^14 || >=16} + hasBin: true + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + dev: false + + /css-select-base-adapter@0.1.1: + resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==} + dev: false + + /css-select@2.1.0: + resolution: {integrity: sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==} + dependencies: + boolbase: 1.0.0 + css-what: 3.4.2 + domutils: 1.7.0 + nth-check: 2.1.1 + dev: false /css-select@4.3.0: resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} @@ -12847,7 +14474,6 @@ packages: domhandler: 4.3.1 domutils: 2.8.0 nth-check: 2.1.1 - dev: true /css-select@5.1.0: resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} @@ -12858,6 +14484,30 @@ packages: domutils: 3.1.0 nth-check: 2.1.1 + /css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + dev: true + + /css-tree@1.0.0-alpha.37: + resolution: {integrity: sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.4 + source-map: 0.6.1 + dev: false + + /css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + dev: false + /css-tree@2.2.1: resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} @@ -12872,6 +14522,11 @@ packages: mdn-data: 2.0.30 source-map-js: 1.0.2 + /css-what@3.4.2: + resolution: {integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==} + engines: {node: '>= 6'} + dev: false + /css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} @@ -12880,21 +14535,94 @@ packages: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} dev: false + /cssdb@7.10.0: + resolution: {integrity: sha512-yGZ5tmA57gWh/uvdQBHs45wwFY0IBh3ypABk5sEubPBPSzXzkNgsWReqx7gdx6uhC+QoFBe+V8JwBB9/hQ6cIA==} + dev: false + /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true - dev: true - /csso@5.0.5: - resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + /cssnano-preset-default@5.2.14(postcss@8.4.32): + resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' dependencies: - css-tree: 2.2.1 - - /cssom@0.3.8: + css-declaration-sorter: 6.4.1(postcss@8.4.32) + cssnano-utils: 3.1.0(postcss@8.4.32) + postcss: 8.4.32 + postcss-calc: 8.2.4(postcss@8.4.32) + postcss-colormin: 5.3.1(postcss@8.4.32) + postcss-convert-values: 5.1.3(postcss@8.4.32) + postcss-discard-comments: 5.1.2(postcss@8.4.32) + postcss-discard-duplicates: 5.1.0(postcss@8.4.32) + postcss-discard-empty: 5.1.1(postcss@8.4.32) + postcss-discard-overridden: 5.1.0(postcss@8.4.32) + postcss-merge-longhand: 5.1.7(postcss@8.4.32) + postcss-merge-rules: 5.1.4(postcss@8.4.32) + postcss-minify-font-values: 5.1.0(postcss@8.4.32) + postcss-minify-gradients: 5.1.1(postcss@8.4.32) + postcss-minify-params: 5.1.4(postcss@8.4.32) + postcss-minify-selectors: 5.2.1(postcss@8.4.32) + postcss-normalize-charset: 5.1.0(postcss@8.4.32) + postcss-normalize-display-values: 5.1.0(postcss@8.4.32) + postcss-normalize-positions: 5.1.1(postcss@8.4.32) + postcss-normalize-repeat-style: 5.1.1(postcss@8.4.32) + postcss-normalize-string: 5.1.0(postcss@8.4.32) + postcss-normalize-timing-functions: 5.1.0(postcss@8.4.32) + postcss-normalize-unicode: 5.1.1(postcss@8.4.32) + postcss-normalize-url: 5.1.0(postcss@8.4.32) + postcss-normalize-whitespace: 5.1.1(postcss@8.4.32) + postcss-ordered-values: 5.1.3(postcss@8.4.32) + postcss-reduce-initial: 5.1.2(postcss@8.4.32) + postcss-reduce-transforms: 5.1.0(postcss@8.4.32) + postcss-svgo: 5.1.0(postcss@8.4.32) + postcss-unique-selectors: 5.1.1(postcss@8.4.32) + dev: false + + /cssnano-utils@3.1.0(postcss@8.4.32): + resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + dev: false + + /cssnano@5.1.15(postcss@8.4.32): + resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + cssnano-preset-default: 5.2.14(postcss@8.4.32) + lilconfig: 2.1.0 + postcss: 8.4.32 + yaml: 1.10.2 + dev: false + + /csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + dependencies: + css-tree: 1.1.3 + dev: false + + /csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + dependencies: + css-tree: 2.2.1 + + /cssom@0.3.8: resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + /cssom@0.4.4: + resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + dev: false + /cssom@0.5.0: resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} @@ -12935,7 +14663,15 @@ packages: /damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - dev: true + + /data-urls@2.0.0: + resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} + engines: {node: '>=10'} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + dev: false /data-urls@3.0.2: resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} @@ -13013,7 +14749,6 @@ packages: /dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - dev: true /dedent@1.5.1: resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} @@ -13052,7 +14787,6 @@ packages: /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true /deepmerge-json@1.5.0: resolution: {integrity: sha512-jZRrDmBKjmGcqMFEUJ14FjMJwm05Qaked+1vxaALRtF0UAl7lPU8OLWXFxvoeg3jbQM249VPFVn8g2znaQkEtA==} @@ -13081,6 +14815,13 @@ packages: titleize: 3.0.0 dev: true + /default-gateway@6.0.3: + resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} + engines: {node: '>= 10'} + dependencies: + execa: 5.1.1 + dev: false + /defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} dependencies: @@ -13090,7 +14831,6 @@ packages: /define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} - dev: true /define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} @@ -13126,10 +14866,14 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: false + /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - dev: true /dependency-graph@0.11.0: resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} @@ -13147,7 +14891,6 @@ packages: /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dev: true /detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} @@ -13166,6 +14909,10 @@ packages: /detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + /detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + dev: false + /detect-package-manager@2.0.1: resolution: {integrity: sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==} engines: {node: '>=12'} @@ -13173,6 +14920,17 @@ packages: execa: 5.1.1 dev: true + /detect-port-alt@1.1.6: + resolution: {integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==} + engines: {node: '>= 4.2.1'} + hasBin: true + dependencies: + address: 1.2.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + /detect-port@1.5.1: resolution: {integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==} hasBin: true @@ -13211,6 +14969,15 @@ packages: engines: {node: '>=6.0'} dev: false + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: false + + /diff-sequences@27.5.1: + resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: false + /diff-sequences@28.1.1: resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -13239,19 +15006,28 @@ packages: dependencies: path-type: 4.0.0 + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: false + + /dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + dependencies: + '@leichtgewicht/ip-codec': 2.0.4 + dev: false + /doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} dependencies: esutils: 2.0.3 - dev: true /doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 - dev: true /dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -13260,7 +15036,13 @@ packages: resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} dependencies: utila: 0.4.0 - dev: true + + /dom-serializer@0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 + dev: false /dom-serializer@1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} @@ -13276,6 +15058,10 @@ packages: domhandler: 5.0.3 entities: 4.5.0 + /domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + dev: false + /domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} @@ -13285,6 +15071,14 @@ packages: webidl-conversions: 4.0.2 dev: false + /domexception@2.0.1: + resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} + engines: {node: '>=8'} + deprecated: Use your platform's native DOMException instead + dependencies: + webidl-conversions: 5.0.0 + dev: false + /domexception@4.0.0: resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} engines: {node: '>=12'} @@ -13303,6 +15097,13 @@ packages: dependencies: domelementtype: 2.3.0 + /domutils@1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + dependencies: + dom-serializer: 0.2.2 + domelementtype: 1.3.1 + dev: false + /domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} dependencies: @@ -13322,13 +15123,21 @@ packages: dependencies: no-case: 3.0.4 tslib: 2.6.1 - dev: true /dotenv-expand@10.0.0: resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} engines: {node: '>=12'} dev: true + /dotenv-expand@5.1.0: + resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} + dev: false + + /dotenv@10.0.0: + resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} + engines: {node: '>=10'} + dev: false + /dotenv@16.3.1: resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} engines: {node: '>=12'} @@ -13343,6 +15152,10 @@ packages: engines: {node: '>=4'} dev: true + /duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: false + /duplexify@3.7.1: resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} dependencies: @@ -13363,7 +15176,6 @@ packages: /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - dev: true /ejs@3.1.9: resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} @@ -13371,11 +15183,14 @@ packages: hasBin: true dependencies: jake: 10.8.7 - dev: true /electron-to-chromium@1.4.478: resolution: {integrity: sha512-qjTA8djMXd+ruoODDFGnRCRBpID+AAfYWCyGtYTNhsuwxI19s8q19gbjKTwRS5z/LyVf5wICaIiPQGLekmbJbA==} + /electron-to-chromium@1.4.643: + resolution: {integrity: sha512-QHscvvS7gt155PtoRC0dR2ilhL8E9LHhfTQEq1uD5AL0524rBLAwpAREFH06f87/e45B9XkR6Ki5dbhbCsVEIg==} + dev: false + /elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} dependencies: @@ -13387,10 +15202,20 @@ packages: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 + /emittery@0.10.2: + resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} + engines: {node: '>=12'} + dev: false + /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} + /emittery@0.8.1: + resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} + engines: {node: '>=10'} + dev: false + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -13400,12 +15225,10 @@ packages: /emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} - dev: true /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} - dev: true /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -13426,7 +15249,6 @@ packages: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - dev: true /enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} @@ -13462,7 +15284,6 @@ packages: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} dependencies: stackframe: 1.3.4 - dev: true /es-abstract@1.22.1: resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} @@ -13507,7 +15328,10 @@ packages: typed-array-length: 1.0.4 unbox-primitive: 1.0.2 which-typed-array: 1.1.11 - dev: true + + /es-array-method-boxes-properly@1.0.0: + resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + dev: false /es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} @@ -13539,7 +15363,6 @@ packages: internal-slot: 1.0.5 iterator.prototype: 1.1.0 safe-array-concat: 1.0.0 - dev: true /es-module-lexer@0.10.5: resolution: {integrity: sha512-+7IwY/kiGAacQfY+YBhKMvEmyAJnw5grTUgjG85Pe7vcUI/6b7pZjZG8nQ7+48YhzEAEqrEgD2dCz/JIK+AYvw==} @@ -13551,7 +15374,6 @@ packages: /es-module-lexer@1.3.0: resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} - dev: true /es-set-tostringtag@2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} @@ -13560,13 +15382,11 @@ packages: get-intrinsic: 1.2.1 has: 1.0.3 has-tostringtag: 1.0.0 - dev: true /es-shim-unscopables@1.0.0: resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} dependencies: has: 1.0.3 - dev: true /es-to-primitive@1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} @@ -13575,7 +15395,6 @@ packages: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - dev: true /es6-object-assign@1.1.0: resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} @@ -13690,7 +15509,6 @@ packages: /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: true /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} @@ -13703,13 +15521,25 @@ packages: /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - dev: true /escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} dev: false + /escodegen@1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + dev: false + /escodegen@2.1.0: resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} engines: {node: '>=6.0'} @@ -13755,6 +15585,41 @@ packages: eslint: 8.51.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.51.0)(jest@27.5.1)(typescript@4.9.5): + resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} + engines: {node: '>=14.0.0'} + peerDependencies: + eslint: ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/core': 7.23.2 + '@babel/eslint-parser': 7.23.3(@babel/core@7.23.2)(eslint@8.51.0) + '@rushstack/eslint-patch': 1.5.1 + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.51.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.62.0(eslint@8.51.0)(typescript@4.9.5) + babel-preset-react-app: 10.0.1 + confusing-browser-globals: 1.0.11 + eslint: 8.51.0 + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(eslint@8.51.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.51.0) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.51.0)(jest@27.5.1)(typescript@4.9.5) + eslint-plugin-jsx-a11y: 6.7.1(eslint@8.51.0) + eslint-plugin-react: 7.33.2(eslint@8.51.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.51.0) + eslint-plugin-testing-library: 5.11.1(eslint@8.51.0)(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - '@babel/plugin-syntax-flow' + - '@babel/plugin-transform-react-jsx' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + dev: false + /eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} dependencies: @@ -13763,7 +15628,6 @@ packages: resolve: 1.22.4 transitivePeerDependencies: - supports-color - dev: true /eslint-import-resolver-typescript@3.6.0(@typescript-eslint/parser@6.7.5)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.51.0): resolution: {integrity: sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg==} @@ -13788,6 +15652,35 @@ packages: - supports-color dev: true + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.51.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.51.0)(typescript@4.9.5) + debug: 3.2.7 + eslint: 8.51.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + dev: false + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.7.5)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.51.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} @@ -13829,6 +15722,56 @@ packages: ignore: 5.2.4 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.51.0): + resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@babel/plugin-syntax-flow': ^7.14.5 + '@babel/plugin-transform-react-jsx': ^7.14.9 + eslint: ^8.1.0 + dependencies: + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.23.2) + eslint: 8.51.0 + lodash: 4.17.21 + string-natural-compare: 3.0.1 + dev: false + + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.51.0): + resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.51.0)(typescript@4.9.5) + array-includes: 3.1.6 + array.prototype.findlastindex: 1.2.2 + array.prototype.flat: 1.3.1 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.51.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.51.0) + has: 1.0.3 + is-core-module: 2.13.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.6 + object.groupby: 1.0.0 + object.values: 1.1.6 + semver: 7.5.4 + tsconfig-paths: 3.14.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: false + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.7.5)(eslint-import-resolver-typescript@3.6.0)(eslint@8.51.0): resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} @@ -13879,6 +15822,28 @@ packages: requireindex: 1.2.0 dev: true + /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.51.0)(jest@27.5.1)(typescript@4.9.5): + resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^4.0.0 || ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.51.0)(typescript@4.9.5) + '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.51.0)(typescript@4.9.5) + eslint: 8.51.0 + jest: 27.5.1(ts-node@10.9.1) + transitivePeerDependencies: + - supports-color + - typescript + dev: false + /eslint-plugin-jsx-a11y@6.7.1(eslint@8.51.0): resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} engines: {node: '>=4.0'} @@ -13902,7 +15867,6 @@ packages: object.entries: 1.1.6 object.fromentries: 2.0.6 semver: 7.5.4 - dev: true /eslint-plugin-prettier@5.0.0(eslint-config-prettier@9.0.0)(eslint@8.51.0)(prettier@3.1.0): resolution: {integrity: sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==} @@ -13932,7 +15896,6 @@ packages: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: eslint: 8.51.0 - dev: true /eslint-plugin-react-refresh@0.4.3(eslint@8.51.0): resolution: {integrity: sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==} @@ -13965,7 +15928,19 @@ packages: resolve: 2.0.0-next.4 semver: 7.5.4 string.prototype.matchall: 4.0.8 - dev: true + + /eslint-plugin-testing-library@5.11.1(eslint@8.51.0)(typescript@4.9.5): + resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} + 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.62.0(eslint@8.51.0)(typescript@4.9.5) + eslint: 8.51.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: false /eslint-plugin-testing-library@6.0.1(eslint@8.51.0)(typescript@5.2.2): resolution: {integrity: sha512-CEYtjpcF3hAaQtYsTZqciR7s5z+T0LCMTwJeW+pz6kBnGtc866wAKmhaiK2Gsjc2jWNP7Gt6zhNr2DE1ZW4e+g==} @@ -13986,7 +15961,6 @@ packages: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - dev: true /eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} @@ -13994,18 +15968,37 @@ packages: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true + + /eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: false /eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /eslint@8.51.0: - resolution: {integrity: sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: + /eslint-webpack-plugin@3.2.0(eslint@8.51.0)(webpack@5.88.2): + resolution: {integrity: sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==} + engines: {node: '>= 12.13.0'} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + webpack: ^5.0.0 + dependencies: + '@types/eslint': 8.44.1 + eslint: 8.51.0 + jest-worker: 28.1.3 + micromatch: 4.0.5 + normalize-path: 3.0.0 + schema-utils: 4.2.0 + webpack: 5.88.2(esbuild@0.19.5) + dev: false + + /eslint@8.51.0: + resolution: {integrity: sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.51.0) '@eslint-community/regexpp': 4.6.2 '@eslint/eslintrc': 2.1.2 @@ -14045,7 +16038,6 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} @@ -14054,7 +16046,12 @@ packages: acorn: 8.10.0 acorn-jsx: 5.3.2(acorn@8.10.0) eslint-visitor-keys: 3.4.3 - dev: true + + /esprima@1.2.2: + resolution: {integrity: sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} @@ -14066,19 +16063,16 @@ packages: engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 - dev: true /esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 - dev: true /estraverse@4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} - dev: true /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} @@ -14128,6 +16122,10 @@ packages: '@types/unist': 2.0.7 dev: false + /estree-walker@1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + dev: false + /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} dev: true @@ -14145,7 +16143,6 @@ packages: /etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - dev: true /ethereum-cryptography@2.1.2: resolution: {integrity: sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==} @@ -14172,7 +16169,6 @@ packages: /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - dev: true /eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -14234,6 +16230,16 @@ packages: engines: {node: '>=6'} dev: false + /expect@27.5.1: + resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + jest-get-type: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + dev: false + /expect@29.6.2: resolution: {integrity: sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -14292,7 +16298,6 @@ packages: vary: 1.1.2 transitivePeerDependencies: - supports-color - dev: true /extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} @@ -14350,7 +16355,6 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true /fast-diff@1.3.0: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} @@ -14384,7 +16388,6 @@ packages: /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true /fast-querystring@1.1.2: resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} @@ -14411,6 +16414,13 @@ packages: dependencies: format: 0.2.2 + /faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + dependencies: + websocket-driver: 0.7.4 + dev: false + /fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} dependencies: @@ -14462,7 +16472,6 @@ packages: engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.0.4 - dev: true /file-loader@6.2.0(webpack@5.88.2): resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} @@ -14473,7 +16482,6 @@ packages: loader-utils: 2.0.4 schema-utils: 3.3.0 webpack: 5.88.2(esbuild@0.19.5) - dev: true /file-system-cache@2.3.0: resolution: {integrity: sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==} @@ -14485,7 +16493,11 @@ packages: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} dependencies: minimatch: 5.1.6 - dev: true + + /filesize@8.0.7: + resolution: {integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==} + engines: {node: '>= 0.4.0'} + dev: false /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} @@ -14506,7 +16518,6 @@ packages: unpipe: 1.0.0 transitivePeerDependencies: - supports-color - dev: true /find-cache-dir@2.1.0: resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} @@ -14524,7 +16535,6 @@ packages: commondir: 1.0.1 make-dir: 3.1.0 pkg-dir: 4.2.0 - dev: true /find-cache-dir@4.0.0: resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} @@ -14539,7 +16549,6 @@ packages: engines: {node: '>=6'} dependencies: locate-path: 3.0.0 - dev: true /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} @@ -14554,7 +16563,6 @@ packages: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true /find-up@6.3.0: resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} @@ -14577,11 +16585,9 @@ packages: dependencies: flatted: 3.2.7 rimraf: 3.0.2 - dev: true /flatted@3.2.7: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} - dev: true /flow-parser@0.213.1: resolution: {integrity: sha512-l+vyZO6hrWG60DredryA8mq62fK9vxL6/RR13HA/aVLBNh9No/wEJsKI+CJqPRkF4CIRUfcJQBeaMXSKcncxUQ==} @@ -14603,16 +16609,6 @@ packages: - encoding dev: false - /follow-redirects@1.15.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: true - /follow-redirects@1.15.4: resolution: {integrity: sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==} engines: {node: '>=4.0'} @@ -14621,7 +16617,6 @@ packages: peerDependenciesMeta: debug: optional: true - dev: false /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -14643,6 +16638,38 @@ packages: cross-spawn: 7.0.3 signal-exit: 4.1.0 + /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.51.0)(typescript@4.9.5)(webpack@5.88.2): + resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} + engines: {node: '>=10', yarn: '>=1.0.0'} + peerDependencies: + eslint: '>= 6' + typescript: '>= 2.7' + vue-template-compiler: '*' + webpack: '>= 4' + peerDependenciesMeta: + eslint: + optional: true + vue-template-compiler: + optional: true + dependencies: + '@babel/code-frame': 7.22.13 + '@types/json-schema': 7.0.12 + chalk: 4.1.2 + chokidar: 3.5.3 + cosmiconfig: 6.0.0 + deepmerge: 4.3.1 + eslint: 8.51.0 + fs-extra: 9.1.0 + glob: 7.2.3 + memfs: 3.5.3 + minimatch: 3.1.2 + schema-utils: 2.7.0 + semver: 7.5.4 + tapable: 1.1.3 + typescript: 4.9.5 + webpack: 5.88.2(esbuild@0.19.5) + dev: false + /fork-ts-checker-webpack-plugin@8.0.0(typescript@5.2.2)(webpack@5.88.2): resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} engines: {node: '>=12.13.0', yarn: '>=1.0.0'} @@ -14689,7 +16716,10 @@ packages: /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - dev: true + + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: false /framer-motion@10.16.4(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-p9V9nGomS3m6/CALXqv6nFGMuFOxbWsmaOrdmhyQimMIlLl3LC7h7l86wge/Js/8cRu5ktutS/zlzgR7eBOtFA==} @@ -14712,7 +16742,6 @@ packages: /fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} - dev: true /front-matter@4.0.2: resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==} @@ -14730,7 +16759,6 @@ packages: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 - dev: true /fs-extra@11.1.1: resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} @@ -14758,6 +16786,16 @@ packages: universalify: 0.1.2 dev: true + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: false + /fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -14766,7 +16804,6 @@ packages: /fs-monkey@1.0.4: resolution: {integrity: sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==} - dev: true /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -14786,6 +16823,58 @@ packages: requiresBuild: true optional: true + /fuels@0.67.0: + resolution: {integrity: sha512-/eH6cEZthb3dRSTa0sZxWjyl9y54nOJxcVgtEwEx2P87VbqNOjaPlv/I44C/shBHgeuAmxHetHmyPzyX+3zdqA==} + engines: {node: ^18.14.1} + hasBin: true + dependencies: + '@fuel-ts/abi-coder': 0.67.0 + '@fuel-ts/abi-typegen': 0.67.0 + '@fuel-ts/address': 0.67.0 + '@fuel-ts/contract': 0.67.0 + '@fuel-ts/crypto': 0.67.0 + '@fuel-ts/errors': 0.67.0 + '@fuel-ts/forc': 0.67.0 + '@fuel-ts/fuel-core': 0.67.0 + '@fuel-ts/hasher': 0.67.0 + '@fuel-ts/hdwallet': 0.67.0 + '@fuel-ts/interfaces': 0.67.0 + '@fuel-ts/math': 0.67.0 + '@fuel-ts/merkle': 0.67.0 + '@fuel-ts/mnemonic': 0.67.0 + '@fuel-ts/predicate': 0.67.0 + '@fuel-ts/program': 0.67.0 + '@fuel-ts/providers': 0.67.0 + '@fuel-ts/script': 0.67.0 + '@fuel-ts/signer': 0.67.0 + '@fuel-ts/transactions': 0.67.0 + '@fuel-ts/utils': 0.67.0 + '@fuel-ts/versions': 0.67.0 + '@fuel-ts/wallet': 0.67.0 + '@fuel-ts/wallet-manager': 0.67.0 + '@fuel-ts/wordlists': 0.67.0 + bundle-require: 4.0.1(esbuild@0.19.5) + chalk: 4.1.2 + chokidar: 3.5.3 + commander: 9.5.0 + esbuild: 0.19.5 + ethers: 6.8.1 + glob: 10.3.10 + handlebars: 4.7.7 + joycon: 3.1.1 + lodash.camelcase: 4.3.0 + portfinder: 1.0.32 + rimraf: 3.0.2 + toml: 3.0.0 + tree-kill: 1.2.2 + yup: 0.32.11 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + /fuels@0.71.1: resolution: {integrity: sha512-f5ypkcNFh9zrmSX5a7QgAIeINoffFyTz8/cjB1TOVlAGu/Irg9mwcI62y8yLENGV73YFI9aBUE94SHqfEMvq5g==} engines: {node: ^18.17.1} @@ -14849,7 +16938,6 @@ packages: define-properties: 1.2.0 es-abstract: 1.22.1 functions-have-names: 1.2.3 - dev: true /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} @@ -14891,6 +16979,10 @@ packages: engines: {node: '>=12.17'} dev: true + /get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + dev: false + /get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} @@ -14914,7 +17006,6 @@ packages: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 - dev: true /get-tsconfig@4.6.2: resolution: {integrity: sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg==} @@ -14961,7 +17052,6 @@ packages: engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 - dev: true /glob-promise@4.2.2(glob@7.2.3): resolution: {integrity: sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==} @@ -14996,7 +17086,6 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true /glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} @@ -15019,6 +17108,22 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 + /global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + dependencies: + global-prefix: 3.0.0 + dev: false + + /global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + dev: false + /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} @@ -15028,14 +17133,12 @@ packages: engines: {node: '>=8'} dependencies: type-fest: 0.20.2 - dev: true /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.0 - dev: true /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} @@ -15047,7 +17150,6 @@ packages: ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 - dev: true /globby@13.2.2: resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} @@ -15086,7 +17188,6 @@ packages: /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true /graphql-config@5.0.2(@types/node@20.8.4)(graphql@16.8.1): resolution: {integrity: sha512-7TPxOrlbiG0JplSZYCyxn2XQtqVhXomEjXUmWJVSS5ET1nPhOJSsIb/WTwqWhcYX6G0RlHXSj9PLtGTKmxLNGg==} @@ -15192,6 +17293,17 @@ packages: through2: 2.0.5 dev: true + /gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + dependencies: + duplexer: 0.1.2 + dev: false + + /handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + dev: false + /handlebars@4.7.7: resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} engines: {node: '>=0.4.7'} @@ -15307,7 +17419,6 @@ packages: /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - dev: true /header-case@2.0.4: resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} @@ -15336,10 +17447,31 @@ packages: react-is: 16.13.1 dev: false + /hoopy@0.1.4: + resolution: {integrity: sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==} + engines: {node: '>= 6.0.0'} + dev: false + /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true + /hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + dependencies: + inherits: 2.0.4 + obuf: 1.1.2 + readable-stream: 2.3.8 + wbuf: 1.7.3 + dev: false + + /html-encoding-sniffer@2.0.1: + resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} + engines: {node: '>=10'} + dependencies: + whatwg-encoding: 1.0.5 + dev: false + /html-encoding-sniffer@3.0.0: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} @@ -15348,7 +17480,6 @@ packages: /html-entities@2.4.0: resolution: {integrity: sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==} - dev: true /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -15365,7 +17496,6 @@ packages: param-case: 3.0.4 relateurl: 0.2.7 terser: 5.19.2 - dev: true /html-tags@3.3.1: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} @@ -15383,8 +17513,7 @@ packages: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.88.2(@swc/core@1.3.92)(esbuild@0.19.5) - dev: true + webpack: 5.88.2(esbuild@0.19.5) /htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} @@ -15403,6 +17532,20 @@ packages: entities: 4.5.0 dev: true + /http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + dev: false + + /http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + dev: false + /http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -15412,7 +17555,21 @@ packages: setprototypeof: 1.2.0 statuses: 2.0.1 toidentifier: 1.0.1 - dev: true + + /http-parser-js@0.5.8: + resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + dev: false + + /http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false /http-proxy-agent@5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} @@ -15434,16 +17591,34 @@ packages: - supports-color dev: true + /http-proxy-middleware@2.0.6(@types/express@4.17.17): + resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + dependencies: + '@types/express': 4.17.17 + '@types/http-proxy': 1.17.14 + http-proxy: 1.18.1 + is-glob: 4.0.3 + is-plain-obj: 3.0.0 + micromatch: 4.0.5 + transitivePeerDependencies: + - debug + dev: false + /http-proxy@1.18.1: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.2 + follow-redirects: 1.15.4 requires-port: 1.0.0 transitivePeerDependencies: - debug - dev: true /http-server@14.1.1: resolution: {integrity: sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==} @@ -15525,7 +17700,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 - dev: true /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} @@ -15533,14 +17707,17 @@ packages: dependencies: safer-buffer: 2.1.2 - /icss-utils@5.1.0(postcss@8.4.31): + /icss-utils@5.1.0(postcss@8.4.32): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: '>=8.4.31' dependencies: - postcss: 8.4.31 - dev: true + postcss: 8.4.32 + + /idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + dev: false /identity-obj-proxy@3.0.0: resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} @@ -15563,6 +17740,10 @@ packages: resolution: {integrity: sha512-pwupu3eWfouuaowscykeckFmVTpqbzW+rXFCX8rQLkZzM9ftBmU/++Ra+o+L27mz03zJTlyV4UUr+fdKNffo4A==} dev: true + /immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + dev: false + /immutable@3.7.6: resolution: {integrity: sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==} engines: {node: '>=0.8.0'} @@ -15574,7 +17755,6 @@ packages: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true /import-from@4.0.0: resolution: {integrity: sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==} @@ -15603,6 +17783,10 @@ packages: once: 1.4.0 wrappy: 1.0.2 + /inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + dev: false + /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -15664,7 +17848,11 @@ packages: /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - dev: true + + /ipaddr.js@2.1.0: + resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==} + engines: {node: '>= 10'} + dev: false /is-absolute-url@3.0.3: resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} @@ -15725,7 +17913,6 @@ packages: engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - dev: true /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} @@ -15787,7 +17974,6 @@ packages: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} hasBin: true - dev: true /is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} @@ -15808,7 +17994,6 @@ packages: resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} dependencies: call-bind: 1.0.2 - dev: true /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} @@ -15828,7 +18013,6 @@ packages: engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - dev: true /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} @@ -15870,6 +18054,10 @@ packages: /is-map@2.0.2: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + /is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + dev: false + /is-nan@1.3.2: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} @@ -15881,7 +18069,6 @@ packages: /is-negative-zero@2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} - dev: true /is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} @@ -15897,6 +18084,11 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + /is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + dev: false + /is-path-cwd@2.2.0: resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} engines: {node: '>=6'} @@ -15905,13 +18097,17 @@ packages: /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - dev: true /is-plain-obj@1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} dev: true + /is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + dev: false + /is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -15945,6 +18141,11 @@ packages: call-bind: 1.0.2 has-tostringtag: 1.0.0 + /is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + dev: false + /is-relative@1.0.0: resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} engines: {node: '>=0.10.0'} @@ -15952,6 +18153,11 @@ packages: is-unc-path: 1.0.0 dev: true + /is-root@2.1.0: + resolution: {integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==} + engines: {node: '>=6'} + dev: false + /is-set@2.0.2: resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} @@ -15993,6 +18199,10 @@ packages: dependencies: which-typed-array: 1.1.11 + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: false + /is-unc-path@1.0.0: resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} engines: {node: '>=0.10.0'} @@ -16018,7 +18228,6 @@ packages: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 - dev: true /is-weakset@2.0.2: resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} @@ -16036,11 +18245,9 @@ packages: engines: {node: '>=8'} dependencies: is-docker: 2.2.1 - dev: true /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: true /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -16126,7 +18333,6 @@ packages: has-symbols: 1.0.3 has-tostringtag: 1.0.0 reflect.getprototypeof: 1.0.3 - dev: true /jackspeak@2.3.6: resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} @@ -16145,7 +18351,6 @@ packages: chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 - dev: true /jest-axe@7.0.1: resolution: {integrity: sha512-1JoEla6gL4rcsTxEWm+VBcWMwOhP3f9w4dH7/YW3H41nU08Dds3gUFqxgdAq/pzBNPpauC3QPr/BuO+0W8eamg==} @@ -16157,6 +18362,15 @@ packages: lodash.merge: 4.6.2 dev: false + /jest-changed-files@27.5.1: + resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + execa: 5.1.1 + throat: 6.0.2 + dev: false + /jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16165,18 +18379,45 @@ packages: jest-util: 29.7.0 p-limit: 3.1.0 - /jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /jest-circus@27.5.1: + resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 + '@jest/environment': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 '@types/node': 20.8.4 chalk: 4.1.2 co: 4.6.0 - dedent: 1.5.1 + dedent: 0.7.0 + expect: 27.5.1 + is-generator-fn: 2.1.0 + jest-each: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + slash: 3.0.0 + stack-utils: 2.0.6 + throat: 6.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.8.4 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.5.1 is-generator-fn: 2.1.0 jest-each: 29.7.0 jest-matcher-utils: 29.7.0 @@ -16193,6 +18434,36 @@ packages: - babel-plugin-macros - supports-color + /jest-cli@27.5.1(ts-node@10.9.1): + resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1(ts-node@10.9.1) + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 27.5.1(ts-node@10.9.1) + jest-util: 27.5.1 + jest-validate: 27.5.1 + prompts: 2.4.2 + yargs: 16.2.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: false + /jest-cli@29.7.0(@types/node@20.8.4)(ts-node@10.9.1): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16220,6 +18491,47 @@ packages: - supports-color - ts-node + /jest-config@27.5.1(ts-node@10.9.1): + resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + dependencies: + '@babel/core': 7.23.2 + '@jest/test-sequencer': 27.5.1 + '@jest/types': 27.5.1 + babel-jest: 27.5.1(@babel/core@7.23.2) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-get-type: 27.5.1 + jest-jasmine2: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runner: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 27.5.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.1(@types/node@20.8.4)(typescript@5.2.2) + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: false + /jest-config@29.7.0(@types/node@20.8.4)(ts-node@10.9.1): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16260,6 +18572,16 @@ packages: - babel-plugin-macros - supports-color + /jest-diff@27.5.1: + resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: false + /jest-diff@28.1.3: resolution: {integrity: sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -16288,12 +18610,30 @@ packages: jest-get-type: 29.6.3 pretty-format: 29.7.0 + /jest-docblock@27.5.1: + resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + detect-newline: 3.1.0 + dev: false + /jest-docblock@29.7.0: resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: detect-newline: 3.1.0 + /jest-each@27.5.1: + resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + chalk: 4.1.2 + jest-get-type: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + dev: false + /jest-each@29.7.0: resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16304,6 +18644,24 @@ packages: jest-util: 29.7.0 pretty-format: 29.7.0 + /jest-environment-jsdom@27.5.1: + resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.8.4 + jest-mock: 27.5.1 + jest-util: 27.5.1 + jsdom: 16.7.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: false + /jest-environment-jsdom@29.6.2: resolution: {integrity: sha512-7oa/+266AAEgkzae8i1awNEfTfjwawWKLpiw2XesZmaoVVj9u9t8JOYx18cG29rbPNtkUlZ8V4b5Jb36y/VxoQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16349,6 +18707,18 @@ packages: - supports-color - utf-8-validate + /jest-environment-node@27.5.1: + resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.8.4 + jest-mock: 27.5.1 + jest-util: 27.5.1 + dev: false + /jest-environment-node@29.7.0: resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16366,6 +18736,11 @@ packages: chalk: 4.1.2 dev: false + /jest-get-type@27.5.1: + resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: false + /jest-get-type@28.0.2: resolution: {integrity: sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -16379,6 +18754,26 @@ packages: resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /jest-haste-map@27.5.1: + resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/graceful-fs': 4.1.6 + '@types/node': 20.8.4 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 27.5.1 + jest-serializer: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + dev: false + /jest-haste-map@29.6.2: resolution: {integrity: sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16416,6 +18811,39 @@ packages: optionalDependencies: fsevents: 2.3.3 + /jest-jasmine2@27.5.1: + resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/source-map': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.8.4 + chalk: 4.1.2 + co: 4.6.0 + expect: 27.5.1 + is-generator-fn: 2.1.0 + jest-each: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + throat: 6.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /jest-leak-detector@27.5.1: + resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: false + /jest-leak-detector@29.7.0: resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16423,6 +18851,16 @@ packages: jest-get-type: 29.6.3 pretty-format: 29.7.0 + /jest-matcher-utils@27.5.1: + resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: false + /jest-matcher-utils@28.1.3: resolution: {integrity: sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -16461,6 +18899,36 @@ packages: jest-get-type: 29.6.3 pretty-format: 29.7.0 + /jest-message-util@27.5.1: + resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/code-frame': 7.22.13 + '@jest/types': 27.5.1 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 27.5.1 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: false + + /jest-message-util@28.1.3: + resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@babel/code-frame': 7.22.13 + '@jest/types': 28.1.3 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 28.1.3 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: false + /jest-message-util@29.7.0: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16490,6 +18958,18 @@ packages: '@types/node': 20.8.4 jest-util: 29.7.0 + /jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 27.5.1 + dev: false + /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} @@ -16501,6 +18981,16 @@ packages: dependencies: jest-resolve: 29.7.0 + /jest-regex-util@27.5.1: + resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: false + + /jest-regex-util@28.0.2: + resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dev: false + /jest-regex-util@29.4.3: resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16510,6 +19000,17 @@ packages: resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /jest-resolve-dependencies@27.5.1: + resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + jest-regex-util: 27.5.1 + jest-snapshot: 27.5.1 + transitivePeerDependencies: + - supports-color + dev: false + /jest-resolve-dependencies@29.7.0: resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16519,6 +19020,22 @@ packages: transitivePeerDependencies: - supports-color + /jest-resolve@27.5.1: + resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-pnp-resolver: 1.2.3(jest-resolve@27.5.1) + jest-util: 27.5.1 + jest-validate: 27.5.1 + resolve: 1.22.4 + resolve.exports: 1.1.1 + slash: 3.0.0 + dev: false + /jest-resolve@29.7.0: resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16533,6 +19050,38 @@ packages: resolve.exports: 2.0.2 slash: 3.0.0 + /jest-runner@27.5.1: + resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.5.1 + '@jest/environment': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.8.4 + chalk: 4.1.2 + emittery: 0.8.1 + graceful-fs: 4.2.11 + jest-docblock: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-haste-map: 27.5.1 + jest-leak-detector: 27.5.1 + jest-message-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runtime: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + source-map-support: 0.5.21 + throat: 6.0.2 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: false + /jest-runner@29.7.0: resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16561,6 +19110,36 @@ packages: transitivePeerDependencies: - supports-color + /jest-runtime@27.5.1: + resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/globals': 27.5.1 + '@jest/source-map': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + cjs-module-lexer: 1.2.3 + collect-v8-coverage: 1.0.2 + execa: 5.1.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: false + /jest-runtime@29.7.0: resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16590,23 +19169,61 @@ packages: transitivePeerDependencies: - supports-color - /jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /jest-serializer@27.5.1: + resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/node': 20.8.4 + graceful-fs: 4.2.11 + dev: false + + /jest-snapshot@27.5.1: + resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@babel/core': 7.23.2 '@babel/generator': 7.23.0 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.2) + '@babel/traverse': 7.23.2 '@babel/types': 7.23.0 - '@jest/expect-utils': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__traverse': 7.20.1 + '@types/prettier': 2.7.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) chalk: 4.1.2 - expect: 29.7.0 + expect: 27.5.1 graceful-fs: 4.2.11 - jest-diff: 29.7.0 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + jest-haste-map: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-util: 27.5.1 + natural-compare: 1.4.0 + pretty-format: 27.5.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: false + + /jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.23.2 + '@babel/generator': 7.23.0 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.2) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.2) + '@babel/types': 7.23.0 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.2) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 29.7.0 jest-get-type: 29.6.3 jest-matcher-utils: 29.7.0 jest-message-util: 29.7.0 @@ -16620,6 +19237,30 @@ packages: /jest-transform-stub@2.0.0: resolution: {integrity: sha512-lspHaCRx/mBbnm3h4uMMS3R5aZzMwyNpNIJLXj4cEsV0mIUtS4IjYJLSoyjRCtnxb6RIGJ4NL2quZzfIeNhbkg==} + /jest-util@27.5.1: + resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 20.8.4 + chalk: 4.1.2 + ci-info: 3.8.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: false + + /jest-util@28.1.3: + resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.3 + '@types/node': 20.8.4 + chalk: 4.1.2 + ci-info: 3.8.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: false + /jest-util@29.6.2: resolution: {integrity: sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16642,6 +19283,18 @@ packages: graceful-fs: 4.2.11 picomatch: 2.3.1 + /jest-validate@27.5.1: + resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 27.5.1 + leven: 3.1.0 + pretty-format: 27.5.1 + dev: false + /jest-validate@29.7.0: resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16653,6 +19306,49 @@ packages: leven: 3.1.0 pretty-format: 29.7.0 + /jest-watch-typeahead@1.1.0(jest@27.5.1): + resolution: {integrity: sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + jest: ^27.0.0 || ^28.0.0 + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + jest: 27.5.1(ts-node@10.9.1) + jest-regex-util: 28.0.2 + jest-watcher: 28.1.3 + slash: 4.0.0 + string-length: 5.0.1 + strip-ansi: 7.1.0 + dev: false + + /jest-watcher@27.5.1: + resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.8.4 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + jest-util: 27.5.1 + string-length: 4.0.2 + dev: false + + /jest-watcher@28.1.3: + resolution: {integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/test-result': 28.1.3 + '@jest/types': 28.1.3 + '@types/node': 20.8.4 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.10.2 + jest-util: 28.1.3 + string-length: 4.0.2 + dev: false + /jest-watcher@29.7.0: resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16666,9 +19362,14 @@ packages: jest-util: 29.7.0 string-length: 4.0.2 - /jest-webextension-mock@3.8.9: - resolution: {integrity: sha512-PglflLBEhqAtfKOmwEcP2iV2YdQK3Xwa7e/SELIK/4+y1NiKSJnba7DdPe32HavHJCJwuL8bpVwFrxGZFD2m+A==} - dev: true + /jest-worker@26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 20.8.4 + merge-stream: 2.0.0 + supports-color: 7.2.0 + dev: false /jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} @@ -16677,7 +19378,15 @@ packages: '@types/node': 20.8.4 merge-stream: 2.0.0 supports-color: 8.1.1 - dev: true + + /jest-worker@28.1.3: + resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@types/node': 20.8.4 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: false /jest-worker@29.6.2: resolution: {integrity: sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==} @@ -16698,6 +19407,27 @@ packages: merge-stream: 2.0.0 supports-color: 8.1.1 + /jest@27.5.1(ts-node@10.9.1): + resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1(ts-node@10.9.1) + import-local: 3.1.0 + jest-cli: 27.5.1(ts-node@10.9.1) + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: false + /jest@29.7.0(@types/node@20.8.4)(ts-node@10.9.1): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -16721,7 +19451,6 @@ packages: /jiti@1.19.1: resolution: {integrity: sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==} hasBin: true - dev: true /jose@4.14.4: resolution: {integrity: sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==} @@ -16798,6 +19527,48 @@ packages: - supports-color dev: true + /jsdom@16.7.0: + resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} + engines: {node: '>=10'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 8.10.0 + acorn-globals: 6.0.0 + cssom: 0.4.4 + cssstyle: 2.3.0 + data-urls: 2.0.0 + decimal.js: 10.4.3 + domexception: 2.0.1 + escodegen: 2.1.0 + form-data: 3.0.1 + html-encoding-sniffer: 2.0.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.7 + parse5: 6.0.1 + saxes: 5.0.1 + symbol-tree: 3.2.4 + tough-cookie: 4.1.3 + w3c-hr-time: 1.0.2 + w3c-xmlserializer: 2.0.0 + webidl-conversions: 6.1.0 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + ws: 7.5.9 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + /jsdom@20.0.3: resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} engines: {node: '>=14'} @@ -16841,7 +19612,6 @@ packages: /jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true - dev: true /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} @@ -16867,15 +19637,16 @@ packages: /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true + + /json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: false /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true /json-stable-stringify@1.0.2: resolution: {integrity: sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==} @@ -16913,6 +19684,19 @@ packages: resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} dev: true + /jsonpath@1.1.1: + resolution: {integrity: sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==} + dependencies: + esprima: 1.2.2 + static-eval: 2.0.2 + underscore: 1.12.1 + dev: false + + /jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + dev: false + /jsonwebtoken@9.0.2: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} @@ -16937,7 +19721,6 @@ packages: array.prototype.flat: 1.3.1 object.assign: 4.1.4 object.values: 1.1.6 - dev: true /jszip@3.10.1: resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} @@ -16975,15 +19758,25 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + /klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + dev: false + /language-subtag-registry@0.3.22: resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} - dev: true /language-tags@1.0.5: resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} dependencies: language-subtag-registry: 0.3.22 - dev: true + + /launch-editor@2.6.1: + resolution: {integrity: sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==} + dependencies: + picocolors: 1.0.0 + shell-quote: 1.8.1 + dev: false /lazy-universal-dotenv@4.0.0: resolution: {integrity: sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==} @@ -16998,13 +19791,20 @@ packages: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} + /levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + dev: false + /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true /lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} @@ -17015,7 +19815,6 @@ packages: /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} - dev: true /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -17109,7 +19908,6 @@ packages: /loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} - dev: true /loader-utils@2.0.4: resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} @@ -17118,7 +19916,11 @@ packages: big.js: 5.2.2 emojis-list: 3.0.0 json5: 2.2.3 - dev: true + + /loader-utils@3.2.1: + resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} + engines: {node: '>= 12.13.0'} + dev: false /loadjs@4.2.0: resolution: {integrity: sha512-AgQGZisAlTPbTEzrHPb6q+NYBMD+DP9uvGSIjSUM5uG+0jG15cb8axWpxuOIqrmQjn6scaaH8JwloiP27b2KXA==} @@ -17130,7 +19932,6 @@ packages: dependencies: p-locate: 3.0.0 path-exists: 3.0.0 - dev: true /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} @@ -17143,7 +19944,6 @@ packages: engines: {node: '>=10'} dependencies: p-locate: 5.0.0 - dev: true /locate-path@7.2.0: resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} @@ -17209,12 +20009,15 @@ packages: /lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - dev: true /lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} dev: true + /lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: false + /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -17270,7 +20073,6 @@ packages: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: tslib: 2.6.1 - dev: true /lowlight@1.20.0: resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} @@ -17304,6 +20106,12 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: false + /magic-string@0.26.7: resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} engines: {node: '>=12'} @@ -17338,7 +20146,6 @@ packages: engines: {node: '>=8'} dependencies: semver: 7.5.4 - dev: true /make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} @@ -17600,12 +20407,20 @@ packages: '@types/mdast': 3.0.12 dev: false + /mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + dev: false + /mdn-data@2.0.28: resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} /mdn-data@2.0.30: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + /mdn-data@2.0.4: + resolution: {integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==} + dev: false + /mdurl@1.0.1: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} dev: false @@ -17613,14 +20428,12 @@ packages: /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} - dev: true /memfs@3.5.3: resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} dependencies: fs-monkey: 1.0.4 - dev: true /memoizerific@1.11.3: resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} @@ -17651,7 +20464,6 @@ packages: /merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - dev: true /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -17675,7 +20487,6 @@ packages: /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - dev: true /micromark-core-commonmark@1.1.0: resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} @@ -18032,7 +20843,6 @@ packages: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} hasBin: true - dev: true /mime@2.6.0: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} @@ -18057,6 +20867,16 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} + /mini-css-extract-plugin@2.7.7(webpack@5.88.2): + resolution: {integrity: sha512-+0n11YGyRavUR3IlaOzJ0/4Il1avMvJ1VJfhWfCn24ITQXhRr1gghbhhrda6tgtNcpZaWKdSuwKq20Jb7fnlyw==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + schema-utils: 4.2.0 + webpack: 5.88.2(esbuild@0.19.5) + dev: false + /minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -18080,7 +20900,6 @@ packages: engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 - dev: true /minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} @@ -18195,6 +21014,14 @@ packages: - supports-color dev: true + /multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + dependencies: + dns-packet: 5.6.1 + thunky: 1.1.0 + dev: false + /mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} dev: true @@ -18205,7 +21032,6 @@ packages: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - dev: true /nanoclone@0.2.1: resolution: {integrity: sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==} @@ -18224,13 +21050,16 @@ packages: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} dev: false + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: false + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} - dev: true /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -18319,7 +21148,6 @@ packages: dependencies: lower-case: 2.0.2 tslib: 2.6.1 - dev: true /node-abi@3.45.0: resolution: {integrity: sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==} @@ -18369,12 +21197,21 @@ packages: dependencies: whatwg-url: 5.0.0 + /node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + dev: false + /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} /node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: false + /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: @@ -18395,6 +21232,16 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: false + + /normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + dev: false + /npm-path@2.0.4: resolution: {integrity: sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==} engines: {node: '>=0.8'} @@ -18455,6 +21302,11 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: false + /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} @@ -18485,7 +21337,6 @@ packages: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 - dev: true /object.fromentries@2.0.6: resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} @@ -18494,7 +21345,17 @@ packages: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 - dev: true + + /object.getownpropertydescriptors@2.1.7: + resolution: {integrity: sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==} + engines: {node: '>= 0.8'} + dependencies: + array.prototype.reduce: 1.0.6 + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + safe-array-concat: 1.0.0 + dev: false /object.groupby@1.0.0: resolution: {integrity: sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==} @@ -18503,14 +21364,12 @@ packages: define-properties: 1.2.0 es-abstract: 1.22.1 get-intrinsic: 1.2.1 - dev: true /object.hasown@1.1.2: resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} dependencies: define-properties: 1.2.0 es-abstract: 1.22.1 - dev: true /object.values@1.1.6: resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} @@ -18519,12 +21378,15 @@ packages: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 - dev: true /objectorarray@1.0.5: resolution: {integrity: sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==} dev: true + /obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + dev: false + /octokit@3.1.2: resolution: {integrity: sha512-MG5qmrTL5y8KYwFgE1A4JWmgfQBaIETE/lOlfwNYx1QOtCQHGVxkRJmdUJltFc1HVn73d61TlMhMyNTOtMl+ng==} engines: {node: '>= 18'} @@ -18546,12 +21408,10 @@ packages: engines: {node: '>= 0.8'} dependencies: ee-first: 1.1.1 - dev: true /on-headers@1.0.2: resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} engines: {node: '>= 0.8'} - dev: true /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -18577,7 +21437,6 @@ packages: define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 - dev: true /open@9.1.0: resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} @@ -18594,6 +21453,18 @@ packages: hasBin: true dev: true + /optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: /@aashutoshrathi/word-wrap@1.2.6 + dev: false + /optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -18604,7 +21475,6 @@ packages: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true /ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} @@ -18665,7 +21535,6 @@ packages: engines: {node: '>=6'} dependencies: p-limit: 2.3.0 - dev: true /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} @@ -18678,7 +21547,6 @@ packages: engines: {node: '>=10'} dependencies: p-limit: 3.1.0 - dev: true /p-locate@6.0.0: resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} @@ -18699,6 +21567,14 @@ packages: aggregate-error: 3.1.0 dev: true + /p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + dev: false + /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -18716,14 +21592,12 @@ packages: dependencies: dot-case: 3.0.4 tslib: 2.6.1 - dev: true /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} dependencies: callsites: 3.1.0 - dev: true /parse-entities@2.0.0: resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} @@ -18781,7 +21655,11 @@ packages: parse5: 7.1.2 dev: true - /parse5@7.1.2: + /parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: false + + /parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: entities: 4.5.0 @@ -18789,14 +21667,12 @@ packages: /parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - dev: true /pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: no-case: 3.0.4 tslib: 2.6.1 - dev: true /path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -18812,7 +21688,6 @@ packages: /path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} - dev: true /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} @@ -18864,7 +21739,6 @@ packages: /path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - dev: true /path-to-regexp@6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} @@ -18897,6 +21771,10 @@ packages: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} dev: true + /performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + dev: false + /periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} dependencies: @@ -18924,6 +21802,11 @@ packages: hasBin: true dev: true + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: false + /pify@3.0.0: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} @@ -18965,6 +21848,13 @@ packages: find-up: 6.3.0 dev: true + /pkg-up@3.1.0: + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} + dependencies: + find-up: 3.0.0 + dev: false + /playwright-core@1.39.0: resolution: {integrity: sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==} engines: {node: '>=16'} @@ -18991,95 +21881,760 @@ packages: react: optional: true dependencies: - plyr: 3.7.8 - react: 18.2.0 - react-aptor: 2.0.0(react@18.2.0) + plyr: 3.7.8 + react: 18.2.0 + react-aptor: 2.0.0(react@18.2.0) + dev: false + + /plyr@3.7.8: + resolution: {integrity: sha512-yG/EHDobwbB/uP+4Bm6eUpJ93f8xxHjjk2dYcD1Oqpe1EcuQl5tzzw9Oq+uVAzd2lkM11qZfydSiyIpiB8pgdA==} + dependencies: + core-js: 3.32.0 + custom-event-polyfill: 1.0.7 + loadjs: 4.2.0 + rangetouch: 2.0.1 + url-polyfill: 1.1.12 + dev: false + + /polished@4.2.2: + resolution: {integrity: sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==} + engines: {node: '>=10'} + dependencies: + '@babel/runtime': 7.22.6 + dev: true + + /portfinder@1.0.32: + resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} + engines: {node: '>= 0.12.0'} + dependencies: + async: 2.6.4 + debug: 3.2.7 + mkdirp: 0.5.6 + transitivePeerDependencies: + - supports-color + + /postcss-attribute-case-insensitive@5.0.2(postcss@8.4.32): + resolution: {integrity: sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + dev: false + + /postcss-browser-comments@4.0.0(browserslist@4.21.10)(postcss@8.4.32): + resolution: {integrity: sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==} + engines: {node: '>=8'} + peerDependencies: + browserslist: '>=4' + postcss: '>=8.4.31' + dependencies: + browserslist: 4.21.10 + postcss: 8.4.32 + dev: false + + /postcss-calc@8.2.4(postcss@8.4.32): + resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-clamp@4.1.0(postcss@8.4.32): + resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} + engines: {node: '>=7.6.0'} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-color-functional-notation@4.2.4(postcss@8.4.32): + resolution: {integrity: sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-color-hex-alpha@8.0.4(postcss@8.4.32): + resolution: {integrity: sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-color-rebeccapurple@7.1.1(postcss@8.4.32): + resolution: {integrity: sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-colormin@5.3.1(postcss@8.4.32): + resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + browserslist: 4.21.10 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-convert-values@5.1.3(postcss@8.4.32): + resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + browserslist: 4.21.10 + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-custom-media@8.0.2(postcss@8.4.32): + resolution: {integrity: sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-custom-properties@12.1.11(postcss@8.4.32): + resolution: {integrity: sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-custom-selectors@6.0.3(postcss@8.4.32): + resolution: {integrity: sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + dev: false + + /postcss-dir-pseudo-class@6.0.5(postcss@8.4.32): + resolution: {integrity: sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + dev: false + + /postcss-discard-comments@5.1.2(postcss@8.4.32): + resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + dev: false + + /postcss-discard-duplicates@5.1.0(postcss@8.4.32): + resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + dev: false + + /postcss-discard-empty@5.1.1(postcss@8.4.32): + resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + dev: false + + /postcss-discard-overridden@5.1.0(postcss@8.4.32): + resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + dev: false + + /postcss-double-position-gradients@3.1.2(postcss@8.4.32): + resolution: {integrity: sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.32) + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-env-function@4.0.6(postcss@8.4.32): + resolution: {integrity: sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-flexbugs-fixes@5.0.2(postcss@8.4.32): + resolution: {integrity: sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + dev: false + + /postcss-focus-visible@6.0.4(postcss@8.4.32): + resolution: {integrity: sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + dev: false + + /postcss-focus-within@5.0.4(postcss@8.4.32): + resolution: {integrity: sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + dev: false + + /postcss-font-variant@5.0.0(postcss@8.4.32): + resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + dev: false + + /postcss-gap-properties@3.0.5(postcss@8.4.32): + resolution: {integrity: sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + dev: false + + /postcss-image-set-function@4.0.7(postcss@8.4.32): + resolution: {integrity: sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-import@15.1.0(postcss@8.4.32): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.4 + dev: false + + /postcss-initial@4.0.1(postcss@8.4.32): + resolution: {integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + dev: false + + /postcss-js@4.0.1(postcss@8.4.32): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.32 + dev: false + + /postcss-lab-function@4.2.1(postcss@8.4.32): + resolution: {integrity: sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.32) + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-load-config@4.0.1(postcss@8.4.32)(ts-node@10.9.1): + resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.4.31' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.1.0 + postcss: 8.4.32 + ts-node: 10.9.1(@types/node@20.8.4)(typescript@5.2.2) + yaml: 2.3.1 + + /postcss-loader@6.2.1(postcss@8.4.32)(webpack@5.88.2): + resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==} + engines: {node: '>= 12.13.0'} + peerDependencies: + postcss: '>=8.4.31' + webpack: ^5.0.0 + dependencies: + cosmiconfig: 7.1.0 + klona: 2.0.6 + postcss: 8.4.32 + semver: 7.5.4 + webpack: 5.88.2(esbuild@0.19.5) + dev: false + + /postcss-logical@5.0.4(postcss@8.4.32): + resolution: {integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + dev: false + + /postcss-media-minmax@5.0.0(postcss@8.4.32): + resolution: {integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + dev: false + + /postcss-merge-longhand@5.1.7(postcss@8.4.32): + resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + stylehacks: 5.1.1(postcss@8.4.32) + dev: false + + /postcss-merge-rules@5.1.4(postcss@8.4.32): + resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + browserslist: 4.21.10 + caniuse-api: 3.0.0 + cssnano-utils: 3.1.0(postcss@8.4.32) + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + dev: false + + /postcss-minify-font-values@5.1.0(postcss@8.4.32): + resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-minify-gradients@5.1.1(postcss@8.4.32): + resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + colord: 2.9.3 + cssnano-utils: 3.1.0(postcss@8.4.32) + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-minify-params@5.1.4(postcss@8.4.32): + resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + browserslist: 4.21.10 + cssnano-utils: 3.1.0(postcss@8.4.32) + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-minify-selectors@5.2.1(postcss@8.4.32): + resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + dev: false + + /postcss-modules-extract-imports@3.0.0(postcss@8.4.32): + resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + + /postcss-modules-local-by-default@4.0.3(postcss@8.4.32): + resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + icss-utils: 5.1.0(postcss@8.4.32) + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + postcss-value-parser: 4.2.0 + + /postcss-modules-scope@3.0.0(postcss@8.4.32): + resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + + /postcss-modules-values@4.0.0(postcss@8.4.32): + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + icss-utils: 5.1.0(postcss@8.4.32) + postcss: 8.4.32 + + /postcss-nested@6.0.1(postcss@8.4.32): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + dev: false + + /postcss-nesting@10.2.0(postcss@8.4.32): + resolution: {integrity: sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.13) + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + dev: false + + /postcss-normalize-charset@5.1.0(postcss@8.4.32): + resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + dev: false + + /postcss-normalize-display-values@5.1.0(postcss@8.4.32): + resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-positions@5.1.1(postcss@8.4.32): + resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-repeat-style@5.1.1(postcss@8.4.32): + resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-string@5.1.0(postcss@8.4.32): + resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-timing-functions@5.1.0(postcss@8.4.32): + resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-unicode@5.1.1(postcss@8.4.32): + resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + browserslist: 4.21.10 + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-url@5.1.0(postcss@8.4.32): + resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + normalize-url: 6.1.0 + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-whitespace@5.1.1(postcss@8.4.32): + resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize@10.0.1(browserslist@4.21.10)(postcss@8.4.32): + resolution: {integrity: sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==} + engines: {node: '>= 12'} + peerDependencies: + browserslist: '>= 4' + postcss: '>=8.4.31' + dependencies: + '@csstools/normalize.css': 12.1.1 + browserslist: 4.21.10 + postcss: 8.4.32 + postcss-browser-comments: 4.0.0(browserslist@4.21.10)(postcss@8.4.32) + sanitize.css: 13.0.0 + dev: false + + /postcss-opacity-percentage@1.1.3(postcss@8.4.32): + resolution: {integrity: sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + dev: false + + /postcss-ordered-values@5.1.3(postcss@8.4.32): + resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + cssnano-utils: 3.1.0(postcss@8.4.32) + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-overflow-shorthand@3.0.4(postcss@8.4.32): + resolution: {integrity: sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 dev: false - /plyr@3.7.8: - resolution: {integrity: sha512-yG/EHDobwbB/uP+4Bm6eUpJ93f8xxHjjk2dYcD1Oqpe1EcuQl5tzzw9Oq+uVAzd2lkM11qZfydSiyIpiB8pgdA==} + /postcss-page-break@3.0.4(postcss@8.4.32): + resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} + peerDependencies: + postcss: '>=8.4.31' dependencies: - core-js: 3.32.0 - custom-event-polyfill: 1.0.7 - loadjs: 4.2.0 - rangetouch: 2.0.1 - url-polyfill: 1.1.12 + postcss: 8.4.32 dev: false - /polished@4.2.2: - resolution: {integrity: sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==} - engines: {node: '>=10'} + /postcss-place@7.0.5(postcss@8.4.32): + resolution: {integrity: sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' dependencies: - '@babel/runtime': 7.22.6 - dev: true + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false - /portfinder@1.0.32: - resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} - engines: {node: '>= 0.12.0'} + /postcss-preset-env@7.8.3(postcss@8.4.32): + resolution: {integrity: sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==} + engines: {node: ^12 || ^14 || >=16} + peerDependencies: + postcss: '>=8.4.31' dependencies: - async: 2.6.4 - debug: 3.2.7 - mkdirp: 0.5.6 - transitivePeerDependencies: - - supports-color + '@csstools/postcss-cascade-layers': 1.1.1(postcss@8.4.32) + '@csstools/postcss-color-function': 1.1.1(postcss@8.4.32) + '@csstools/postcss-font-format-keywords': 1.0.1(postcss@8.4.32) + '@csstools/postcss-hwb-function': 1.0.2(postcss@8.4.32) + '@csstools/postcss-ic-unit': 1.0.1(postcss@8.4.32) + '@csstools/postcss-is-pseudo-class': 2.0.7(postcss@8.4.32) + '@csstools/postcss-nested-calc': 1.0.0(postcss@8.4.32) + '@csstools/postcss-normalize-display-values': 1.0.1(postcss@8.4.32) + '@csstools/postcss-oklab-function': 1.1.1(postcss@8.4.32) + '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.32) + '@csstools/postcss-stepped-value-functions': 1.0.1(postcss@8.4.32) + '@csstools/postcss-text-decoration-shorthand': 1.0.0(postcss@8.4.32) + '@csstools/postcss-trigonometric-functions': 1.0.2(postcss@8.4.32) + '@csstools/postcss-unset-value': 1.0.2(postcss@8.4.32) + autoprefixer: 10.4.17(postcss@8.4.32) + browserslist: 4.21.10 + css-blank-pseudo: 3.0.3(postcss@8.4.32) + css-has-pseudo: 3.0.4(postcss@8.4.32) + css-prefers-color-scheme: 6.0.3(postcss@8.4.32) + cssdb: 7.10.0 + postcss: 8.4.32 + postcss-attribute-case-insensitive: 5.0.2(postcss@8.4.32) + postcss-clamp: 4.1.0(postcss@8.4.32) + postcss-color-functional-notation: 4.2.4(postcss@8.4.32) + postcss-color-hex-alpha: 8.0.4(postcss@8.4.32) + postcss-color-rebeccapurple: 7.1.1(postcss@8.4.32) + postcss-custom-media: 8.0.2(postcss@8.4.32) + postcss-custom-properties: 12.1.11(postcss@8.4.32) + postcss-custom-selectors: 6.0.3(postcss@8.4.32) + postcss-dir-pseudo-class: 6.0.5(postcss@8.4.32) + postcss-double-position-gradients: 3.1.2(postcss@8.4.32) + postcss-env-function: 4.0.6(postcss@8.4.32) + postcss-focus-visible: 6.0.4(postcss@8.4.32) + postcss-focus-within: 5.0.4(postcss@8.4.32) + postcss-font-variant: 5.0.0(postcss@8.4.32) + postcss-gap-properties: 3.0.5(postcss@8.4.32) + postcss-image-set-function: 4.0.7(postcss@8.4.32) + postcss-initial: 4.0.1(postcss@8.4.32) + postcss-lab-function: 4.2.1(postcss@8.4.32) + postcss-logical: 5.0.4(postcss@8.4.32) + postcss-media-minmax: 5.0.0(postcss@8.4.32) + postcss-nesting: 10.2.0(postcss@8.4.32) + postcss-opacity-percentage: 1.1.3(postcss@8.4.32) + postcss-overflow-shorthand: 3.0.4(postcss@8.4.32) + postcss-page-break: 3.0.4(postcss@8.4.32) + postcss-place: 7.0.5(postcss@8.4.32) + postcss-pseudo-class-any-link: 7.1.6(postcss@8.4.32) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.32) + postcss-selector-not: 6.0.1(postcss@8.4.32) + postcss-value-parser: 4.2.0 + dev: false - /postcss-load-config@4.0.1(ts-node@10.9.1): - resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} - engines: {node: '>= 14'} + /postcss-pseudo-class-any-link@7.1.6(postcss@8.4.32): + resolution: {integrity: sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: '>=8.4.31' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true dependencies: - lilconfig: 2.1.0 - ts-node: 10.9.1(@types/node@20.8.4)(typescript@5.2.2) - yaml: 2.3.1 - dev: true + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + dev: false - /postcss-modules-extract-imports@3.0.0(postcss@8.4.31): - resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} - engines: {node: ^10 || ^12 || >= 14} + /postcss-reduce-initial@5.1.2(postcss@8.4.32): + resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: '>=8.4.31' dependencies: - postcss: 8.4.31 - dev: true + browserslist: 4.21.10 + caniuse-api: 3.0.0 + postcss: 8.4.32 + dev: false - /postcss-modules-local-by-default@4.0.3(postcss@8.4.31): - resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==} - engines: {node: ^10 || ^12 || >= 14} + /postcss-reduce-transforms@5.1.0(postcss@8.4.32): + resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: '>=8.4.31' dependencies: - icss-utils: 5.1.0(postcss@8.4.31) - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 + postcss: 8.4.32 postcss-value-parser: 4.2.0 - dev: true + dev: false - /postcss-modules-scope@3.0.0(postcss@8.4.31): - resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} - engines: {node: ^10 || ^12 || >= 14} + /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.32): + resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} peerDependencies: postcss: '>=8.4.31' dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.13 - dev: true + postcss: 8.4.32 + dev: false - /postcss-modules-values@4.0.0(postcss@8.4.31): - resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} - engines: {node: ^10 || ^12 || >= 14} + /postcss-selector-not@6.0.1(postcss@8.4.32): + resolution: {integrity: sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: '>=8.4.31' dependencies: - icss-utils: 5.1.0(postcss@8.4.31) - postcss: 8.4.31 - dev: true + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + dev: false /postcss-selector-parser@6.0.13: resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} @@ -19087,11 +22642,30 @@ packages: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - dev: true + + /postcss-svgo@5.1.0(postcss@8.4.32): + resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + svgo: 2.8.0 + dev: false + + /postcss-unique-selectors@5.1.1(postcss@8.4.32): + resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + dev: false /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: true /postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} @@ -19138,10 +22712,14 @@ packages: which-pm: 2.0.0 dev: true + /prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + dev: false + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - dev: true /prettier-linter-helpers@1.0.0: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} @@ -19166,12 +22744,16 @@ packages: engines: {node: '>=14'} hasBin: true + /pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + dev: false + /pretty-error@4.0.0: resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} dependencies: lodash: 4.17.21 renderkid: 3.0.0 - dev: true /pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} @@ -19222,7 +22804,6 @@ packages: /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true /process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} @@ -19239,6 +22820,12 @@ packages: dependencies: asap: 2.0.6 + /promise@8.3.0: + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + dependencies: + asap: 2.0.6 + dev: false + /prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -19271,7 +22858,6 @@ packages: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 - dev: true /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -19353,7 +22939,6 @@ packages: /q@1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - dev: true /qr.js@0.0.0: resolution: {integrity: sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ==} @@ -19364,7 +22949,6 @@ packages: engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 - dev: true /qs@6.11.2: resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} @@ -19387,6 +22971,12 @@ packages: engines: {node: '>=8'} dev: true + /raf@3.4.1: + resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} + dependencies: + performance-now: 2.1.0 + dev: false + /ramda@0.29.0: resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} @@ -19394,12 +22984,10 @@ packages: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 - dev: true /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - dev: true /rangetouch@2.0.1: resolution: {integrity: sha512-sln+pNSc8NGaHoLzwNBssFSf/rSYkqeBXzX1AtJlkJiUaVSJSbRAWJk+4omsXkN+EJalzkZhWQ3th1m0FpR5xA==} @@ -19413,7 +23001,6 @@ packages: http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 - dev: true /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} @@ -19425,6 +23012,18 @@ packages: strip-json-comments: 2.0.1 dev: false + /react-app-polyfill@3.0.0: + resolution: {integrity: sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==} + engines: {node: '>=14'} + dependencies: + core-js: 3.32.0 + object-assign: 4.1.1 + promise: 8.3.0 + raf: 3.4.1 + regenerator-runtime: 0.13.11 + whatwg-fetch: 3.6.20 + dev: false + /react-aptor@2.0.0(react@18.2.0): resolution: {integrity: sha512-YnCayokuhAwmBBP4Oc0bbT2l6ApfsjbY3DEEVUddIKZEBlGl1npzjHHzWnSqWuboSbMZvRqUM01Io9yiIp1wcg==} engines: {node: '>=12.7.0'} @@ -19537,6 +23136,48 @@ packages: react: 18.2.0 dev: false + /react-dev-utils@12.0.1(eslint@8.51.0)(typescript@4.9.5)(webpack@5.88.2): + resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=2.7' + webpack: '>=4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@babel/code-frame': 7.22.13 + address: 1.2.2 + browserslist: 4.21.10 + chalk: 4.1.2 + cross-spawn: 7.0.3 + detect-port-alt: 1.1.6 + escape-string-regexp: 4.0.0 + filesize: 8.0.7 + find-up: 5.0.0 + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.51.0)(typescript@4.9.5)(webpack@5.88.2) + global-modules: 2.0.0 + globby: 11.1.0 + gzip-size: 6.0.0 + immer: 9.0.21 + is-root: 2.1.0 + loader-utils: 3.2.1 + open: 8.4.2 + pkg-up: 3.1.0 + prompts: 2.4.2 + react-error-overlay: 6.0.11 + recursive-readdir: 2.2.3 + shell-quote: 1.8.1 + strip-ansi: 6.0.1 + text-table: 0.2.0 + typescript: 4.9.5 + webpack: 5.88.2(esbuild@0.19.5) + transitivePeerDependencies: + - eslint + - supports-color + - vue-template-compiler + dev: false + /react-docgen-typescript@2.2.2(typescript@5.2.2): resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==} peerDependencies: @@ -19613,6 +23254,22 @@ packages: react-is: 18.1.0 dev: true + /react-error-boundary@4.0.12(react@18.2.0): + resolution: {integrity: sha512-kJdxdEYlb7CPC1A0SeUY38cHpjuu6UkvzKiAmqmOFL21VRfMhOcWxTCBgLVCO0VEMh9JhFNcVaXlV4/BTpiwOA==} + peerDependencies: + react: '*' + peerDependenciesMeta: + react: + optional: true + dependencies: + '@babel/runtime': 7.22.6 + react: 18.2.0 + dev: false + + /react-error-overlay@6.0.11: + resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==} + dev: false + /react-fast-compare@3.2.2: resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} dev: false @@ -19761,7 +23418,6 @@ packages: /react-refresh@0.11.0: resolution: {integrity: sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==} engines: {node: '>=0.10.0'} - dev: true /react-refresh@0.13.0: resolution: {integrity: sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==} @@ -19855,6 +23511,105 @@ packages: '@remix-run/router': 1.9.0 react: 18.2.0 + /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(esbuild@0.19.5)(eslint@8.51.0)(react@18.2.0)(ts-node@10.9.1)(typescript@4.9.5): + resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==} + engines: {node: '>=14.0.0'} + hasBin: true + peerDependencies: + eslint: '*' + react: '*' + typescript: ^3.2.1 || ^4 + peerDependenciesMeta: + react: + optional: true + typescript: + optional: true + dependencies: + '@babel/core': 7.23.2 + '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.11.0)(webpack-dev-server@4.15.1)(webpack@5.88.2) + '@svgr/webpack': 5.5.0 + babel-jest: 27.5.1(@babel/core@7.23.2) + babel-loader: 8.3.0(@babel/core@7.23.2)(webpack@5.88.2) + babel-plugin-named-asset-import: 0.3.8(@babel/core@7.23.2) + babel-preset-react-app: 10.0.1 + bfj: 7.1.0 + browserslist: 4.21.10 + camelcase: 6.3.0 + case-sensitive-paths-webpack-plugin: 2.4.0 + css-loader: 6.8.1(webpack@5.88.2) + css-minimizer-webpack-plugin: 3.4.1(esbuild@0.19.5)(webpack@5.88.2) + dotenv: 10.0.0 + dotenv-expand: 5.1.0 + eslint: 8.51.0 + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.22.5)(@babel/plugin-transform-react-jsx@7.22.5)(eslint@8.51.0)(jest@27.5.1)(typescript@4.9.5) + eslint-webpack-plugin: 3.2.0(eslint@8.51.0)(webpack@5.88.2) + file-loader: 6.2.0(webpack@5.88.2) + fs-extra: 10.1.0 + html-webpack-plugin: 5.5.3(webpack@5.88.2) + identity-obj-proxy: 3.0.0 + jest: 27.5.1(ts-node@10.9.1) + jest-resolve: 27.5.1 + jest-watch-typeahead: 1.1.0(jest@27.5.1) + mini-css-extract-plugin: 2.7.7(webpack@5.88.2) + postcss: 8.4.32 + postcss-flexbugs-fixes: 5.0.2(postcss@8.4.32) + postcss-loader: 6.2.1(postcss@8.4.32)(webpack@5.88.2) + postcss-normalize: 10.0.1(browserslist@4.21.10)(postcss@8.4.32) + postcss-preset-env: 7.8.3(postcss@8.4.32) + prompts: 2.4.2 + react: 18.2.0 + react-app-polyfill: 3.0.0 + react-dev-utils: 12.0.1(eslint@8.51.0)(typescript@4.9.5)(webpack@5.88.2) + react-refresh: 0.11.0 + resolve: 1.22.4 + resolve-url-loader: 4.0.0 + sass-loader: 12.6.0(webpack@5.88.2) + semver: 7.5.4 + source-map-loader: 3.0.2(webpack@5.88.2) + style-loader: 3.3.3(webpack@5.88.2) + tailwindcss: 3.4.1(ts-node@10.9.1) + terser-webpack-plugin: 5.3.9(esbuild@0.19.5)(webpack@5.88.2) + typescript: 4.9.5 + webpack: 5.88.2(esbuild@0.19.5) + webpack-dev-server: 4.15.1(webpack@5.88.2) + webpack-manifest-plugin: 4.1.1(webpack@5.88.2) + workbox-webpack-plugin: 6.6.0(webpack@5.88.2) + optionalDependencies: + fsevents: 2.3.3 + transitivePeerDependencies: + - '@babel/plugin-syntax-flow' + - '@babel/plugin-transform-react-jsx' + - '@parcel/css' + - '@swc/core' + - '@types/babel__core' + - '@types/webpack' + - bufferutil + - canvas + - clean-css + - csso + - debug + - esbuild + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - fibers + - node-notifier + - node-sass + - rework + - rework-visit + - sass + - sass-embedded + - sockjs-client + - supports-color + - ts-node + - type-fest + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + - webpack-hot-middleware + - webpack-plugin-serve + dev: false + /react-side-effect@2.1.2(react@18.2.0): resolution: {integrity: sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==} peerDependencies: @@ -19955,6 +23710,12 @@ packages: dependencies: loose-envify: 1.4.0 + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: false + /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -20003,7 +23764,6 @@ packages: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 - dev: true /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} @@ -20048,6 +23808,13 @@ packages: tslib: 2.6.1 dev: true + /recursive-readdir@2.2.3: + resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} + engines: {node: '>=6.0.0'} + dependencies: + minimatch: 3.1.2 + dev: false + /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -20065,7 +23832,6 @@ packages: get-intrinsic: 1.2.1 globalthis: 1.0.3 which-builtin-type: 1.1.3 - dev: true /refractor@3.6.0: resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} @@ -20079,11 +23845,9 @@ packages: engines: {node: '>=4'} dependencies: regenerate: 1.4.2 - dev: true /regenerate@1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - dev: true /regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} @@ -20092,7 +23856,10 @@ packages: resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} dependencies: '@babel/runtime': 7.22.6 - dev: true + + /regex-parser@2.3.0: + resolution: {integrity: sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==} + dev: false /regexp.prototype.flags@1.5.0: resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} @@ -20112,7 +23879,6 @@ packages: regjsparser: 0.9.1 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.1.0 - dev: true /registry-url@6.0.1: resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} @@ -20126,12 +23892,10 @@ packages: hasBin: true dependencies: jsesc: 0.5.0 - dev: true /relateurl@0.2.7: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} - dev: true /relay-runtime@12.0.0: resolution: {integrity: sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==} @@ -20250,7 +24014,6 @@ packages: htmlparser2: 6.1.0 lodash: 4.17.21 strip-ansi: 6.0.1 - dev: true /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} @@ -20259,7 +24022,6 @@ packages: /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - dev: true /require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} @@ -20286,7 +24048,6 @@ packages: /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - dev: true /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} @@ -20296,6 +24057,30 @@ packages: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} dev: true + /resolve-url-loader@4.0.0: + resolution: {integrity: sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==} + engines: {node: '>=8.9'} + peerDependencies: + rework: 1.0.1 + rework-visit: 1.0.0 + peerDependenciesMeta: + rework: + optional: true + rework-visit: + optional: true + dependencies: + adjust-sourcemap-loader: 4.0.0 + convert-source-map: 1.9.0 + loader-utils: 2.0.4 + postcss: 8.4.32 + source-map: 0.6.1 + dev: false + + /resolve.exports@1.1.1: + resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} + engines: {node: '>=10'} + dev: false + /resolve.exports@2.0.2: resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} engines: {node: '>=10'} @@ -20315,7 +24100,6 @@ packages: is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true /restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} @@ -20333,6 +24117,11 @@ packages: signal-exit: 3.0.7 dev: true + /retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + dev: false + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -20361,13 +24150,25 @@ packages: dependencies: glob: 7.2.3 + /rollup-plugin-terser@7.0.2(rollup@2.79.1): + resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser + peerDependencies: + rollup: ^2.0.0 + dependencies: + '@babel/code-frame': 7.22.13 + jest-worker: 26.6.2 + rollup: 2.79.1 + serialize-javascript: 4.0.0 + terser: 5.19.2 + dev: false + /rollup@2.79.1: resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} engines: {node: '>=10.0.0'} hasBin: true optionalDependencies: fsevents: 2.3.3 - dev: true /rollup@3.28.1: resolution: {integrity: sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==} @@ -20414,11 +24215,9 @@ packages: get-intrinsic: 1.2.1 has-symbols: 1.0.3 isarray: 2.0.5 - dev: true /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -20429,11 +24228,49 @@ packages: call-bind: 1.0.2 get-intrinsic: 1.2.1 is-regex: 1.1.4 - dev: true /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + /sanitize.css@13.0.0: + resolution: {integrity: sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==} + dev: false + + /sass-loader@12.6.0(webpack@5.88.2): + resolution: {integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + fibers: '>= 3.1.0' + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + sass: ^1.3.0 + sass-embedded: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + fibers: + optional: true + node-sass: + optional: true + sass: + optional: true + sass-embedded: + optional: true + dependencies: + klona: 2.0.6 + neo-async: 2.6.2 + webpack: 5.88.2(esbuild@0.19.5) + dev: false + + /sax@1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + dev: false + + /saxes@5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + dependencies: + xmlchars: 2.2.0 + dev: false + /saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} @@ -20445,6 +24282,24 @@ packages: dependencies: loose-envify: 1.4.0 + /schema-utils@2.7.0: + resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} + engines: {node: '>= 8.9.0'} + dependencies: + '@types/json-schema': 7.0.12 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: false + + /schema-utils@2.7.1: + resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} + engines: {node: '>= 8.9.0'} + dependencies: + '@types/json-schema': 7.0.12 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: false + /schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} @@ -20452,7 +24307,6 @@ packages: '@types/json-schema': 7.0.12 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true /schema-utils@4.2.0: resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} @@ -20462,7 +24316,6 @@ packages: ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) ajv-keywords: 5.1.0(ajv@8.12.0) - dev: true /scuid@1.1.0: resolution: {integrity: sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg==} @@ -20485,6 +24338,18 @@ packages: resolution: {integrity: sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==} dev: true + /select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + dev: false + + /selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + dependencies: + '@types/node-forge': 1.3.11 + node-forge: 1.3.1 + dev: false + /semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} @@ -20511,7 +24376,6 @@ packages: statuses: 2.0.1 transitivePeerDependencies: - supports-color - dev: true /sentence-case@3.0.4: resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} @@ -20521,11 +24385,31 @@ packages: upper-case-first: 2.0.2 dev: true + /serialize-javascript@4.0.0: + resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + dependencies: + randombytes: 2.1.0 + dev: false + /serialize-javascript@6.0.1: resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} dependencies: randombytes: 2.1.0 - dev: true + + /serve-index@1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + batch: 0.6.1 + debug: 4.3.4 + escape-html: 1.0.3 + http-errors: 1.6.3 + mime-types: 2.1.35 + parseurl: 1.3.3 + transitivePeerDependencies: + - supports-color + dev: false /serve-static@1.15.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} @@ -20537,7 +24421,6 @@ packages: send: 0.18.0 transitivePeerDependencies: - supports-color - dev: true /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -20550,9 +24433,12 @@ packages: /setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + /setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + dev: false + /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: true /shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} @@ -20561,6 +24447,10 @@ packages: kind-of: 6.0.3 dev: true + /shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + dev: true + /sharp@0.32.6: resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} engines: {node: '>=14.15.0'} @@ -20600,7 +24490,6 @@ packages: /shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: true /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} @@ -20703,10 +24592,34 @@ packages: tslib: 2.6.1 dev: true + /sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + dependencies: + faye-websocket: 0.11.4 + uuid: 8.3.2 + websocket-driver: 0.7.4 + dev: false + + /source-list-map@2.0.1: + resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} + dev: false + /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + /source-map-loader@3.0.2(webpack@5.88.2): + resolution: {integrity: sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + abab: 2.0.6 + iconv-lite: 0.6.3 + source-map-js: 1.0.2 + webpack: 5.88.2(esbuild@0.19.5) + dev: false + /source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} dependencies: @@ -20718,7 +24631,6 @@ packages: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} @@ -20733,12 +24645,10 @@ packages: engines: {node: '>= 8'} dependencies: whatwg-url: 7.1.0 - dev: true /sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead - dev: true /space-separated-tokens@1.1.5: resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} @@ -20776,6 +24686,32 @@ packages: resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} dev: true + /spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + dependencies: + debug: 4.3.4 + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 3.6.2 + wbuf: 1.7.3 + transitivePeerDependencies: + - supports-color + dev: false + + /spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + dependencies: + debug: 4.3.4 + handle-thing: 2.0.1 + http-deceiver: 1.2.7 + select-hose: 2.0.0 + spdy-transport: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: false + /sponge-case@1.0.1: resolution: {integrity: sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA==} dependencies: @@ -20785,6 +24721,11 @@ packages: /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + /stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + dev: false + /stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -20793,12 +24734,21 @@ packages: /stackframe@1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} - dev: true + + /static-eval@2.0.2: + resolution: {integrity: sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==} + dependencies: + escodegen: 1.14.3 + dev: false + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + dev: false /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - dev: true /stop-iteration-iterator@1.0.0: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} @@ -20932,6 +24882,18 @@ packages: char-regex: 1.0.2 strip-ansi: 6.0.1 + /string-length@5.0.1: + resolution: {integrity: sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==} + engines: {node: '>=12.20'} + dependencies: + char-regex: 2.0.1 + strip-ansi: 7.1.0 + dev: false + + /string-natural-compare@3.0.1: + resolution: {integrity: sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==} + dev: false + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -20959,7 +24921,6 @@ packages: internal-slot: 1.0.5 regexp.prototype.flags: 1.5.0 side-channel: 1.0.4 - dev: true /string.prototype.padend@3.1.4: resolution: {integrity: sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==} @@ -20977,7 +24938,6 @@ packages: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 - dev: true /string.prototype.trimend@1.0.6: resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} @@ -20985,7 +24945,6 @@ packages: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 - dev: true /string.prototype.trimstart@1.0.6: resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} @@ -20993,13 +24952,11 @@ packages: call-bind: 1.0.2 define-properties: 1.2.0 es-abstract: 1.22.1 - dev: true /string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 - dev: true /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -21013,6 +24970,15 @@ packages: character-entities-legacy: 3.0.0 dev: false + /stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + dev: false + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -21033,12 +24999,16 @@ packages: /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - dev: true /strip-bom@4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} + /strip-comments@2.0.1: + resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} + engines: {node: '>=10'} + dev: false + /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -21075,8 +25045,7 @@ packages: peerDependencies: webpack: ^5.0.0 dependencies: - webpack: 5.88.2(@swc/core@1.3.92)(esbuild@0.19.5) - dev: true + webpack: 5.88.2(esbuild@0.19.5) /style-to-object@0.4.1: resolution: {integrity: sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==} @@ -21084,6 +25053,30 @@ packages: inline-style-parser: 0.1.1 dev: false + /styled-components@6.1.8(react@18.2.0): + resolution: {integrity: sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw==} + engines: {node: '>= 16'} + peerDependencies: + react: '*' + react-dom: '*' + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + '@emotion/is-prop-valid': 1.2.1 + '@emotion/unitless': 0.8.0 + '@types/stylis': 4.2.0 + css-to-react-native: 3.2.0 + csstype: 3.1.2 + postcss: 8.4.31 + react: 18.2.0 + shallowequal: 1.1.0 + stylis: 4.3.1 + tslib: 2.5.0 + dev: true + /styled-jsx@5.1.1(@babel/core@7.23.2)(react@18.2.0): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} @@ -21104,6 +25097,21 @@ packages: react: 18.2.0 dev: false + /stylehacks@5.1.1(postcss@8.4.32): + resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: '>=8.4.31' + dependencies: + browserslist: 4.21.10 + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + dev: false + + /stylis@4.3.1: + resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} + dev: true + /sucrase@3.34.0: resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} engines: {node: '>=8'} @@ -21116,7 +25124,6 @@ packages: mz: 2.7.0 pirates: 4.0.6 ts-interface-checker: 0.1.13 - dev: true /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} @@ -21136,13 +25143,55 @@ packages: dependencies: has-flag: 4.0.0 + /supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: false + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} /svg-parser@2.0.4: resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} - dev: true + + /svgo@1.3.2: + resolution: {integrity: sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==} + engines: {node: '>=4.0.0'} + deprecated: This SVGO version is no longer supported. Upgrade to v2.x.x. + hasBin: true + dependencies: + chalk: 2.4.2 + coa: 2.0.2 + css-select: 2.1.0 + css-select-base-adapter: 0.1.1 + css-tree: 1.0.0-alpha.37 + csso: 4.2.0 + js-yaml: 3.14.1 + mkdirp: 0.5.6 + object.values: 1.1.6 + sax: 1.2.4 + stable: 0.1.8 + unquote: 1.1.1 + util.promisify: 1.0.1 + dev: false + + /svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.0.0 + stable: 0.1.8 + dev: false /svgo@3.0.2: resolution: {integrity: sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==} @@ -21193,10 +25242,45 @@ packages: '@types/node': 10.12.18 long: 4.0.0 + /tailwindcss@3.4.1(ts-node@10.9.1): + resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.1 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.19.1 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.32 + postcss-import: 15.1.0(postcss@8.4.32) + postcss-js: 4.0.1(postcss@8.4.32) + postcss-load-config: 4.0.1(postcss@8.4.32)(ts-node@10.9.1) + postcss-nested: 6.0.1(postcss@8.4.32) + postcss-selector-parser: 6.0.13 + resolve: 1.22.4 + sucrase: 3.34.0 + transitivePeerDependencies: + - ts-node + dev: false + + /tapable@1.1.3: + resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} + engines: {node: '>=6'} + dev: false + /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - dev: true /tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} @@ -21263,7 +25347,6 @@ packages: /temp-dir@2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} - dev: true /temp@0.8.4: resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} @@ -21272,6 +25355,16 @@ packages: rimraf: 2.6.3 dev: true + /tempy@0.6.0: + resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} + engines: {node: '>=10'} + dependencies: + is-stream: 2.0.1 + temp-dir: 2.0.0 + type-fest: 0.16.0 + unique-string: 2.0.0 + dev: false + /tempy@1.0.1: resolution: {integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==} engines: {node: '>=10'} @@ -21288,6 +25381,14 @@ packages: engines: {node: '>=8'} dev: true + /terminal-link@2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 + dev: false + /terser-webpack-plugin@5.3.9(@swc/core@1.3.92)(esbuild@0.19.5)(webpack@5.88.2): resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} @@ -21337,7 +25438,6 @@ packages: serialize-javascript: 6.0.1 terser: 5.19.2 webpack: 5.88.2(esbuild@0.19.5) - dev: true /terser@5.19.2: resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} @@ -21348,7 +25448,6 @@ packages: acorn: 8.10.0 commander: 2.20.3 source-map-support: 0.5.21 - dev: true /test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} @@ -21360,20 +25459,21 @@ packages: /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true /thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} dependencies: thenify: 3.3.1 - dev: true /thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} dependencies: any-promise: 1.3.0 - dev: true + + /throat@6.0.2: + resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} + dev: false /through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} @@ -21386,6 +25486,10 @@ packages: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: true + /thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + dev: false + /tiny-case@1.0.3: resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} dev: false @@ -21435,7 +25539,6 @@ packages: /toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - dev: true /toml@3.0.0: resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} @@ -21459,7 +25562,6 @@ packages: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} dependencies: punycode: 2.3.0 - dev: true /tr46@2.1.0: resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} @@ -21491,6 +25593,10 @@ packages: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} dev: false + /tryer@1.0.1: + resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} + dev: false + /ts-api-utils@1.0.1(typescript@5.2.2): resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} engines: {node: '>=16.13.0'} @@ -21506,7 +25612,6 @@ packages: /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: true /ts-jest-mock-import-meta@1.1.0(ts-jest@29.1.1): resolution: {integrity: sha512-PTmdWGbDZOPh8vyZUmCTK5PjeD2X3YO25MQPTbm0lMlNFigUDwz3opwXOlsrgD0i5u/MpDX0gdZKoVONxVjVEw==} @@ -21614,7 +25719,6 @@ packages: json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true /tsconfig-paths@4.2.0: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} @@ -21627,7 +25731,6 @@ packages: /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true /tslib@2.4.0: resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} @@ -21636,6 +25739,10 @@ packages: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} dev: true + /tslib@2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + dev: true + /tslib@2.5.3: resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} dev: true @@ -21667,7 +25774,7 @@ packages: execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.1(ts-node@10.9.1) + postcss-load-config: 4.0.1(postcss@8.4.32)(ts-node@10.9.1) resolve-from: 5.0.0 rollup: 3.28.1 source-map: 0.8.0-beta.0 @@ -21679,6 +25786,16 @@ packages: - ts-node dev: true + /tsutils@3.21.0(typescript@4.9.5): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 4.9.5 + dev: false + /tsutils@3.21.0(typescript@5.2.2): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -21780,12 +25897,18 @@ packages: turbo-windows-arm64: 1.10.15 dev: true + /type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + dev: false + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 - dev: true /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} @@ -21799,12 +25922,10 @@ packages: /type-fest@0.16.0: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} - dev: true /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - dev: true /type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} @@ -21839,7 +25960,6 @@ packages: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 - dev: true /typed-array-buffer@1.0.0: resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} @@ -21848,7 +25968,6 @@ packages: call-bind: 1.0.2 get-intrinsic: 1.2.1 is-typed-array: 1.1.12 - dev: true /typed-array-byte-length@1.0.0: resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} @@ -21858,7 +25977,6 @@ packages: for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 - dev: true /typed-array-byte-offset@1.0.0: resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} @@ -21869,7 +25987,6 @@ packages: for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 - dev: true /typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} @@ -21877,12 +25994,23 @@ packages: call-bind: 1.0.2 for-each: 0.3.3 is-typed-array: 1.1.12 - dev: true + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: false /typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} dev: true + /typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: false + /typescript@5.2.2: resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} engines: {node: '>=14.17'} @@ -21927,20 +26055,22 @@ packages: has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - dev: true /unc-path-regex@0.1.2: resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} engines: {node: '>=0.10.0'} dev: true + /underscore@1.12.1: + resolution: {integrity: sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==} + dev: false + /undici-types@5.25.3: resolution: {integrity: sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==} /unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} - dev: true /unicode-match-property-ecmascript@2.0.0: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} @@ -21948,17 +26078,14 @@ packages: dependencies: unicode-canonical-property-names-ecmascript: 2.0.0 unicode-property-aliases-ecmascript: 2.1.0 - dev: true /unicode-match-property-value-ecmascript@2.1.0: resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} engines: {node: '>=4'} - dev: true /unicode-property-aliases-ecmascript@2.1.0: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} - dev: true /unified@10.1.2: resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} @@ -21984,7 +26111,6 @@ packages: engines: {node: '>=8'} dependencies: crypto-random-string: 2.0.0 - dev: true /unist-util-generated@2.0.1: resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} @@ -22116,7 +26242,6 @@ packages: /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - dev: true /unplugin@1.4.0: resolution: {integrity: sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==} @@ -22127,11 +26252,20 @@ packages: webpack-virtual-modules: 0.5.0 dev: true + /unquote@1.1.1: + resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} + dev: false + /untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} dev: true + /upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + dev: false + /upath@2.0.1: resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} engines: {node: '>=4'} @@ -22147,6 +26281,17 @@ packages: escalade: 3.1.1 picocolors: 1.0.0 + /update-browserslist-db@1.0.13(browserslist@4.22.2): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.2 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: false + /updates@15.0.2: resolution: {integrity: sha512-bdVZgJ2lr4Ke3pWyq7bT9ynJ5L4J69xERSvMMlt96nWlzVhB5kG8tYzicqI3I5Bpyj7cAv9MLBxDWaj/mB+nfg==} engines: {node: '>=18'} @@ -22169,7 +26314,6 @@ packages: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.0 - dev: true /url-join@4.0.1: resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} @@ -22321,6 +26465,15 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + /util.promisify@1.0.1: + resolution: {integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==} + dependencies: + define-properties: 1.2.0 + es-abstract: 1.22.1 + has-symbols: 1.0.3 + object.getownpropertydescriptors: 2.1.7 + dev: false + /util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} dependencies: @@ -22333,12 +26486,15 @@ packages: /utila@0.4.0: resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} - dev: true /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - dev: true + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: false /uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} @@ -22358,6 +26514,15 @@ packages: /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + /v8-to-istanbul@8.1.1: + resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} + engines: {node: '>=10.12.0'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 + source-map: 0.7.4 + dev: false + /v8-to-istanbul@9.1.0: resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} engines: {node: '>=10.12.0'} @@ -22381,7 +26546,6 @@ packages: /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - dev: true /vfile-matter@3.0.1: resolution: {integrity: sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==} @@ -22513,6 +26677,20 @@ packages: optionalDependencies: fsevents: 2.3.3 + /w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + dependencies: + browser-process-hrtime: 1.0.0 + dev: false + + /w3c-xmlserializer@2.0.0: + resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} + engines: {node: '>=10'} + dependencies: + xml-name-validator: 3.0.0 + dev: false + /w3c-xmlserializer@4.0.0: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} engines: {node: '>=14'} @@ -22531,6 +26709,12 @@ packages: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 + /wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + dependencies: + minimalistic-assert: 1.0.1 + dev: false + /wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} dependencies: @@ -22550,6 +26734,10 @@ packages: engines: {node: '>= 8'} dev: true + /web-vitals@2.1.4: + resolution: {integrity: sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==} + dev: false + /webcrypto-core@1.7.7: resolution: {integrity: sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g==} dependencies: @@ -22566,6 +26754,11 @@ packages: /webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + /webidl-conversions@5.0.0: + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} + engines: {node: '>=8'} + dev: false + /webidl-conversions@6.1.0: resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} engines: {node: '>=10.4'} @@ -22575,6 +26768,20 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} + /webpack-dev-middleware@5.3.3(webpack@5.88.2): + resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + colorette: 2.0.20 + memfs: 3.5.3 + mime-types: 2.1.35 + range-parser: 1.2.1 + schema-utils: 4.2.0 + webpack: 5.88.2(esbuild@0.19.5) + dev: false + /webpack-dev-middleware@6.1.1(webpack@5.88.2): resolution: {integrity: sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==} engines: {node: '>= 14.15.0'} @@ -22592,6 +26799,57 @@ packages: webpack: 5.88.2(@swc/core@1.3.92)(esbuild@0.19.5) dev: true + /webpack-dev-server@4.15.1(webpack@5.88.2): + resolution: {integrity: sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==} + engines: {node: '>= 12.13.0'} + hasBin: true + peerDependencies: + webpack: ^4.37.0 || ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.17 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.2 + '@types/sockjs': 0.3.36 + '@types/ws': 8.5.5 + ansi-html-community: 0.0.8 + bonjour-service: 1.2.1 + chokidar: 3.5.3 + colorette: 2.0.20 + compression: 1.7.4 + connect-history-api-fallback: 2.0.0 + default-gateway: 6.0.3 + express: 4.18.2 + graceful-fs: 4.2.11 + html-entities: 2.4.0 + http-proxy-middleware: 2.0.6(@types/express@4.17.17) + ipaddr.js: 2.1.0 + launch-editor: 2.6.1 + open: 8.4.2 + p-retry: 4.6.2 + rimraf: 3.0.2 + schema-utils: 4.2.0 + selfsigned: 2.4.1 + serve-index: 1.9.1 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack: 5.88.2(esbuild@0.19.5) + webpack-dev-middleware: 5.3.3(webpack@5.88.2) + ws: 8.13.0 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + dev: false + /webpack-hot-middleware@2.25.4: resolution: {integrity: sha512-IRmTspuHM06aZh98OhBJtqLpeWFM8FXJS5UYpKYxCJzyFoyWj1w6VGFfomZU7OPA55dMLrQK0pRT1eQ3PACr4w==} dependencies: @@ -22600,10 +26858,35 @@ packages: strip-ansi: 6.0.1 dev: true + /webpack-manifest-plugin@4.1.1(webpack@5.88.2): + resolution: {integrity: sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==} + engines: {node: '>=12.22.0'} + peerDependencies: + webpack: ^4.44.2 || ^5.47.0 + dependencies: + tapable: 2.2.1 + webpack: 5.88.2(esbuild@0.19.5) + webpack-sources: 2.3.1 + dev: false + + /webpack-sources@1.4.3: + resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} + dependencies: + source-list-map: 2.0.1 + source-map: 0.6.1 + dev: false + + /webpack-sources@2.3.1: + resolution: {integrity: sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==} + engines: {node: '>=10.13.0'} + dependencies: + source-list-map: 2.0.1 + source-map: 0.6.1 + dev: false + /webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - dev: true /webpack-virtual-modules@0.5.0: resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} @@ -22687,7 +26970,26 @@ packages: - '@swc/core' - esbuild - uglify-js - dev: true + + /websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + dependencies: + http-parser-js: 0.5.8 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + dev: false + + /websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + dev: false + + /whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + dependencies: + iconv-lite: 0.4.24 + dev: false /whatwg-encoding@2.0.0: resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} @@ -22695,6 +26997,14 @@ packages: dependencies: iconv-lite: 0.6.3 + /whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + dev: false + + /whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + dev: false + /whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} @@ -22718,7 +27028,6 @@ packages: lodash.sortby: 4.7.0 tr46: 1.0.1 webidl-conversions: 4.0.2 - dev: true /whatwg-url@8.7.0: resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} @@ -22754,7 +27063,6 @@ packages: which-boxed-primitive: 1.0.2 which-collection: 1.0.1 which-typed-array: 1.1.11 - dev: true /which-collection@1.0.1: resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} @@ -22802,6 +27110,170 @@ packages: /wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + /workbox-background-sync@6.6.0: + resolution: {integrity: sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==} + dependencies: + idb: 7.1.1 + workbox-core: 6.6.0 + dev: false + + /workbox-broadcast-update@6.6.0: + resolution: {integrity: sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==} + dependencies: + workbox-core: 6.6.0 + dev: false + + /workbox-build@6.6.0: + resolution: {integrity: sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==} + engines: {node: '>=10.0.0'} + dependencies: + '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) + '@babel/core': 7.23.2 + '@babel/preset-env': 7.22.9(@babel/core@7.23.2) + '@babel/runtime': 7.22.6 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.23.2)(rollup@2.79.1) + '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) + '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) + '@surma/rollup-plugin-off-main-thread': 2.2.3 + ajv: 8.12.0 + common-tags: 1.8.2 + fast-json-stable-stringify: 2.1.0 + fs-extra: 9.1.0 + glob: 7.2.3 + lodash: 4.17.21 + pretty-bytes: 5.6.0 + rollup: 2.79.1 + rollup-plugin-terser: 7.0.2(rollup@2.79.1) + source-map: 0.8.0-beta.0 + stringify-object: 3.3.0 + strip-comments: 2.0.1 + tempy: 0.6.0 + upath: 1.2.0 + workbox-background-sync: 6.6.0 + workbox-broadcast-update: 6.6.0 + workbox-cacheable-response: 6.6.0 + workbox-core: 6.6.0 + workbox-expiration: 6.6.0 + workbox-google-analytics: 6.6.0 + workbox-navigation-preload: 6.6.0 + workbox-precaching: 6.6.0 + workbox-range-requests: 6.6.0 + workbox-recipes: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 + workbox-streams: 6.6.0 + workbox-sw: 6.6.0 + workbox-window: 6.6.0 + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + dev: false + + /workbox-cacheable-response@6.6.0: + resolution: {integrity: sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==} + deprecated: workbox-background-sync@6.6.0 + dependencies: + workbox-core: 6.6.0 + dev: false + + /workbox-core@6.6.0: + resolution: {integrity: sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==} + dev: false + + /workbox-expiration@6.6.0: + resolution: {integrity: sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==} + dependencies: + idb: 7.1.1 + workbox-core: 6.6.0 + dev: false + + /workbox-google-analytics@6.6.0: + resolution: {integrity: sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==} + dependencies: + workbox-background-sync: 6.6.0 + workbox-core: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 + dev: false + + /workbox-navigation-preload@6.6.0: + resolution: {integrity: sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==} + dependencies: + workbox-core: 6.6.0 + dev: false + + /workbox-precaching@6.6.0: + resolution: {integrity: sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==} + dependencies: + workbox-core: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 + dev: false + + /workbox-range-requests@6.6.0: + resolution: {integrity: sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==} + dependencies: + workbox-core: 6.6.0 + dev: false + + /workbox-recipes@6.6.0: + resolution: {integrity: sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==} + dependencies: + workbox-cacheable-response: 6.6.0 + workbox-core: 6.6.0 + workbox-expiration: 6.6.0 + workbox-precaching: 6.6.0 + workbox-routing: 6.6.0 + workbox-strategies: 6.6.0 + dev: false + + /workbox-routing@6.6.0: + resolution: {integrity: sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==} + dependencies: + workbox-core: 6.6.0 + dev: false + + /workbox-strategies@6.6.0: + resolution: {integrity: sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==} + dependencies: + workbox-core: 6.6.0 + dev: false + + /workbox-streams@6.6.0: + resolution: {integrity: sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==} + dependencies: + workbox-core: 6.6.0 + workbox-routing: 6.6.0 + dev: false + + /workbox-sw@6.6.0: + resolution: {integrity: sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==} + dev: false + + /workbox-webpack-plugin@6.6.0(webpack@5.88.2): + resolution: {integrity: sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==} + engines: {node: '>=10.0.0'} + peerDependencies: + webpack: ^4.4.0 || ^5.9.0 + dependencies: + fast-json-stable-stringify: 2.1.0 + pretty-bytes: 5.6.0 + upath: 1.2.0 + webpack: 5.88.2(esbuild@0.19.5) + webpack-sources: 1.4.3 + workbox-build: 6.6.0 + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + dev: false + + /workbox-window@6.6.0: + resolution: {integrity: sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==} + dependencies: + '@types/trusted-types': 2.0.7 + workbox-core: 6.6.0 + dev: false + /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -22838,6 +27310,15 @@ packages: signal-exit: 3.0.7 dev: true + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + dev: false + /write-file-atomic@4.0.2: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -22859,6 +27340,19 @@ packages: async-limiter: 1.0.1 dev: true + /ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + /ws@8.13.0: resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'} @@ -22883,6 +27377,10 @@ packages: utf-8-validate: optional: true + /xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + dev: false + /xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} @@ -22922,12 +27420,10 @@ packages: /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - dev: true /yaml@2.3.1: resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} engines: {node: '>= 14'} - dev: true /yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} @@ -22940,7 +27436,6 @@ packages: /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} - dev: true /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} @@ -22974,7 +27469,6 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 - dev: true /yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 31f3022a4..30d10032c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,4 @@ packages: - 'packages/*' - 'packages/example-projects/*' + - 'examples/*'