diff --git a/apps/rays-dashboard/constants/networks-list.ts b/apps/rays-dashboard/constants/networks-list.ts index 57e2819ea9..7e721d052f 100644 --- a/apps/rays-dashboard/constants/networks-list.ts +++ b/apps/rays-dashboard/constants/networks-list.ts @@ -84,7 +84,10 @@ function getRpc(network: NetworkNames): string { return '' } - return `${window.location.origin}/api/rpcGateway?network=${network}&clientId=${clientId}` + // for local testing + const resolvedOrigin = window.location.origin.replace('3001', '3000') + + return `${resolvedOrigin}/api/rpcGateway?network=${network}&clientId=${clientId}` } export const mainnetRpc = getRpc(NetworkNames.ethereumMainnet) diff --git a/packages/app-tos/.eslintrc.cjs b/packages/app-tos/.eslintrc.cjs new file mode 100644 index 0000000000..ac80581fa6 --- /dev/null +++ b/packages/app-tos/.eslintrc.cjs @@ -0,0 +1,16 @@ +/** @type {import("eslint").Linter.Config} */ +module.exports = { + root: true, + extends: ['@summerfi/eslint-config/next.cjs'], + parser: '@typescript-eslint/parser', + parserOptions: { + project: ['./tsconfig.json'], + sourceType: 'module', + tsconfigRootDir: __dirname, + }, + ignorePatterns: ['types', 'dist', 'node_modules'], + rules: { + '@next/next/no-img-element': 'off', + 'no-magic-numbers': 'off', + }, +} diff --git a/packages/app-tos/README.MD b/packages/app-tos/README.MD new file mode 100644 index 0000000000..a9d24c16da --- /dev/null +++ b/packages/app-tos/README.MD @@ -0,0 +1,10 @@ +# @summerfi/app-tos + +Common Terms of Service (TOS) handling for the @summerfi apps. + +This package provides `useTermsOfService` hook and types which can be used to easily integrate TOS +flow in new apps. + +This package do not contain any UI which should be handled / customized on the client app side. + +This package assumes that API already exists, which in the end may vary per specific app. diff --git a/packages/app-tos/package.json b/packages/app-tos/package.json new file mode 100644 index 0000000000..7ae1d39063 --- /dev/null +++ b/packages/app-tos/package.json @@ -0,0 +1,44 @@ +{ + "name": "@summerfi/app-tos", + "version": "0.0.0", + "license": "Apache-2.0", + "type": "module", + "main": "./dist/index.js", + "types": "./dist/types/src/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "lint": "eslint *.ts*", + "dev": "pnpm vite build -w true", + "build": "pnpm vite build -w false", + "clean": "rm -rf dist" + }, + "devDependencies": { + "@summerfi/app-types": "workspace:*", + "@summerfi/eslint-config": "workspace:*", + "@summerfi/typescript-config": "workspace:*", + "@types/react": "^18.3.1", + "@types/jsonwebtoken": "^9.0.0", + "@vitejs/plugin-react": "^4.2.1", + "vite-plugin-node-polyfills": "^0.22.0", + "eslint": "8.57.0", + "typescript": "^5.4.5", + "vite": "^5.2.11", + "vite-plugin-dts": "^3.9.1", + "glob": "^10.3.12" + }, + "peerDependencies": { + "react": "^18.3.1", + "usehooks-ts": "^3.1.0", + "@safe-global/safe-apps-sdk": "^9.0.0", + "jsonwebtoken": "^9.0.0" + }, + "publishConfig": { + "access": "public" + }, + "dependencies": { + "rollup-preserve-directives": "^1.1.1", + "vite-tsconfig-paths": "^4.3.2" + } +} diff --git a/packages/app-tos/src/auth/gnosis/get-gnosis-safe-details.ts b/packages/app-tos/src/auth/gnosis/get-gnosis-safe-details.ts new file mode 100644 index 0000000000..8e5eb48ac1 --- /dev/null +++ b/packages/app-tos/src/auth/gnosis/get-gnosis-safe-details.ts @@ -0,0 +1,85 @@ +import type SafeAppsSDK from '@safe-global/safe-apps-sdk' +// eslint-disable-next-line no-duplicate-imports +import { type SignMessageResponse } from '@safe-global/safe-apps-sdk' +import { decode } from 'jsonwebtoken' + +import { getDataToSignFromChallenge } from '@/helpers/get-data-to-sign-from-challenge' + +const LOCAL_STORAGE_GNOSIS_SAFE_PENDING = 'gnosis-safe-pending' + +interface GnosisSafeSignInDetails { + messageHash: string + challenge: string +} + +interface GnosisSafeSignInDetailsWithData extends GnosisSafeSignInDetails { + dataToSign: string +} + +/** + * Retrieves or generates Gnosis Safe sign-in details including a message hash and data to sign. + * + * @remarks + * This method checks for a pending signature in local storage. If found and not expired, + * it uses the existing data. Otherwise, it generates a new signature request and stores the details. + * + * @param sdk - The SafeAppsSDK instance used to sign messages. + * @param chainId - The chain ID of the blockchain network. + * @param account - The account address for which the details are being retrieved or generated. + * @param newChallenge - A new challenge string used to generate the data to sign if no pending signature is found. + * + * @returns A promise that resolves to an object containing the message hash, challenge, and data to sign. + * + * @throws Will throw an error if the response from the SDK is unexpected or if the message hash is not defined. + */ + +export const getGnosisSafeDetails = async ( + sdk: SafeAppsSDK, + chainId: number, + account: string, + newChallenge: string, +): Promise => { + const key = `${LOCAL_STORAGE_GNOSIS_SAFE_PENDING}/${chainId}-${account}` + const localStorageItem = localStorage.getItem(key) + const pendingSignature: GnosisSafeSignInDetails | undefined = localStorageItem + ? JSON.parse(localStorageItem) + : undefined + + if (pendingSignature) { + const exp = (decode(pendingSignature.challenge) as any)?.exp + + if (exp && exp * 1000 >= Date.now()) { + return { + ...pendingSignature, + dataToSign: getDataToSignFromChallenge(pendingSignature.challenge), + } + } + } + + const dataToSign = getDataToSignFromChallenge(newChallenge) + const res = (await sdk.txs.signMessage(dataToSign)) as SignMessageResponse + let messageHash: string | undefined + + if ('messageHash' in res) { + // eslint-disable-next-line prefer-destructuring + messageHash = res.messageHash + } else if ('safeTxHash' in res) { + throw new Error('Please upgrade your SAFE') + } else { + throw new Error('Unexpected response type') + } + + if (!messageHash) { + throw new Error('Safe messageHash not defined') + } + + localStorage.setItem( + key, + JSON.stringify({ + messageHash, + challenge: newChallenge, + } as GnosisSafeSignInDetails), + ) + + return { challenge: newChallenge, messageHash, dataToSign } +} diff --git a/packages/app-tos/src/auth/request-challenge.ts b/packages/app-tos/src/auth/request-challenge.ts new file mode 100644 index 0000000000..9d4896065d --- /dev/null +++ b/packages/app-tos/src/auth/request-challenge.ts @@ -0,0 +1,39 @@ +/** + * Requests a challenge from the authentication server. + * + * @remarks + * This method sends a POST request to the `/api/auth/challenge` endpoint with the provided wallet address and + * Gnosis Safe status. It returns a challenge string on success or undefined if an error occurs. + * + * @param walletAddress - The wallet address to be used in the challenge request. + * @param isGnosisSafe - A boolean indicating if the wallet is a Gnosis Safe. + * @param host - Optional, to be used when API is not available under the same host (for example localhost development on different ports). + * + * @returns A promise that resolves to the challenge string or undefined if an error occurs. + */ +export const requestChallenge = async ({ + walletAddress, + isGnosisSafe, + host = '', +}: { + walletAddress: string + isGnosisSafe: boolean + host?: string +}): Promise => { + try { + const { challenge } = await fetch(`${host}/api/auth/challenge`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ address: walletAddress.toLowerCase(), isGnosisSafe }), + }).then((resp) => resp.json()) + + return challenge + } catch (e) { + // eslint-disable-next-line no-console + console.error('Request challenge error', e) + + return undefined + } +} diff --git a/packages/app-tos/src/auth/request-jwt.ts b/packages/app-tos/src/auth/request-jwt.ts new file mode 100644 index 0000000000..32c121db9b --- /dev/null +++ b/packages/app-tos/src/auth/request-jwt.ts @@ -0,0 +1,110 @@ +'use client' +import SafeAppsSDK from '@safe-global/safe-apps-sdk' + +import { getGnosisSafeDetails } from '@/auth/gnosis/get-gnosis-safe-details' +import { requestChallenge } from '@/auth/request-challenge' +import { requestSignin } from '@/auth/request-signin' +import { signTypedPayload } from '@/helpers/sign-typed-payload' +import { type TOSSignMessage } from '@/types' + +/** + * Requests a JSON Web Token (JWT) by signing a challenge. + * + * @remarks + * This method first requests a challenge from the server. If the wallet is a Gnosis Safe, it retrieves Gnosis Safe details and + * polls for an off-chain signature to request a sign-in. Otherwise, it uses the provided signing function to sign the challenge + * and request a sign-in. + * + * @param signMessage - The function used to sign the challenge message. + * @param chainId - The chain ID of the blockchain network. + * @param walletAddress - The wallet address to be used for signing. + * @param isGnosisSafe - A boolean indicating if the wallet is a Gnosis Safe. + * @param host - Optional, to be used when API is not available under the same host (for example localhost development on different ports). + * + * @returns A promise that resolves to the JWT string or undefined if an error occurs. + * @throws Will throw an error if the challenge request fails or if signing with Gnosis Safe fails. + */ +export async function requestJWT({ + signMessage, + chainId, + walletAddress, + isGnosisSafe, + host, +}: { + signMessage: TOSSignMessage + chainId: number + walletAddress: string + isGnosisSafe: boolean + host?: string +}): Promise { + const challenge = await requestChallenge({ walletAddress, isGnosisSafe, host }) + + if (!challenge) { + throw new Error('Request challenge failed, try again or contact with support') + } + + if (isGnosisSafe) { + const sdk = new SafeAppsSDK() + + const { challenge: gnosisSafeChallenge, messageHash } = await getGnosisSafeDetails( + sdk, + chainId, + walletAddress, + challenge, + ) + + // start polling + const token = await new Promise((resolve) => { + let returnValue = (val: string | undefined) => resolve(val) // CAUTION: this function is reassigned later + const interval = setInterval(async () => { + if (messageHash) { + try { + const offchainSignature = await sdk.safe.getOffChainSignature(messageHash) + + if (offchainSignature === '') { + throw new Error('GnosisSafe: not ready') + } + const safeJwt = await requestSignin({ + challenge: gnosisSafeChallenge, + signature: offchainSignature, + chainId, + isGnosisSafe, + host, + }) + + return returnValue(safeJwt) + } catch (error) { + // eslint-disable-next-line no-console + console.error('GnosisSafe: error occurred', error) + } + } + }, 5 * 1000) + + // clear all scheduled callbacks + returnValue = (val: string | undefined) => { + clearInterval(interval) + resolve(val) + } + }) + + if (!token) { + throw new Error(`GnosisSafe: failed to sign`) + } + + return token + } + + const signature = await signTypedPayload(challenge, signMessage) + + if (!signature) { + throw new Error('Signing process declined or failed, try again or contact with support') + } + + return await requestSignin({ + challenge, + signature, + chainId, + isGnosisSafe: false, + host, + }) +} diff --git a/packages/app-tos/src/auth/request-signin.ts b/packages/app-tos/src/auth/request-signin.ts new file mode 100644 index 0000000000..191182cc65 --- /dev/null +++ b/packages/app-tos/src/auth/request-signin.ts @@ -0,0 +1,47 @@ +/** + * Requests a JSON Web Token (JWT) by sending a signed challenge to the authentication server. + * + * @remarks + * This method sends a POST request to the `/api/auth/signin` endpoint with the provided signature, challenge, + * chain ID, and Gnosis Safe status. It returns a JWT string on success or undefined if an error occurs. + * + * @param signature - The signature generated by signing the challenge. + * @param challenge - The challenge string to be signed. + * @param chainId - The chain ID of the blockchain network. + * @param isGnosisSafe - A boolean indicating if the wallet is a Gnosis Safe. + * @param host - Optional, to be used when API is not available under the same host (for example localhost development on different ports). + * + * @returns A promise that resolves to the JWT string or undefined if an error occurs. + * @throws Will log an error to the console if the request fails. + */ +export const requestSignin = async ({ + signature, + challenge, + chainId, + isGnosisSafe, + host = '', +}: { + signature: string + challenge: string + chainId: number + isGnosisSafe: boolean + host?: string +}): Promise => { + try { + const { jwt } = await fetch(`${host}/api/auth/signin`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ signature, challenge, chainId, isGnosisSafe }), + credentials: 'include', + }).then((resp) => resp.json()) + + return jwt + } catch (e) { + // eslint-disable-next-line no-console + console.error('Request challenge error', e) + + return undefined + } +} diff --git a/packages/app-tos/src/helpers/action-error-wrapper.ts b/packages/app-tos/src/helpers/action-error-wrapper.ts new file mode 100644 index 0000000000..05be5cedac --- /dev/null +++ b/packages/app-tos/src/helpers/action-error-wrapper.ts @@ -0,0 +1,46 @@ +import type { Dispatch, SetStateAction } from 'react' + +import { type TOSState, TOSStatus } from '@/types' + +/** + * Wraps an asynchronous function to handle errors and update state accordingly. + * + * @remarks + * This method wraps a given asynchronous function, attempting to execute it. + * If the function fails, it catches the error, logs it, and updates the state to retry the action. + * + * @param fn - The asynchronous function to be executed. + * @param setTos - A state dispatcher function to update the Terms of Service (TOS) state. + * @param actionStatus - The current status of the TOS action. + * + * @returns A wrapped asynchronous function that handles errors and updates state on failure. + */ +export const actionErrorWrapper = + ({ + fn, + setTos, + actionStatus, + }: { + fn: () => Promise + setTos: Dispatch> + actionStatus: TOSStatus + }) => + async () => { + try { + await fn() + } catch (error) { + /** + Go to retry step with the same action that failed. + */ + // eslint-disable-next-line no-console + console.error( + `Terms of service flow failed on ${actionStatus} step - please retry or contact with support`, + error, + ) + setTos({ + status: TOSStatus.RETRY, + action: actionErrorWrapper({ fn: () => fn(), setTos, actionStatus }), + error: `${error}`, + }) + } + } diff --git a/packages/app-tos/src/helpers/get-data-to-sign-from-challenge.ts b/packages/app-tos/src/helpers/get-data-to-sign-from-challenge.ts new file mode 100644 index 0000000000..a5e25f1f51 --- /dev/null +++ b/packages/app-tos/src/helpers/get-data-to-sign-from-challenge.ts @@ -0,0 +1,18 @@ +import { decode, type JwtPayload } from 'jsonwebtoken' + +/** + * Generates a data string to sign from a given challenge. + * + * @remarks + * This method decodes a JWT challenge string and constructs a message + * containing the address and a random challenge from the decoded payload. + * + * @param challenge - The JWT challenge string to decode. + * + * @returns A string message containing the address and random challenge from the decoded payload. + */ +export const getDataToSignFromChallenge = (challenge: string): string => { + const decodedChallenge = decode(challenge) as JwtPayload + + return `Sign to verify your wallet ${decodedChallenge.address} (${decodedChallenge.randomChallenge})` +} diff --git a/packages/app-tos/src/helpers/sign-typed-payload.ts b/packages/app-tos/src/helpers/sign-typed-payload.ts new file mode 100644 index 0000000000..b677d06819 --- /dev/null +++ b/packages/app-tos/src/helpers/sign-typed-payload.ts @@ -0,0 +1,20 @@ +import { getDataToSignFromChallenge } from '@/helpers/get-data-to-sign-from-challenge' +import type { TOSSignMessage } from '@/types' + +/** + * Signs a typed payload based on a challenge string, a signing function, and an account address. + * + * @param challenge - The challenge string that needs to be signed + * @param signMessage - A signer function that takes data, and returns a signed message + * + * @returns A promise that resolves to the signed message + * + */ +export const signTypedPayload = ( + challenge: string, + signMessage: TOSSignMessage, +): ReturnType => { + const data = getDataToSignFromChallenge(challenge) + + return signMessage(data) +} diff --git a/packages/app-tos/src/hooks/useTermsOfService.ts b/packages/app-tos/src/hooks/useTermsOfService.ts new file mode 100644 index 0000000000..1b6091f210 --- /dev/null +++ b/packages/app-tos/src/hooks/useTermsOfService.ts @@ -0,0 +1,131 @@ +'use client' +import { useEffect, useState } from 'react' + +import { requestJWT } from '@/auth/request-jwt' +import { actionErrorWrapper } from '@/helpers/action-error-wrapper' +import { saveTermsOfServiceAcceptance } from '@/tos/save-terms-of-service-acceptance' +import { verifyTermsOfServiceAcceptance } from '@/tos/verify-terms-of-service-acceptance' +import { type TOSInput, type TOSState, TOSStatus } from '@/types' + +/** + * Summer.fi Terms of Service hook + * + * @remarks + * This hooks assume that there is API running on the same host (if not, `host` parameter should be defined and CORS configured) + * with proper handling of all endpoints that are being called (`/api/tos/*`, `/api/auth/signin`). + * + * @param signMessage - web3 sign handler required for on-chain signature, should be memoized on the client level + * @param chainId - chain id, i.e. 1 (ethereum mainnet) + * @param walletAddress - user wallet address + * @param version - Terms of Service version + * @param isGnosisSafe - boolean to determine whether user use safe multi-sig + * @param host - Optional, to be used when API is not available under the same host (for example localhost development on different ports). + * + * @returns Returns state of Terms of Service flow + * + */ +export const useTermsOfService = ({ + signMessage, + chainId, + walletAddress, + version, + isGnosisSafe, + host, +}: TOSInput) => { + const [tos, setTos] = useState({ + status: TOSStatus.INIT, + }) + + useEffect(() => { + const request = async (walletAddress: string) => { + /** + Initial step - fetch info about user acceptance from database. + */ + const termsOfServiceAcceptance = await verifyTermsOfServiceAcceptance({ + walletAddress, + version, + host, + }) + + /** + If acceptance exists & user is authorized & ToS was not updated, let user in. + */ + if ( + termsOfServiceAcceptance.acceptance && + termsOfServiceAcceptance.authorized && + !termsOfServiceAcceptance.updated + ) { + setTos({ + status: TOSStatus.DONE, + }) + } + + /** + If user is not authorized or ToS was updated, launch ToS signature process. + */ + if (!termsOfServiceAcceptance.authorized || termsOfServiceAcceptance.updated) { + setTos({ + status: TOSStatus.WAITING_FOR_SIGNATURE, + action: actionErrorWrapper({ + fn: async () => { + setTos({ + status: TOSStatus.LOADING, + previousStatus: TOSStatus.WAITING_FOR_SIGNATURE, + }) + const jwt = await requestJWT({ + signMessage, + chainId, + walletAddress, + isGnosisSafe, + host, + }) + + if (jwt) { + const newStatus = termsOfServiceAcceptance.updated + ? TOSStatus.WAITING_FOR_ACCEPTANCE_UPDATED + : TOSStatus.WAITING_FOR_ACCEPTANCE + + setTos({ + status: newStatus, + /** + ToS api calls to save / update signature + */ + action: actionErrorWrapper({ + fn: async () => { + setTos({ status: TOSStatus.LOADING, previousStatus: newStatus }) + const { docVersion } = await saveTermsOfServiceAcceptance({ + walletAddress, + version, + host, + }) + + if (docVersion) { + setTos({ + status: TOSStatus.DONE, + }) + } + }, + setTos, + actionStatus: newStatus, + }), + }) + } else { + throw Error('Failed to generate JWT, try again or contact with Support.') + } + }, + setTos, + actionStatus: TOSStatus.WAITING_FOR_SIGNATURE, + }), + }) + } + } + + if (!walletAddress) { + return + } + + void request(walletAddress) + }, [walletAddress, version, chainId, isGnosisSafe, host, signMessage]) + + return tos +} diff --git a/packages/app-tos/src/index.ts b/packages/app-tos/src/index.ts new file mode 100644 index 0000000000..828e965521 --- /dev/null +++ b/packages/app-tos/src/index.ts @@ -0,0 +1,4 @@ +export { useTermsOfService } from '@/hooks/useTermsOfService' + +export type { TOSSignMessage, TOSState, TOSInput } from '@/types' +export { TOSStatus } from '@/types' diff --git a/packages/app-tos/src/tos/save-terms-of-service-acceptance.ts b/packages/app-tos/src/tos/save-terms-of-service-acceptance.ts new file mode 100644 index 0000000000..6d0c707131 --- /dev/null +++ b/packages/app-tos/src/tos/save-terms-of-service-acceptance.ts @@ -0,0 +1,41 @@ +interface SaveTermsOfServiceAcceptance { + docVersion?: string +} + +/** + * Saves the acceptance of the terms of service for a given wallet address. + * + * @remarks + * This method sends a POST request to the `/api/tos` endpoint with the provided wallet address and document version. + * It returns the document version of the accepted terms of service. + * + * @param walletAddress - The wallet address of the user accepting the terms of service. + * @param version - The version of the terms of service document. + * @param host - Optional, to be used when API is not available under the same host (for example localhost development on different ports). + * + * @returns A promise that resolves to an object containing the document version of the accepted terms of service. + * @throws Will throw an error if the request fails. + */ +export const saveTermsOfServiceAcceptance = async ({ + walletAddress, + version, + host = '', +}: { + walletAddress: string + version: string + host?: string +}): Promise => { + const { docVersion }: SaveTermsOfServiceAcceptance = await fetch(`${host}/api/tos`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + docVersion: version, + walletAddress: walletAddress.toLowerCase(), + }), + credentials: 'include', + }).then((resp) => resp.json()) + + return { docVersion } +} diff --git a/packages/app-tos/src/tos/verify-terms-of-service-acceptance.ts b/packages/app-tos/src/tos/verify-terms-of-service-acceptance.ts new file mode 100644 index 0000000000..7bbb35e411 --- /dev/null +++ b/packages/app-tos/src/tos/verify-terms-of-service-acceptance.ts @@ -0,0 +1,47 @@ +interface VerifyTermsOfServiceAcceptance { + acceptance: boolean + updated?: boolean + authorized?: boolean +} + +/** + * Verifies the acceptance of the terms of service for a given wallet address and version. + * + * @remarks + * This method sends a GET request to the `/api/tos/{version}/{walletAddress}` endpoint to check if the user has accepted + * the terms of service for the specified version. It returns an object indicating whether the terms were accepted, + * whether they have been updated, and whether the user is authorized. + * + * @param walletAddress - The wallet address of the user whose acceptance status is being verified. + * @param version - The version of the terms of service document. + * @param host - Optional, to be used when API is not available under the same host (for example localhost development on different ports). + * + * @returns A promise that resolves to an object with the following properties: + * - `acceptance`: A boolean indicating if the terms of service were accepted. + * - `updated`: An optional boolean indicating if the terms of service have been updated. + * - `authorized`: An optional boolean indicating if the user is authorized. + * @throws Will throw an error if the request fails. + */ + +export const verifyTermsOfServiceAcceptance = async ({ + walletAddress, + version, + host = '', +}: { + walletAddress: string + version: string + host?: string +}): Promise => { + const { acceptance, updated, authorized }: VerifyTermsOfServiceAcceptance = await fetch( + `${host}/api/tos/${version}/${walletAddress}`, + { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + credentials: 'include', + }, + ).then((resp) => resp.json()) + + return { acceptance, updated, authorized } +} diff --git a/packages/app-tos/src/types.ts b/packages/app-tos/src/types.ts new file mode 100644 index 0000000000..c833180820 --- /dev/null +++ b/packages/app-tos/src/types.ts @@ -0,0 +1,66 @@ +export enum TOSStatus { + INIT = 'init', + WAITING_FOR_SIGNATURE = 'waitingForSignature', + WAITING_FOR_ACCEPTANCE = 'waitingForAcceptance', + WAITING_FOR_ACCEPTANCE_UPDATED = 'waitingForAcceptanceUpdated', + LOADING = 'loading', + DONE = 'done', + RETRY = 'retry', +} + +type TOSInitializedStep = { + status: TOSStatus.INIT +} + +type TOSWaitingForSignatureStep = { + status: TOSStatus.WAITING_FOR_SIGNATURE + action: () => void +} + +type TOSWaitingForAcceptanceStep = { + status: TOSStatus.WAITING_FOR_ACCEPTANCE + action: () => void +} + +type TOSWaitingForAcceptanceUpdatedStep = { + status: TOSStatus.WAITING_FOR_ACCEPTANCE_UPDATED + action: () => void +} + +type TOSLoadingStep = { + status: TOSStatus.LOADING + previousStatus: + | TOSStatus.WAITING_FOR_SIGNATURE + | TOSStatus.WAITING_FOR_ACCEPTANCE + | TOSStatus.WAITING_FOR_ACCEPTANCE_UPDATED +} + +type TOSFinishedStep = { + status: TOSStatus.DONE +} + +type TOSRetryStep = { + status: TOSStatus.RETRY + error: string + action: () => void +} + +export type TOSState = + | TOSInitializedStep + | TOSWaitingForSignatureStep + | TOSWaitingForAcceptanceStep + | TOSWaitingForAcceptanceUpdatedStep + | TOSLoadingStep + | TOSFinishedStep + | TOSRetryStep + +export type TOSSignMessage = (data: string) => Promise + +export type TOSInput = { + signMessage: TOSSignMessage + chainId: number + walletAddress?: string + version: string + isGnosisSafe: boolean + host?: string +} diff --git a/packages/app-tos/tsconfig.json b/packages/app-tos/tsconfig.json new file mode 100644 index 0000000000..fe161d2810 --- /dev/null +++ b/packages/app-tos/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "@summerfi/typescript-config/tsconfig.nextjs.json", + "include": ["src/**/*", "next-env.d.ts", "src/icons/svg.d.ts"], + "exclude": ["dist/**/*", "node_modules"], + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + }, + "lib": ["dom", "dom.iterable", "esnext"], + "typeRoots": [], + "outDir": "./dist" + } +} diff --git a/packages/app-tos/vite.config.ts b/packages/app-tos/vite.config.ts new file mode 100644 index 0000000000..56a1ab96fe --- /dev/null +++ b/packages/app-tos/vite.config.ts @@ -0,0 +1,66 @@ +import react from '@vitejs/plugin-react' +import { glob } from 'glob' +import { fileURLToPath } from 'node:url' +import { extname, relative, resolve } from 'path' +import { defineConfig } from 'vite' + +// handles tsconfig paths from the tsconfig.json +import tsconfigPaths from 'vite-tsconfig-paths' +// generates typescript declaration files (just the js/ts, scss is done in package.json) +import dts from 'vite-plugin-dts' +// preserves directives like "use client" in the output +import preserveDirectives from 'rollup-preserve-directives' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + react(), + tsconfigPaths(), + preserveDirectives(), + { + // libInjectCss (with preserveDirectives) adds the css import to the top of the file + // this custom handle moves the directive ('use client') to the top of the file again + name: 'custom-swap-directive', + generateBundle(_, bundle) { + for (const chunk of Object.values(bundle)) { + if (chunk.type === 'chunk') { + if (chunk.code.includes('use client')) { + chunk.code = chunk.code.replace(/['"]use client['"];/, '') + chunk.code = `'use client';\n${chunk.code}` + } + if (chunk.code.includes('use server')) { + chunk.code = chunk.code.replace(/['"]use server['"];/, '') + chunk.code = `'use server';\n${chunk.code}` + } + } + } + }, + }, + dts({ outDir: 'dist/types', insertTypesEntry: true, strictOutput: true, copyDtsFiles: true }), + ], + build: { + emptyOutDir: false, + cssCodeSplit: true, + lib: { + // eslint-disable-next-line no-undef + entry: resolve(__dirname, 'src/index.ts'), + formats: ['es'], + }, + rollupOptions: { + external: ['react', '@safe-global/safe-apps-sdk', 'jsonwebtoken'], + input: Object.fromEntries( + glob + .sync('src/**/*.{ts,tsx}') + .filter((file) => !file.endsWith('.d.ts')) + .map((file) => [ + relative('src', file.slice(0, file.length - extname(file).length)), + fileURLToPath(new URL(file, import.meta.url)), + ]), + ), + output: { + assetFileNames: 'assets/[name][extname]', + entryFileNames: '[name].js', + }, + }, + }, +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8dbebf14a9..01722f6a00 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -654,6 +654,64 @@ importers: specifier: ^5.3.5 version: 5.3.5(@types/node@20.12.7)(sass@1.77.8) + packages/app-tos: + dependencies: + '@safe-global/safe-apps-sdk': + specifier: ^9.0.0 + version: 9.1.0(typescript@5.4.5)(zod@3.22.4) + jsonwebtoken: + specifier: ^9.0.0 + version: 9.0.2 + react: + specifier: ^18.3.1 + version: 18.3.1 + rollup-preserve-directives: + specifier: ^1.1.1 + version: 1.1.1(rollup@4.18.0) + usehooks-ts: + specifier: ^3.1.0 + version: 3.1.0(react@18.3.1) + vite-tsconfig-paths: + specifier: ^4.3.2 + version: 4.3.2(typescript@5.4.5)(vite@5.3.5) + devDependencies: + '@summerfi/app-types': + specifier: workspace:* + version: link:../app-types + '@summerfi/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@summerfi/typescript-config': + specifier: workspace:* + version: link:../typescript-config + '@types/jsonwebtoken': + specifier: ^9.0.0 + version: 9.0.6 + '@types/react': + specifier: ^18.3.1 + version: 18.3.1 + '@vitejs/plugin-react': + specifier: ^4.2.1 + version: 4.3.1(vite@5.3.5) + eslint: + specifier: 8.57.0 + version: 8.57.0 + glob: + specifier: ^10.3.12 + version: 10.4.1 + typescript: + specifier: ^5.4.5 + version: 5.4.5 + vite: + specifier: ^5.2.11 + version: 5.3.5(@types/node@20.12.7)(sass@1.77.8) + vite-plugin-dts: + specifier: ^3.9.1 + version: 3.9.1(@types/node@20.12.7)(rollup@4.18.0)(typescript@5.4.5)(vite@5.3.5) + vite-plugin-node-polyfills: + specifier: ^0.22.0 + version: 0.22.0(rollup@4.18.0)(vite@5.3.5) + packages/app-types: dependencies: '@summerfi/app-db': @@ -4855,6 +4913,7 @@ packages: dependencies: '@babel/highlight': 7.24.2 picocolors: 1.0.1 + dev: true /@babel/code-frame@7.24.7: resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} @@ -4866,6 +4925,7 @@ packages: /@babel/compat-data@7.24.4: resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} engines: {node: '>=6.9.0'} + dev: true /@babel/compat-data@7.24.7: resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} @@ -5001,13 +5061,13 @@ packages: dependencies: '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.24.5 + '@babel/helper-split-export-declaration': 7.24.7 semver: 6.3.1 dev: true @@ -5019,13 +5079,13 @@ packages: dependencies: '@babel/core': 7.24.7 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.7) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.24.5 + '@babel/helper-split-export-declaration': 7.24.7 semver: 6.3.1 dev: false @@ -5079,6 +5139,7 @@ packages: /@babel/helper-environment-visitor@7.22.20: resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-environment-visitor@7.24.7: resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} @@ -5090,8 +5151,9 @@ packages: resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 + dev: true /@babel/helper-function-name@7.24.7: resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} @@ -5104,7 +5166,7 @@ packages: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.7 dev: true /@babel/helper-hoist-variables@7.24.7: @@ -5206,6 +5268,7 @@ packages: /@babel/helper-plugin-utils@7.24.5: resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-plugin-utils@7.24.7: resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} @@ -5232,7 +5295,7 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 dev: true @@ -5244,7 +5307,7 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 dev: false @@ -5306,7 +5369,8 @@ packages: resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.7 + dev: true /@babel/helper-split-export-declaration@7.24.7: resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} @@ -5317,6 +5381,7 @@ packages: /@babel/helper-string-parser@7.24.1: resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-string-parser@7.24.7: resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} @@ -5325,10 +5390,12 @@ packages: /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-validator-identifier@7.24.5: resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-validator-identifier@7.24.7: resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} @@ -5381,6 +5448,7 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.1 + dev: true /@babel/highlight@7.24.7: resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} @@ -5397,6 +5465,7 @@ packages: hasBin: true dependencies: '@babel/types': 7.24.5 + dev: true /@babel/parser@7.24.7: resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} @@ -5476,7 +5545,7 @@ packages: dependencies: '@babel/core': 7.24.4 '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: true /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.24.7): @@ -5488,7 +5557,7 @@ packages: dependencies: '@babel/core': 7.24.7 '@babel/helper-create-class-features-plugin': 7.24.4(@babel/core@7.24.7) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: false /@babel/plugin-proposal-decorators@7.24.7(@babel/core@7.24.7): @@ -5559,7 +5628,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.24.4 + '@babel/compat-data': 7.24.7 '@babel/core': 7.24.4 '@babel/helper-compilation-targets': 7.24.7 '@babel/helper-plugin-utils': 7.24.7 @@ -5574,7 +5643,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.24.4 + '@babel/compat-data': 7.24.7 '@babel/core': 7.24.7 '@babel/helper-compilation-targets': 7.24.7 '@babel/helper-plugin-utils': 7.24.7 @@ -5624,7 +5693,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} @@ -5632,7 +5701,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: true /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.4): @@ -5641,7 +5710,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: true /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.7): @@ -5650,7 +5719,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.7): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} @@ -5707,7 +5776,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: true /@babel/plugin-syntax-flow@7.24.7(@babel/core@7.24.7): @@ -5756,7 +5825,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} @@ -5764,7 +5833,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.4): resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} @@ -5791,7 +5860,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} @@ -5799,7 +5868,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.7): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} @@ -5807,7 +5876,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.4): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} @@ -5815,7 +5884,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: true /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.7): @@ -5824,7 +5893,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} @@ -5832,7 +5901,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} @@ -5840,7 +5909,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.7): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} @@ -5859,7 +5928,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.4): resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} @@ -5898,7 +5967,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: true /@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.24.7): @@ -5947,7 +6016,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: true /@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.24.7): @@ -5967,7 +6036,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: true /@babel/plugin-transform-block-scoping@7.24.7(@babel/core@7.24.7): @@ -6018,7 +6087,7 @@ packages: '@babel/helper-compilation-targets': 7.24.7 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) '@babel/helper-split-export-declaration': 7.24.5 globals: 11.12.0 @@ -6050,7 +6119,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/template': 7.24.7 dev: true @@ -6072,7 +6141,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: true /@babel/plugin-transform-destructuring@7.24.7(@babel/core@7.24.7): @@ -6148,7 +6217,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.4) dev: true @@ -6170,7 +6239,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true @@ -6196,7 +6265,7 @@ packages: '@babel/core': 7.24.4 '@babel/helper-compilation-targets': 7.24.7 '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: true /@babel/plugin-transform-function-name@7.24.7(@babel/core@7.24.7): @@ -6229,7 +6298,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: true /@babel/plugin-transform-literals@7.24.7(@babel/core@7.24.7): @@ -6260,7 +6329,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: true /@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.24.7): @@ -6294,7 +6363,7 @@ packages: dependencies: '@babel/core': 7.24.4 '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.4) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/helper-simple-access': 7.22.5 transitivePeerDependencies: - supports-color @@ -6405,7 +6474,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.4) dev: true @@ -6454,7 +6523,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: true /@babel/plugin-transform-parameters@7.24.1(@babel/core@7.24.7): @@ -6464,7 +6533,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: false /@babel/plugin-transform-parameters@7.24.7(@babel/core@7.24.7): @@ -6512,7 +6581,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: true /@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.24.7): @@ -6532,7 +6601,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: true /@babel/plugin-transform-react-display-name@7.24.7(@babel/core@7.24.7): @@ -6565,7 +6634,6 @@ packages: dependencies: '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.24.7 - dev: false /@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==} @@ -6575,7 +6643,6 @@ packages: dependencies: '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.24.7 - dev: false /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.4): resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} @@ -6586,7 +6653,7 @@ packages: '@babel/core': 7.24.4 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.4) '@babel/types': 7.24.7 dev: true @@ -6663,7 +6730,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: true /@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.24.7): @@ -6683,7 +6750,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true @@ -6717,7 +6784,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: true /@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.24.7): @@ -6984,6 +7051,7 @@ packages: '@babel/code-frame': 7.24.2 '@babel/parser': 7.24.4 '@babel/types': 7.24.0 + dev: true /@babel/template@7.24.7: resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} @@ -7035,6 +7103,7 @@ packages: '@babel/helper-string-parser': 7.24.1 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + dev: true /@babel/types@7.24.5: resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} @@ -7043,6 +7112,7 @@ packages: '@babel/helper-string-parser': 7.24.1 '@babel/helper-validator-identifier': 7.24.5 to-fast-properties: 2.0.0 + dev: true /@babel/types@7.24.7: resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} @@ -11412,6 +11482,16 @@ packages: - supports-color dev: false + /@microsoft/api-extractor-model@7.28.13(@types/node@20.12.7): + resolution: {integrity: sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw==} + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 4.0.2(@types/node@20.12.7) + transitivePeerDependencies: + - '@types/node' + dev: true + /@microsoft/api-extractor-model@7.29.3(@types/node@20.12.7): resolution: {integrity: sha512-kEWjLr2ygL3ku9EGyjeTnL2S5IxyH9NaF1k1UoI0Nzwr4xEJBSWCVsWuF2+0lPUrRPA6mTY95fR264SJ5ETKQA==} dependencies: @@ -11421,6 +11501,27 @@ packages: transitivePeerDependencies: - '@types/node' + /@microsoft/api-extractor@7.43.0(@types/node@20.12.7): + resolution: {integrity: sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w==} + hasBin: true + dependencies: + '@microsoft/api-extractor-model': 7.28.13(@types/node@20.12.7) + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 4.0.2(@types/node@20.12.7) + '@rushstack/rig-package': 0.5.2 + '@rushstack/terminal': 0.10.0(@types/node@20.12.7) + '@rushstack/ts-command-line': 4.19.1(@types/node@20.12.7) + lodash: 4.17.21 + minimatch: 3.0.8 + resolve: 1.22.8 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.4.2 + transitivePeerDependencies: + - '@types/node' + dev: true + /@microsoft/api-extractor@7.47.2(@types/node@20.12.7): resolution: {integrity: sha512-YWE2HGrSTZaPPSr7xiNizSuViZpC7Jsa7+DwRW5rYVgrMXNbfX/PpBOoSkl5uaz9I2sv2JKLJ75kVNt64BvS3g==} hasBin: true @@ -13452,6 +13553,21 @@ packages: - supports-color dev: false + /@rollup/plugin-inject@5.0.5(rollup@4.18.0): + resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + estree-walker: 2.0.2 + magic-string: 0.30.10 + rollup: 4.18.0 + dev: true + /@rollup/plugin-replace@5.0.5(rollup@3.29.4): resolution: {integrity: sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ==} engines: {node: '>=14.0.0'} @@ -13617,6 +13733,23 @@ packages: resolution: {integrity: sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==} dev: true + /@rushstack/node-core-library@4.0.2(@types/node@20.12.7): + resolution: {integrity: sha512-hyES82QVpkfQMeBMteQUnrhASL/KHPhd7iJ8euduwNJG4mu2GSOKybf0rOEjOm1Wz7CwJEUm9y0yD7jg2C1bfg==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@types/node': 20.12.7 + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.8 + semver: 7.5.4 + z-schema: 5.0.5 + dev: true + /@rushstack/node-core-library@5.5.0(@types/node@20.12.7): resolution: {integrity: sha512-Cl3MYQ74Je5Y/EngMxcA3SpHjGZ/022nKbAO1aycGfQ+7eKyNCBu0oywj5B1f367GCzuHBgy+3BlVLKysHkXZw==} peerDependencies: @@ -13641,6 +13774,19 @@ packages: resolve: 1.22.8 strip-json-comments: 3.1.1 + /@rushstack/terminal@0.10.0(@types/node@20.12.7): + resolution: {integrity: sha512-UbELbXnUdc7EKwfH2sb8ChqNgapUOdqcCIdQP4NGxBpTZV2sQyeekuK3zmfQSa/MN+/7b4kBogl2wq0vpkpYGw==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@rushstack/node-core-library': 4.0.2(@types/node@20.12.7) + '@types/node': 20.12.7 + supports-color: 8.1.1 + dev: true + /@rushstack/terminal@0.13.2(@types/node@20.12.7): resolution: {integrity: sha512-t8i0PsGvBHmFBY8pryO3badqFlxQsm2rw3KYrzjcmVkG/WGklKg1qVkr9beAS1Oe8XWDRgj6SkoHkpNjs7aaNw==} peerDependencies: @@ -13653,6 +13799,17 @@ packages: '@types/node': 20.12.7 supports-color: 8.1.1 + /@rushstack/ts-command-line@4.19.1(@types/node@20.12.7): + resolution: {integrity: sha512-J7H768dgcpG60d7skZ5uSSwyCZs/S2HrWP1Ds8d1qYAyaaeJmpmmLr9BVw97RjFzmQPOYnoXcKA4GkqDCkduQg==} + dependencies: + '@rushstack/terminal': 0.10.0(@types/node@20.12.7) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + dev: true + /@rushstack/ts-command-line@4.22.2(@types/node@20.12.7): resolution: {integrity: sha512-xkvrGd6D9dPlI3I401Thc640WNsEPB1sGEmy12a2VJaPQPwhE6Ik0gEVPZJ/2G1w213eaCAdxUY1xpiTulsmpA==} dependencies: @@ -15603,8 +15760,8 @@ packages: /@types/babel__core@7.20.5: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: - '@babel/parser': 7.24.4 - '@babel/types': 7.24.5 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.5 @@ -15613,20 +15770,20 @@ packages: /@types/babel__generator@7.6.8: resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.7 dev: true /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.24.4 - '@babel/types': 7.24.5 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 dev: true /@types/babel__traverse@7.20.5: resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.7 dev: true /@types/bn.js@5.1.1: @@ -15757,6 +15914,12 @@ packages: dev: true optional: true + /@types/jsonwebtoken@9.0.6: + resolution: {integrity: sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==} + dependencies: + '@types/node': 20.14.2 + dev: true + /@types/loadable__component@5.13.9: resolution: {integrity: sha512-QWOtIkwZqHNdQj3nixQ8oyihQiTMKZLk/DNuvNxMSbTfxf47w+kqcbnxlUeBgAxdOtW0Dh48dTAIp83iJKtnrQ==} dependencies: @@ -16210,6 +16373,28 @@ packages: - '@swc/helpers' dev: true + /@vitejs/plugin-react@4.3.1(vite@5.3.5): + resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + dependencies: + '@babel/core': 7.24.7 + '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.24.7) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 5.3.5(@types/node@20.12.7)(sass@1.77.8) + transitivePeerDependencies: + - supports-color + dev: true + + /@volar/language-core@1.11.1: + resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} + dependencies: + '@volar/source-map': 1.11.1 + dev: true + /@volar/language-core@2.2.5: resolution: {integrity: sha512-2htyAuxRrAgETmFeUhT4XLELk3LiEcqoW/B8YUXMF6BrGWLMwIR09MFaZYvrA2UhbdAeSyeQ726HaWSWkexUcQ==} dependencies: @@ -16220,6 +16405,12 @@ packages: dependencies: '@volar/source-map': 2.3.4 + /@volar/source-map@1.11.1: + resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} + dependencies: + muggle-string: 0.3.1 + dev: true + /@volar/source-map@2.2.5: resolution: {integrity: sha512-wrOEIiZNf4E+PWB0AxyM4tfhkfldPsb3bxg8N6FHrxJH2ohar7aGu48e98bp3pR9HUA7P/pR9VrLmkTrgCCnWQ==} dependencies: @@ -16228,6 +16419,13 @@ packages: /@volar/source-map@2.3.4: resolution: {integrity: sha512-C+t63nwcblqLIVTYXaVi/+gC8NukDaDIQI72J3R7aXGvtgaVB16c+J8Iz7/VfOy7kjYv7lf5GhBny6ACw9fTGQ==} + /@volar/typescript@1.11.1: + resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} + dependencies: + '@volar/language-core': 1.11.1 + path-browserify: 1.0.1 + dev: true + /@volar/typescript@2.2.5: resolution: {integrity: sha512-eSV/n75+ppfEVugMC/salZsI44nXDPAyL6+iTYCNLtiLHGJsnMv9GwiDMujrvAUj/aLQyqRJgYtXRoxop2clCw==} dependencies: @@ -16253,8 +16451,28 @@ packages: /@vue/compiler-dom@3.4.27: resolution: {integrity: sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==} dependencies: - '@vue/compiler-core': 3.4.27 + '@vue/compiler-core': 3.4.27 + '@vue/shared': 3.4.27 + + /@vue/language-core@1.8.27(typescript@5.4.5): + resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@volar/language-core': 1.11.1 + '@volar/source-map': 1.11.1 + '@vue/compiler-dom': 3.4.27 '@vue/shared': 3.4.27 + computeds: 0.0.1 + minimatch: 9.0.4 + muggle-string: 0.3.1 + path-browserify: 1.0.1 + typescript: 5.4.5 + vue-template-compiler: 2.7.16 + dev: true /@vue/language-core@2.0.19(typescript@5.4.5): resolution: {integrity: sha512-A9EGOnvb51jOvnCYoRLnMP+CcoPlbZVxI9gZXE/y2GksRWM6j/PrLEIC++pnosWTN08tFpJgxhSS//E9v/Sg+Q==} @@ -18561,6 +18779,14 @@ packages: /asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + /asn1.js@4.10.1: + resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} + dependencies: + bn.js: 5.2.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + /asn1.js@5.4.1: resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} dependencies: @@ -18587,7 +18813,6 @@ packages: object-is: 1.1.6 object.assign: 4.1.5 util: 0.12.5 - dev: false /assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} @@ -19247,6 +19472,12 @@ packages: core-js: 2.6.12 dev: false + /browser-resolve@2.0.0: + resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==} + dependencies: + resolve: 1.22.8 + dev: true + /browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} dev: true @@ -19261,6 +19492,52 @@ packages: inherits: 2.0.4 safe-buffer: 5.2.1 + /browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + dev: true + + /browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + dependencies: + cipher-base: 1.0.4 + des.js: 1.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /browserify-rsa@4.1.0: + resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} + dependencies: + bn.js: 5.2.1 + randombytes: 2.1.0 + dev: true + + /browserify-sign@4.2.3: + resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} + engines: {node: '>= 0.12'} + dependencies: + bn.js: 5.2.1 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.5.5 + hash-base: 3.0.4 + inherits: 2.0.4 + parse-asn1: 5.1.7 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + dev: true + + /browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + dependencies: + pako: 1.0.11 + dev: true + /browserslist@4.23.0: resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -19334,6 +19611,10 @@ packages: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} dev: true + /buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + dev: false + /buffer-fill@1.0.0: resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} dev: false @@ -19381,6 +19662,10 @@ packages: engines: {node: '>=6'} dev: true + /builtin-status-codes@3.0.0: + resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} + dev: true + /builtins@1.0.3: resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} dev: false @@ -20061,6 +20346,10 @@ packages: engines: {node: ^14.18.0 || >=16.10.0} dev: false + /console-browserify@1.2.0: + resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} + dev: true + /constant-case@3.0.4: resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} dependencies: @@ -20068,6 +20357,10 @@ packages: tslib: 2.2.0 upper-case: 2.0.2 + /constants-browserify@1.0.0: + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + dev: true + /constructs@10.3.0: resolution: {integrity: sha512-vbK8i3rIb/xwZxSpTjz3SagHn1qq9BChLEfy5Hf6fB3/2eFbrwt2n9kHwQcS0CPTRBesreeAcsJfMq2229FnbQ==} engines: {node: '>= 16.14.0'} @@ -20193,6 +20486,13 @@ packages: readable-stream: 3.6.2 dev: true + /create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + dependencies: + bn.js: 5.2.1 + elliptic: 6.5.5 + dev: true + /create-hash@1.2.0: resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} dependencies: @@ -20306,6 +20606,22 @@ packages: /crypt@0.0.2: resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + /crypto-browserify@3.12.0: + resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.3 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + inherits: 2.0.4 + pbkdf2: 3.1.2 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + dev: true + /crypto-es@1.2.7: resolution: {integrity: sha512-UUqiVJ2gUuZFmbFsKmud3uuLcNP2+Opt+5ysmljycFCyhA0+T16XJmo1ev/t5kMChMqWh7IEvURNCqsg+SjZGQ==} dev: false @@ -20626,6 +20942,13 @@ packages: engines: {node: '>=6'} dev: true + /des.js@1.1.0: + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + /destr@2.0.3: resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} dev: false @@ -20760,6 +21083,14 @@ packages: engines: {node: '>=0.3.1'} dev: true + /diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + dependencies: + bn.js: 5.2.1 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + dev: true + /difflib@0.2.4: resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} dependencies: @@ -20805,6 +21136,11 @@ packages: entities: 4.5.0 dev: false + /domain-browser@4.23.0: + resolution: {integrity: sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==} + engines: {node: '>=10'} + dev: true + /domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} dev: false @@ -20896,7 +21232,6 @@ packages: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} dependencies: safe-buffer: 5.2.1 - dev: true /eciesjs@0.3.19: resolution: {integrity: sha512-b+PkRDZ3ym7HEcnbxc22CMVCpgsnr8+gGgST3U5PtgeX1luvINgfXW7efOyUtmn/jFtA/lg5ywBi/Uazf4oeaA==} @@ -22204,6 +22539,7 @@ packages: /ethereum-bloom-filters@1.1.0: resolution: {integrity: sha512-J1gDRkLpuGNvWYzWslBQR9cDV4nd4kfvVTE/Wy4Kkm4yb3EYRSlyi0eB/inTsSTTVyA0+HyzHgbr95Fn/Z1fSw==} + deprecated: do not use this package use package versions above as this can miss some topics dependencies: '@noble/hashes': 1.4.0 dev: true @@ -22491,7 +22827,6 @@ packages: /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - dev: false /evm-bn@1.1.2(@ethersproject/bignumber@5.7.0): resolution: {integrity: sha512-Lq8CT1EAjSeN+Yk0h1hpSwnZyMA4Xir6fQD4vlStljAuW2xr7qLOEGDLGsTa9sU2e40EYIumA4wYhMC/e+lyKw==} @@ -23845,6 +24180,14 @@ packages: dependencies: has-symbols: 1.0.3 + /hash-base@3.0.4: + resolution: {integrity: sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==} + engines: {node: '>=4'} + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + /hash-base@3.1.0: resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} engines: {node: '>=4'} @@ -24018,6 +24361,10 @@ packages: engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: false + /https-browserify@1.0.0: + resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + dev: true + /https-proxy-agent@5.0.0: resolution: {integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==} engines: {node: '>= 6'} @@ -24553,7 +24900,6 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - dev: false /is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} @@ -24785,6 +25131,11 @@ packages: engines: {node: '>=0.10.0'} dev: false + /isomorphic-timers-promises@1.0.1: + resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==} + engines: {node: '>=10'} + dev: true + /isomorphic-ws@4.0.1(ws@7.5.9): resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} peerDependencies: @@ -24841,8 +25192,8 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.24.4 - '@babel/parser': 7.24.4 + '@babel/core': 7.24.7 + '@babel/parser': 7.24.7 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -25708,6 +26059,22 @@ packages: /jsonschema@1.4.1: resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} + /jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.6.2 + dev: false + /jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -25722,6 +26089,21 @@ packages: resolution: {integrity: sha512-zriv+MY+61RXT0QsrO1ZJtL5umouqqSWmCGBkp2wJm35kniunBAA4qhUKx8Lvg/QcwrF9xuw9E6PkevKFf4boQ==} dev: false + /jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: false + + /jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + dev: false + /jwt-decode@3.1.2: resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} dev: false @@ -26143,13 +26525,35 @@ packages: resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} dev: true + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: true + + /lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + dev: false + + /lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + dev: false + /lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + + /lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + dev: false + + /lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} dev: false /lodash.isplainobject@4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - dev: true + + /lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + dev: false /lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} @@ -26158,6 +26562,10 @@ packages: /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + /lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + dev: false + /lodash.partition@4.6.0: resolution: {integrity: sha512-35L3dSF3Q6V1w5j6V3NhNlQjzsRDC/pYKCTdYTmwqSib+Q8ponkAmt/PwEOq3EmI38DSCl+SkIVwLd+uSlVdrg==} dev: false @@ -26716,6 +27124,14 @@ packages: braces: 3.0.3 picomatch: 2.3.1 + /miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + dependencies: + bn.js: 5.2.1 + brorand: 1.1.0 + dev: true + /mime-db@1.51.0: resolution: {integrity: sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==} engines: {node: '>= 0.6'} @@ -27081,6 +27497,10 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + /muggle-string@0.3.1: + resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} + dev: true + /muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} @@ -27321,6 +27741,39 @@ packages: '@babel/parser': 7.24.4 dev: true + /node-stdlib-browser@1.2.0: + resolution: {integrity: sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg==} + engines: {node: '>=10'} + dependencies: + assert: 2.1.0 + browser-resolve: 2.0.0 + browserify-zlib: 0.2.0 + buffer: 5.7.1 + console-browserify: 1.2.0 + constants-browserify: 1.0.0 + create-require: 1.1.1 + crypto-browserify: 3.12.0 + domain-browser: 4.23.0 + events: 3.3.0 + https-browserify: 1.0.0 + isomorphic-timers-promises: 1.0.1 + os-browserify: 0.3.0 + path-browserify: 1.0.1 + pkg-dir: 5.0.0 + process: 0.11.10 + punycode: 1.4.1 + querystring-es3: 0.2.1 + readable-stream: 3.6.2 + stream-browserify: 3.0.0 + stream-http: 3.2.0 + string_decoder: 1.3.0 + timers-browserify: 2.0.12 + tty-browserify: 0.0.1 + url: 0.11.3 + util: 0.12.5 + vm-browserify: 1.1.2 + dev: true + /node-stream-zip@1.15.0: resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} engines: {node: '>=0.12.0'} @@ -27444,7 +27897,6 @@ packages: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - dev: false /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} @@ -27697,6 +28149,10 @@ packages: wcwidth: 1.0.1 dev: true + /os-browserify@0.3.0: + resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + dev: true + /os-homedir@1.0.2: resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} engines: {node: '>=0.10.0'} @@ -27778,6 +28234,10 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: true + /pako@2.1.0: resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} dev: false @@ -27794,6 +28254,18 @@ packages: dependencies: callsites: 3.1.0 + /parse-asn1@5.1.7: + resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} + engines: {node: '>= 0.10'} + dependencies: + asn1.js: 4.10.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + hash-base: 3.0.4 + pbkdf2: 3.1.2 + safe-buffer: 5.2.1 + dev: true + /parse-cache-control@1.0.1: resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} dev: true @@ -28128,6 +28600,13 @@ packages: find-up: 4.1.0 dev: true + /pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + dependencies: + find-up: 5.0.0 + dev: true + /pkg-types@1.1.1: resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} dependencies: @@ -28525,6 +29004,17 @@ packages: /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + /public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + dependencies: + bn.js: 5.2.1 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + parse-asn1: 5.1.7 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: @@ -28633,6 +29123,11 @@ packages: strict-uri-encode: 2.0.0 dev: false + /querystring-es3@0.2.1: + resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} + engines: {node: '>=0.4.x'} + dev: true + /querystring@0.2.0: resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} engines: {node: '>=0.4.x'} @@ -28676,6 +29171,13 @@ packages: dependencies: safe-buffer: 5.2.1 + /randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -28980,7 +29482,6 @@ packages: /react-refresh@0.14.2: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} - dev: false /react-router-dom@6.24.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-960sKuau6/yEwS8e+NVEidYQb1hNjAYM327gjEyXlc6r3Skf2vtwuJ2l7lssdegD2YjoKG5l8MsVyeTDlVeY8g==} @@ -30496,13 +30997,21 @@ packages: dependencies: inherits: 2.0.4 readable-stream: 3.6.2 - dev: false /stream-buffers@2.2.0: resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==} engines: {node: '>= 0.10.0'} dev: false + /stream-http@3.2.0: + resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} + dependencies: + builtin-status-codes: 3.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + xtend: 4.0.2 + dev: true + /stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} @@ -31116,6 +31625,13 @@ packages: /through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + /timers-browserify@2.0.12: + resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} + engines: {node: '>=0.6.0'} + dependencies: + setimmediate: 1.0.5 + dev: true + /timers-ext@0.1.7: resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} dependencies: @@ -31406,6 +31922,10 @@ packages: fsevents: 2.3.3 dev: true + /tty-browserify@0.0.1: + resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} + dev: true + /turbo-darwin-64@1.13.2: resolution: {integrity: sha512-CCSuD8CfmtncpohCuIgq7eAzUas0IwSbHfI8/Q3vKObTdXyN8vAo01gwqXjDGpzG9bTEVedD0GmLbD23dR0MLA==} cpu: [x64] @@ -31885,6 +32405,13 @@ packages: querystring: 0.2.0 dev: true + /url@0.11.3: + resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==} + dependencies: + punycode: 1.4.1 + qs: 6.12.1 + dev: true + /urlpattern-polyfill@10.0.0: resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} dev: true @@ -32021,6 +32548,11 @@ packages: builtins: 1.0.3 dev: false + /validator@13.12.0: + resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} + engines: {node: '>= 0.10'} + dev: true + /valtio@1.11.0(react@18.3.1): resolution: {integrity: sha512-65Yd0yU5qs86b5lN1eu/nzcTgQ9/6YnD6iO+DDaDbQLn1Zv2w12Gwk43WkPlUBxk5wL/6cD5YMFf7kj6HZ1Kpg==} engines: {node: '>=12.20.0'} @@ -32183,6 +32715,31 @@ packages: - zod dev: false + /vite-plugin-dts@3.9.1(@types/node@20.12.7)(rollup@4.18.0)(typescript@5.4.5)(vite@5.3.5): + resolution: {integrity: sha512-rVp2KM9Ue22NGWB8dNtWEr+KekN3rIgz1tWD050QnRGlriUCmaDwa7qA5zDEjbXg5lAXhYMSBJtx3q3hQIJZSg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + '@microsoft/api-extractor': 7.43.0(@types/node@20.12.7) + '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@vue/language-core': 1.8.27(typescript@5.4.5) + debug: 4.3.4(supports-color@8.1.1) + kolorist: 1.8.0 + magic-string: 0.30.10 + typescript: 5.4.5 + vite: 5.3.5(@types/node@20.12.7)(sass@1.77.8) + vue-tsc: 1.8.27(typescript@5.4.5) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + dev: true + /vite-plugin-dts@4.0.0-beta.1(@types/node@20.12.7)(rollup@4.18.0)(typescript@5.4.5)(vite@5.3.5): resolution: {integrity: sha512-4ILGS8ClSYiNMtSRo4YxJ+JeC2P4uZgo9cQ7Yav+CLSxcoWBffjJ6B1QKcn5BhniXJQkb1j6Bi0MCj5C5+i4Sg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -32221,6 +32778,18 @@ packages: vite: 5.3.5(@types/node@20.12.7)(sass@1.77.8) dev: true + /vite-plugin-node-polyfills@0.22.0(rollup@4.18.0)(vite@5.3.5): + resolution: {integrity: sha512-F+G3LjiGbG8QpbH9bZ//GSBr9i1InSTkaulfUHFa9jkLqVGORFBoqc2A/Yu5Mmh1kNAbiAeKeK+6aaQUf3x0JA==} + peerDependencies: + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + dependencies: + '@rollup/plugin-inject': 5.0.5(rollup@4.18.0) + node-stdlib-browser: 1.2.0 + vite: 5.3.5(@types/node@20.12.7)(sass@1.77.8) + transitivePeerDependencies: + - rollup + dev: true + /vite-plugin-svgo@1.4.0(typescript@5.4.5)(vite@5.3.5): resolution: {integrity: sha512-ZBXydVOVkpLftdYG55DIcgUZDNgEu41RAwjzrqdtZkMzpxvDD8s5pQkxTLy4nj9wD6AWtevNRvA2SdSJLFe6Iw==} peerDependencies: @@ -32289,6 +32858,10 @@ packages: resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} dev: false + /vm-browserify@1.1.2: + resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + dev: true + /void-elements@3.1.0: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} @@ -32303,6 +32876,18 @@ packages: de-indent: 1.0.2 he: 1.2.0 + /vue-tsc@1.8.27(typescript@5.4.5): + resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} + hasBin: true + peerDependencies: + typescript: '*' + dependencies: + '@volar/typescript': 1.11.1 + '@vue/language-core': 1.8.27(typescript@5.4.5) + semver: 7.6.2 + typescript: 5.4.5 + dev: true + /vue-tsc@2.0.19(typescript@5.4.5): resolution: {integrity: sha512-JWay5Zt2/871iodGF72cELIbcAoPyhJxq56mPPh+M2K7IwI688FMrFKc/+DvB05wDWEuCPexQJ6L10zSwzzapg==} hasBin: true @@ -32956,6 +33541,18 @@ packages: resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} dev: true + /z-schema@5.0.5: + resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} + engines: {node: '>=8.0.0'} + hasBin: true + dependencies: + lodash.get: 4.4.2 + lodash.isequal: 4.5.0 + validator: 13.12.0 + optionalDependencies: + commander: 9.5.0 + dev: true + /zip-stream@4.1.1: resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} engines: {node: '>= 10'}