diff --git a/jest.config.js b/jest.config.js index cc26dee..af05d96 100644 --- a/jest.config.js +++ b/jest.config.js @@ -8,6 +8,7 @@ module.exports = { transform: { '^.+\\.(ts|js|tsx|jsx)$': ['@swc/jest'] }, + setupFilesAfterEnv: ['/src/setupTests.js'], transformIgnorePatterns: ['node_modules/(^.+\\\\.(ts|js|tsx|jsx)$)'], testMatch: [ '**/__tests__/**/*.[jt]s?(x)', diff --git a/package.json b/package.json index b9ce8aa..eccb038 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "@multiversx/sdk-dapp-core", "version": "0.0.0-alpha.1", "main": "out/index.js", - "module": "out/index.mjs", + "module": "out/index.js", "types": "out/index.d.ts", "description": "A library to hold core logic for building TypeScript dApps on the MultiversX blockchain", "author": "MultiversX", @@ -20,32 +20,43 @@ }, "scripts": { "compile": "tsc && tsc-alias", - "compile-next": "rimraf out && tsc --p tsconfig.next.json && tsc-alias --project tsconfig.next.json", "build-esbuild": "rimraf out && node esbuild.js", + "publish-verdaccio": "npm unpublish --registry http://localhost:4873 @multiversx/sdk-dapp-core@0.0.0-alpha.3 && rimraf out && yarn compile && npm publish --registry http://localhost:4873", "build": "yarn build-esbuild && yarn compile", - "test": "jest" + "test": "jest", + "compile-next": "rimraf out && tsc --p tsconfig.next.json && tsc-alias --project tsconfig.next.json" }, "publishConfig": { "access": "public" }, "dependencies": { - "@multiversx/sdk-web-wallet-cross-window-provider": "0.1.3", + "@multiversx/sdk-native-auth-client": "^1.0.8", + "@multiversx/sdk-web-wallet-cross-window-provider": "0.2.0", + "@types/lodash": "^4.17.4", + "isomorphic-fetch": "^3.0.0", + "lodash": "^4.17.21", "zustand": "^4.4.7" }, "peerDependencies": { + "@multiversx/sdk-core": ">= 13.0.0", "@multiversx/sdk-dapp-utils": "^0.0.1", - "@multiversx/sdk-core": ">= 12.18.0", - "axios": ">=1.6.5" + "axios": ">=1.6.5", + "bignumber.js": "9.x" + }, + "resolutions": { + "string-width": "4.1.0" }, "devDependencies": { + "@multiversx/sdk-core": ">= 13.0.0", "@multiversx/sdk-dapp-utils": "^0.0.1", - "@multiversx/sdk-core": ">= 12.18.0", "@swc/core": "^1.4.17", "@swc/jest": "^0.2.36", "@types/node": "20.12.8", "@typescript-eslint/eslint-plugin": "7.8.0", "@typescript-eslint/parser": "7.8.0", "axios": ">=1.6.5", + "axios-mock-adapter": "^1.22.0", + "bignumber.js": "9.x", "esbuild": "^0.21.1", "eslint": "9.1.1", "eslint-config-prettier": "9.1.0", @@ -59,7 +70,7 @@ "immer": "^10.1.1", "jest": "29.7.0", "jest-environment-jsdom": "29.7.0", - "lit": "^3.1.3", + "msw": "1.3.1", "prettier": "3.2.5", "protobufjs": "^7.3.0", "react": "^18.3.1", diff --git a/src/__mocks__/accountConfig.ts b/src/__mocks__/accountConfig.ts new file mode 100644 index 0000000..88dbf16 --- /dev/null +++ b/src/__mocks__/accountConfig.ts @@ -0,0 +1,11 @@ +import { fallbackNetworkConfigurations } from 'constants/network'; +import { EnvironmentsEnum } from 'types'; + +export const testAddress = + 'erd1dm9uxpf5awkn7uhju7zjn9lde0dhahy0qaxqqlu26xcuuw27qqrsqfmej3'; + +export const testNetwork = + fallbackNetworkConfigurations[EnvironmentsEnum.devnet]; + +export const testReceiver = + 'erd1qqqqqqqqqqqqqpgqp699jngundfqw07d8jzkepucvpzush6k3wvqyc44rx'; diff --git a/src/__mocks__/data/account.ts b/src/__mocks__/data/account.ts new file mode 100644 index 0000000..de94a6b --- /dev/null +++ b/src/__mocks__/data/account.ts @@ -0,0 +1,10 @@ +export const account = { + address: 'erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx', + balance: '116893786890813785912', + nonce: 12320, + shard: 0, + rootHash: 'wICKVeNpCg/TsBRyRyZMMMhcW1KENpAbopfinRVyENQ=', + txCount: 12655, + scrCount: 14084, + developerReward: '0' +}; diff --git a/src/__mocks__/data/blocks.ts b/src/__mocks__/data/blocks.ts new file mode 100644 index 0000000..c847598 --- /dev/null +++ b/src/__mocks__/data/blocks.ts @@ -0,0 +1,6 @@ +export const blocks = [ + { + hash: 'fff67d31476ad920d53093a3a4c2178e198179b35656eeefa419107fa718b780', + timestamp: 1671204768 + } +]; diff --git a/src/__mocks__/data/dappConfig.ts b/src/__mocks__/data/dappConfig.ts new file mode 100644 index 0000000..a4efe06 --- /dev/null +++ b/src/__mocks__/data/dappConfig.ts @@ -0,0 +1,16 @@ +export const dappConfig = { + id: 'devnet', + name: 'Devnet', + egldLabel: 'xEGLD', + decimals: '4', + egldDenomination: '18', + gasPerDataByte: '1500', + apiTimeout: '4000', + walletConnectDeepLink: + 'https://maiar.page.link/?apn=com.elrond.maiar.wallet&isi=1519405832&ibi=com.elrond.maiar.wallet&link=https://xportal.com/', + walletConnectBridgeAddresses: ['https://bridge.walletconnect.org'], + walletAddress: 'https://devnet-wallet.multiversx.com', + apiAddress: 'https://devnet-api.multiversx.com', + explorerAddress: 'http://devnet-explorer.multiversx.com', + chainId: 'D' +}; diff --git a/src/__mocks__/data/index.ts b/src/__mocks__/data/index.ts new file mode 100644 index 0000000..0b98b72 --- /dev/null +++ b/src/__mocks__/data/index.ts @@ -0,0 +1,7 @@ +export * from './account'; +export * from './blocks'; +export * from './networkConfig'; +export * from './dappConfig'; +export * from './socketResponse'; +export * from './websocketConfig'; +export * from './blocks'; diff --git a/src/__mocks__/data/networkConfig.ts b/src/__mocks__/data/networkConfig.ts new file mode 100644 index 0000000..2d31516 --- /dev/null +++ b/src/__mocks__/data/networkConfig.ts @@ -0,0 +1,28 @@ +export const networkConfig = { + data: { + config: { + erd_adaptivity: 'false', + erd_chain_id: 'D', + erd_denomination: 18, + erd_gas_per_data_byte: 1500, + erd_gas_price_modifier: '0.01', + erd_hysteresis: '0.200000', + erd_latest_tag_software_version: 'D1.3.50.0-hf01', + erd_max_gas_per_transaction: 600000000, + erd_meta_consensus_group_size: 58, + erd_min_gas_limit: 50000, + erd_min_gas_price: 1000000000, + erd_min_transaction_version: 1, + erd_num_metachain_nodes: 58, + erd_num_nodes_in_shard: 58, + erd_num_shards_without_meta: 3, + erd_rewards_top_up_gradient_point: '2000000000000000000000000', + erd_round_duration: 6000, + erd_rounds_per_epoch: 1200, + erd_shard_consensus_group_size: 21, + erd_start_time: 1648551600, + erd_top_up_factor: '0.500000' + } + }, + code: 'successful' +}; diff --git a/src/__mocks__/data/socketResponse.ts b/src/__mocks__/data/socketResponse.ts new file mode 100644 index 0000000..751c83b --- /dev/null +++ b/src/__mocks__/data/socketResponse.ts @@ -0,0 +1,7 @@ +export const socketResponse = { + sid: 'RlV7upxKjiJRyIhRAKb5', + upgrades: ['websocket'], + pingInterval: 25000, + pingTimeout: 20000, + maxPayload: 1000000 +}; diff --git a/src/__mocks__/data/websocketConfig.ts b/src/__mocks__/data/websocketConfig.ts new file mode 100644 index 0000000..a396a6f --- /dev/null +++ b/src/__mocks__/data/websocketConfig.ts @@ -0,0 +1 @@ +export const websocketConfig = { url: 'devnet-socket-api.multiversx.com' }; diff --git a/src/__mocks__/index.ts b/src/__mocks__/index.ts new file mode 100644 index 0000000..79e52c3 --- /dev/null +++ b/src/__mocks__/index.ts @@ -0,0 +1,3 @@ +export * from './accountConfig'; +export * from './server'; +export * from './utils'; diff --git a/src/__mocks__/server.ts b/src/__mocks__/server.ts new file mode 100644 index 0000000..5ced374 --- /dev/null +++ b/src/__mocks__/server.ts @@ -0,0 +1,55 @@ +import { + DefaultBodyType, + PathParams, + ResponseComposition, + rest, + RestContext, + RestRequest +} from 'msw'; +import { setupServer } from 'msw/node'; +import { testAddress, testNetwork } from './accountConfig'; +import { + account, + blocks, + dappConfig, + networkConfig, + socketResponse, + websocketConfig +} from './data'; + +export const mockResponse = + (body: T) => + ( + _req: RestRequest>, + res: ResponseComposition, + ctx: RestContext + ) => { + return res(ctx.status(200), ctx.json(body)); + }; + +const handlers = [ + rest.get(`${testNetwork.apiAddress}/dapp/config`, mockResponse(dappConfig)), + + rest.get( + `${testNetwork.apiAddress}/network/config`, + mockResponse(networkConfig) + ), + rest.get( + `https://${websocketConfig.url}/socket.io/`, + mockResponse(socketResponse) + ), + rest.get( + `${testNetwork.apiAddress}/websocket/config`, + mockResponse(websocketConfig) + ), + rest.get( + `${testNetwork.apiAddress}/accounts/${testAddress}`, + mockResponse(account) + ), + rest.get(`${testNetwork.apiAddress}/blocks`, mockResponse(blocks)) +]; + +// This configures a request mocking server with the given request handlers. +const server = setupServer(...handlers); + +export { server, rest }; diff --git a/src/__mocks__/utils/index.ts b/src/__mocks__/utils/index.ts new file mode 100644 index 0000000..f3653b5 --- /dev/null +++ b/src/__mocks__/utils/index.ts @@ -0,0 +1,2 @@ +export * from './mockWindowLocation'; +export * from './mockWindowHistory'; diff --git a/src/__mocks__/utils/mockWindowHistory.ts b/src/__mocks__/utils/mockWindowHistory.ts new file mode 100644 index 0000000..71b0e74 --- /dev/null +++ b/src/__mocks__/utils/mockWindowHistory.ts @@ -0,0 +1,24 @@ +export const mockWindowHistory = () => { + if (!window) { + return; + } + + const history = window.history; + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + delete window.history; + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + window.history = Object.defineProperties( + {}, + { + ...Object.getOwnPropertyDescriptors(history), + pushState: { + configurable: true, + value: jest.fn() + } + } + ); +}; diff --git a/src/__mocks__/utils/mockWindowLocation.ts b/src/__mocks__/utils/mockWindowLocation.ts new file mode 100644 index 0000000..765ea51 --- /dev/null +++ b/src/__mocks__/utils/mockWindowLocation.ts @@ -0,0 +1,24 @@ +export const mockWindowLocation = () => { + if (!window) { + return; + } + + const location = window.location; + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + delete window.location; + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + window.location = Object.defineProperties( + {}, + { + ...Object.getOwnPropertyDescriptors(location), + assign: { + configurable: true, + value: jest.fn() + } + } + ); +}; diff --git a/src/apiCalls/configuration/getNetworkConfigFromApi.ts b/src/apiCalls/configuration/getNetworkConfigFromApi.ts index 4d4c57b..827fa24 100644 --- a/src/apiCalls/configuration/getNetworkConfigFromApi.ts +++ b/src/apiCalls/configuration/getNetworkConfigFromApi.ts @@ -1,6 +1,6 @@ import axios from 'axios'; import { getCleanApiAddress } from 'store/slices/network/actions/getCleanApiAddress'; -import { ApiNetworkConfigType } from '../../types/network.types'; +import { ApiNetworkConfigType } from 'types/network.types'; import { NETWORK_CONFIG_ENDPOINT } from '../endpoints'; const urlIsValid = (url: string) => { diff --git a/src/apiCalls/configuration/getServerConfiguration.ts b/src/apiCalls/configuration/getServerConfiguration.ts index 146f427..a1cfc6a 100644 --- a/src/apiCalls/configuration/getServerConfiguration.ts +++ b/src/apiCalls/configuration/getServerConfiguration.ts @@ -1,5 +1,5 @@ import axios from 'axios'; -import { NetworkType } from '../../types/network.types'; +import { NetworkType } from 'types/network.types'; import { CONFIG_ENDPOINT } from '../endpoints'; export async function getServerConfiguration(apiAddress: string) { diff --git a/src/constants/index.ts b/src/constants/index.ts index 06db51e..fd0ba1b 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -1,3 +1,4 @@ export * from './network'; +export * from './placeholders'; export * from './storage'; export * from './window'; diff --git a/src/constants/network.ts b/src/constants/network.ts index 91d9d66..d8b5490 100644 --- a/src/constants/network.ts +++ b/src/constants/network.ts @@ -1,5 +1,5 @@ -import { EnvironmentsEnum } from '../types/enums.types'; -import { NetworkType } from '../types/network.types'; +import { EnvironmentsEnum } from 'types/enums.types'; +import { NetworkType } from 'types/network.types'; export const fallbackNetworkConfigurations: Record< keyof typeof EnvironmentsEnum, diff --git a/src/constants/placeholders.ts b/src/constants/placeholders.ts new file mode 100644 index 0000000..70dd268 --- /dev/null +++ b/src/constants/placeholders.ts @@ -0,0 +1,8 @@ +/** + * Not Applicable + * @value N/A + */ +export const N_A = 'N/A'; + +export const ZERO = '0'; +export const ELLIPSIS = '...'; diff --git a/src/constants/window.ts b/src/constants/window.ts index 7cc8ac7..d689b28 100644 --- a/src/constants/window.ts +++ b/src/constants/window.ts @@ -1,2 +1,2 @@ -export const safeWindow = +export const safeWindow: Window = typeof window !== 'undefined' ? window : ({} as Window); diff --git a/src/index.ts b/src/index.ts index 98e9a04..da8bbda 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,3 +3,5 @@ export * from './constants'; export * from './apiCalls'; export * from './store'; export * from './types'; +export * from './services'; +export * from './utils'; diff --git a/src/services/index.ts b/src/services/index.ts new file mode 100644 index 0000000..2bdf677 --- /dev/null +++ b/src/services/index.ts @@ -0,0 +1 @@ +export * from './nativeAuth'; diff --git a/src/services/nativeAuth/helpers/decodeLoginToken.ts b/src/services/nativeAuth/helpers/decodeLoginToken.ts new file mode 100644 index 0000000..c2057d6 --- /dev/null +++ b/src/services/nativeAuth/helpers/decodeLoginToken.ts @@ -0,0 +1,40 @@ +import isString from 'lodash/isString'; +import { decodeBase64 } from 'utils/decoders/base64Utils'; + +export interface DecodedLoginTokenType { + blockHash: string; + extraInfo?: { timestamp: number }; + origin: string; + ttl: number; +} + +export const decodeLoginToken = ( + loginToken: string +): DecodedLoginTokenType | null => { + if (!loginToken || !isString(loginToken)) { + return null; + } + + const parts = loginToken.split('.'); + + if (parts.length !== 4) { + return null; + } + + try { + const [origin, blockHash, ttl, extraInfo] = parts; + const parsedExtraInfo = JSON.parse(decodeBase64(extraInfo)); + const parsedOrigin = decodeBase64(origin); + + return { + ttl: Number(ttl), + extraInfo: parsedExtraInfo, + origin: parsedOrigin, + blockHash + }; + } catch (e) { + console.error(`Error trying to decode ${loginToken}:`, e); + + return null; + } +}; diff --git a/src/services/nativeAuth/helpers/decodeNativeAuthToken.ts b/src/services/nativeAuth/helpers/decodeNativeAuthToken.ts new file mode 100644 index 0000000..35c1881 --- /dev/null +++ b/src/services/nativeAuth/helpers/decodeNativeAuthToken.ts @@ -0,0 +1,63 @@ +import { decodeBase64 } from 'utils/decoders/base64Utils'; +import { DecodedLoginTokenType, decodeLoginToken } from './decodeLoginToken'; + +function isString(x: any) { + return Object.prototype.toString.call(x) === '[object String]'; +} + +interface DecodedNativeAuthTokenType extends DecodedLoginTokenType { + address: string; + body: string; + signature: string; +} + +export const decodeNativeAuthToken = ( + accessToken?: string +): DecodedNativeAuthTokenType | null => { + if (!accessToken || !isString(accessToken)) { + return null; + } + + const parts = accessToken.split('.'); + + if (parts.length !== 3) { + console.error( + 'Invalid nativeAuthToken. You may be trying to decode a loginToken. Try using decodeLoginToken method instead' + ); + return null; + } + + try { + const [address, body, signature] = parts; + const parsedAddress = decodeBase64(address); + const parsedBody = decodeBase64(body); + const parsedInitToken = decodeLoginToken(parsedBody); + + if (!parsedInitToken) { + return { + address: parsedAddress, + body: parsedBody, + signature, + blockHash: '', + origin: '', + ttl: 0 + }; + } + + const result = { + ...parsedInitToken, + address: parsedAddress, + body: parsedBody, + signature + }; + + // if empty object, delete extraInfo + if (!parsedInitToken.extraInfo?.timestamp) { + delete result.extraInfo; + } + + return result; + } catch (err) { + return null; + } +}; diff --git a/src/services/nativeAuth/helpers/getLatestBlockHash.ts b/src/services/nativeAuth/helpers/getLatestBlockHash.ts new file mode 100644 index 0000000..72e3375 --- /dev/null +++ b/src/services/nativeAuth/helpers/getLatestBlockHash.ts @@ -0,0 +1,99 @@ +import axios from 'axios'; +import { BLOCKS_ENDPOINT } from 'apiCalls/endpoints'; +import { retryMultipleTimes } from 'utils/retryMultipleTimes'; + +export interface LatestBlockHashType { + hash: string; + timestamp: number; +} + +const getBlockFromPosition = 4; +const cachingDurationMs = 30000; // 30 seconds, a block hash is valid for 1 minute from its generation +//this is an object with .current, so it doesn't get affected by closure and is always a fresh value +const cachedResponse: Record = { + current: null +}; + +const requestPromise: { + current: Promise | null; +} = { + current: null +}; + +const getLatestBlockHashFromServer = retryMultipleTimes( + async ( + apiUrl: string, + blockHashShard?: number, + getBlockHash?: () => Promise + ): Promise => { + // get current block hash + if (getBlockHash) { + const timestamp = Math.floor(Date.now() / 1000); + const hash = await getBlockHash(); + + return { hash, timestamp }; + } + + //get the penultimate block hash (3 shards + the meta chain) to make sure that the block is seen by auth server + const { data } = await axios.get>( + `${apiUrl}/${BLOCKS_ENDPOINT}?from=${getBlockFromPosition}&size=1&fields=hash,timestamp${ + blockHashShard ? '&shard=' + blockHashShard : '' + }` + ); + const [latestBlock] = data; + return latestBlock; + } +); + +// TODO: make getLatestBlockHash accept an object and make getBlockHash param mandatory (to replace axios call) +export async function getLatestBlockHash( + apiUrl: string, + blockHashShard?: number, + getBlockHash?: () => Promise, + noCache?: boolean +): Promise { + if (apiUrl == null) { + throw new Error('missing api url'); + } + + const currentTimestampMs = Date.now(); + if ( + cachedResponse.current != null && + currentTimestampMs < + cachedResponse.current.timestamp * 1000 + cachingDurationMs && + !noCache + ) { + return cachedResponse.current; + } + //this will prevent multiple calls to this function from generating multiple hashes + if (requestPromise.current != null) { + //if there is already an await in progress for the API, just return the result of that promise + return await requestPromise.current; + } + + //if a promise is not in progress, get a new promise and add it to the promise + requestPromise.current = getLatestBlockHashFromServer( + apiUrl, + blockHashShard, + getBlockHash + ); + + try { + const response = await requestPromise.current; + if (response == null) { + requestPromise.current = null; + throw new Error('could not get block hash'); + } + //set the new response, the new expiry and unlock the regeneration flow for the next expiration period + cachedResponse.current = { + hash: response.hash, + timestamp: response.timestamp + }; + + requestPromise.current = null; + return response; + } catch (err) { + requestPromise.current = null; + return null as any; + } +} diff --git a/src/services/nativeAuth/helpers/index.ts b/src/services/nativeAuth/helpers/index.ts new file mode 100644 index 0000000..f81bf87 --- /dev/null +++ b/src/services/nativeAuth/helpers/index.ts @@ -0,0 +1,3 @@ +export * from './decodeLoginToken'; +export * from './decodeNativeAuthToken'; +export * from './getLatestBlockHash'; diff --git a/src/services/nativeAuth/helpers/tests/decodeLoginToken.test.ts b/src/services/nativeAuth/helpers/tests/decodeLoginToken.test.ts new file mode 100644 index 0000000..38ca7ba --- /dev/null +++ b/src/services/nativeAuth/helpers/tests/decodeLoginToken.test.ts @@ -0,0 +1,27 @@ +import { decodeLoginToken } from '../decodeLoginToken'; + +const loginToken = + 'bG9jYWxob3N0.f2d0897d0ca185a884349b10842a9fe4c749472d75cee30e311a82de29acd52b.86400.eyJ0aW1lc3RhbXAiOjE2Nzc1ODg3ODZ9'; + +describe('decodeLoginToken tests', () => { + it('decodes loginToken token', () => { + const parsed = decodeLoginToken(loginToken); + expect(parsed).toStrictEqual({ + blockHash: + 'f2d0897d0ca185a884349b10842a9fe4c749472d75cee30e311a82de29acd52b', + extraInfo: { + timestamp: 1677588786 + }, + origin: 'localhost', + ttl: 86400 + }); + }); + it('decodes empty', () => { + const parsed = decodeLoginToken(''); + expect(parsed).toStrictEqual(null); + }); + it('decodes invalid', () => { + const parsed = decodeLoginToken('invalid'); + expect(parsed).toStrictEqual(null); + }); +}); diff --git a/src/services/nativeAuth/helpers/tests/decodeNativeAuthToken.test.ts b/src/services/nativeAuth/helpers/tests/decodeNativeAuthToken.test.ts new file mode 100644 index 0000000..599b381 --- /dev/null +++ b/src/services/nativeAuth/helpers/tests/decodeNativeAuthToken.test.ts @@ -0,0 +1,39 @@ +import { decodeNativeAuthToken } from '../decodeNativeAuthToken'; + +const nativeAuthToken = + 'ZXJkMWRtOXV4cGY1YXdrbjd1aGp1N3pqbjlsZGUwZGhhaHkwcWF4cXFsdTI2eGN1dXcyN3FxcnNxZm1lajM.Ykc5allXeG9iM04wLjk1NWJlODgyMTc5ODVjNTFkMTIxYzUxZTExYTdmN2E3ZWI2OGVhYjBiOWEzOThiMDc3ZTcyNGUyYzJiNjRiOTUuODY0MDAuZXlKMGFXMWxjM1JoYlhBaU9qRTJOamszTXpBNU16Ujk.31c394d9b8532a412a707e22dbba20e87f3c9029df02b6b8d28857736059134419cf2ceb5340e83cab882d991771f629b2d4baca3d6f55a1ee31278a312f4707'; + +describe('decodeNativeAuthToken tests', () => { + it('decodes nativeAuthToken token', () => { + const parsed = decodeNativeAuthToken(nativeAuthToken); + expect(parsed).toStrictEqual({ + address: 'erd1dm9uxpf5awkn7uhju7zjn9lde0dhahy0qaxqqlu26xcuuw27qqrsqfmej3', + blockHash: + '955be88217985c51d121c51e11a7f7a7eb68eab0b9a398b077e724e2c2b64b95', + body: 'bG9jYWxob3N0.955be88217985c51d121c51e11a7f7a7eb68eab0b9a398b077e724e2c2b64b95.86400.eyJ0aW1lc3RhbXAiOjE2Njk3MzA5MzR9', + extraInfo: { + timestamp: 1669730934 + }, + origin: 'localhost', + signature: + '31c394d9b8532a412a707e22dbba20e87f3c9029df02b6b8d28857736059134419cf2ceb5340e83cab882d991771f629b2d4baca3d6f55a1ee31278a312f4707', + ttl: 86400 + }); + }); + it('decodes null', () => { + const parsed = decodeNativeAuthToken(null as any); + expect(parsed).toStrictEqual(null); + }); + it('decodes empty', () => { + const parsed = decodeNativeAuthToken(''); + expect(parsed).toStrictEqual(null); + }); + it('decodes invalid', () => { + const parsed = decodeNativeAuthToken('invalid'); + expect(parsed).toStrictEqual(null); + }); + it('decodes undefined', () => { + const parsed = decodeNativeAuthToken(undefined); + expect(parsed).toStrictEqual(null); + }); +}); diff --git a/src/services/nativeAuth/index.ts b/src/services/nativeAuth/index.ts new file mode 100644 index 0000000..2bdf677 --- /dev/null +++ b/src/services/nativeAuth/index.ts @@ -0,0 +1 @@ +export * from './nativeAuth'; diff --git a/src/services/nativeAuth/methods/getNativeAuthConfig.ts b/src/services/nativeAuth/methods/getNativeAuthConfig.ts new file mode 100644 index 0000000..78b8f9f --- /dev/null +++ b/src/services/nativeAuth/methods/getNativeAuthConfig.ts @@ -0,0 +1,29 @@ +import { getWindowLocation } from 'utils/window/getWindowLocation'; +import { NativeAuthConfigType } from '../nativeAuth.types'; + +const defaultNativeAuthConfig = { + origin: getWindowLocation().origin, + apiAddress: 'https://api.multiversx.com', + expirySeconds: 60 * 60 * 24, // one day + tokenExpirationToastWarningSeconds: 5 * 60 // five minutes +}; + +export const getNativeAuthConfig = (config?: NativeAuthConfigType | true) => { + if (config === true) { + return defaultNativeAuthConfig; + } + const nativeAuthConfig = { + origin: config?.origin ?? defaultNativeAuthConfig.origin, + blockHashShard: config?.blockHashShard, + expirySeconds: + config?.expirySeconds ?? defaultNativeAuthConfig.expirySeconds, + apiAddress: config?.apiAddress ?? defaultNativeAuthConfig.apiAddress, + tokenExpirationToastWarningSeconds: + config?.tokenExpirationToastWarningSeconds ?? + defaultNativeAuthConfig.tokenExpirationToastWarningSeconds, + extraInfo: config?.extraInfo ?? {}, + gatewayUrl: config?.gatewayUrl, + extraRequestHeaders: config?.extraRequestHeaders ?? {} + }; + return nativeAuthConfig; +}; diff --git a/src/services/nativeAuth/methods/getTokenExpiration.ts b/src/services/nativeAuth/methods/getTokenExpiration.ts new file mode 100644 index 0000000..860f4ef --- /dev/null +++ b/src/services/nativeAuth/methods/getTokenExpiration.ts @@ -0,0 +1,43 @@ +import { getUnixTimestamp } from 'utils/dateTime/getUnixTimestamp'; +import { decodeNativeAuthToken } from '../helpers/decodeNativeAuthToken'; + +export interface GetTokenExpirationReturnType { + isExpired: boolean; + expiresAt?: number; + secondsUntilExpires?: number; +} + +const notFound = { + isExpired: false +}; + +export const getTokenExpiration = ( + token?: string +): GetTokenExpirationReturnType => { + if (!token) { + return notFound; + } + + const decodedToken = decodeNativeAuthToken(token); + + if (!decodedToken) { + return notFound; + } + + const unixNow = getUnixTimestamp(); + const { ttl, extraInfo } = decodedToken; + + const timestamp = extraInfo?.timestamp; + + if (!timestamp) { + return notFound; + } + + const expiresAt = timestamp + ttl; + + const isExpired = unixNow > expiresAt; + + const secondsUntilExpires = expiresAt - unixNow; + + return { isExpired, expiresAt, secondsUntilExpires }; +}; diff --git a/src/services/nativeAuth/methods/index.ts b/src/services/nativeAuth/methods/index.ts new file mode 100644 index 0000000..d60dcb4 --- /dev/null +++ b/src/services/nativeAuth/methods/index.ts @@ -0,0 +1,2 @@ +export * from './getTokenExpiration'; +export * from './getNativeAuthConfig'; diff --git a/src/services/nativeAuth/methods/tests/getTokenExpiration.test.ts b/src/services/nativeAuth/methods/tests/getTokenExpiration.test.ts new file mode 100644 index 0000000..6210e35 --- /dev/null +++ b/src/services/nativeAuth/methods/tests/getTokenExpiration.test.ts @@ -0,0 +1,35 @@ +import * as timestampModule from 'utils/dateTime/getUnixTimestamp'; +import { getTokenExpiration } from '../getTokenExpiration'; + +jest.mock('../../../../utils/dateTime/getUnixTimestamp', () => { + return { + __esModule: true, + ...jest.requireActual('../../../../utils/dateTime/getUnixTimestamp') + }; +}); + +// 1669712100 Tue Nov 29 2022 08:55:00 GMT+0000 +// 2 minutes expiration time +const nativeAuthToken = + 'ZXJkMTNycm4zZndqZHM4cjUyNjBuNnEzcGQycWE2d3FrdWRyaGN6aDI2ZDk1N2MwZWR5emVybXNoZHMwazg.Wld4eWIyNWtMbU52YlEuYjNkMDc1NjUyOTNmZDU2ODRjOTdkMmI5NmViODYyZDEyNGZkNjk4Njc4ZjNmOTViMjUxNWVkMDcxNzhhMjdiNC4xMjAuZXlKMGFXMWxjM1JoYlhBaU9qRTJOamszTVRJeE1EQjk.4b445f287663b868e269aa0532c9fd73acb37cfd45f46e33995777e68e5ecc15d97318d9af09c4102f9b40ecf347a75e2d2e81acbcc3c72ae32fcf659c2acd0e'; + +describe('getTokenExpiration tests', () => { + it('checks expired true', () => { + const timestamp = 1669712400; // Tue Nov 29 2022 09:00:00 GMT+0000 + jest.spyOn(timestampModule, 'getUnixTimestamp').mockReturnValue(timestamp); + + const data = getTokenExpiration(nativeAuthToken); + expect(data.isExpired).toStrictEqual(true); + expect(data.expiresAt).toStrictEqual(1669712220); + expect(data.secondsUntilExpires).toStrictEqual(-180); + }); + it('checks expired false', () => { + const timestamp = 1669712160; //Tue Nov 29 2022 08:56:00 GMT+0000 + jest.spyOn(timestampModule, 'getUnixTimestamp').mockReturnValue(timestamp); + + const data = getTokenExpiration(nativeAuthToken); + expect(data.isExpired).toStrictEqual(false); + expect(data.expiresAt).toStrictEqual(1669712220); + expect(data.secondsUntilExpires).toStrictEqual(60); + }); +}); diff --git a/src/services/nativeAuth/nativeAuth.ts b/src/services/nativeAuth/nativeAuth.ts new file mode 100644 index 0000000..9be0b33 --- /dev/null +++ b/src/services/nativeAuth/nativeAuth.ts @@ -0,0 +1,83 @@ +import { NativeAuthClient } from '@multiversx/sdk-native-auth-client'; +import { + getLatestBlockHash, + LatestBlockHashType +} from './helpers/getLatestBlockHash'; + +import { getNativeAuthConfig, getTokenExpiration } from './methods'; +import { NativeAuthConfigType } from './nativeAuth.types'; + +interface NativeAuthInitType { + extraInfo?: { [key: string]: string }; + latestBlockInfo?: LatestBlockHashType; + noCache?: boolean; +} + +export const nativeAuth = (config?: NativeAuthConfigType) => { + const { + origin, + apiAddress, + expirySeconds, + blockHashShard, + extraInfo: extraInfoFromConfig, + gatewayUrl, + extraRequestHeaders + } = getNativeAuthConfig(config) as NativeAuthConfigType; + + const nativeAuthClient = new NativeAuthClient({ + origin, + apiUrl: apiAddress, + expirySeconds, + blockHashShard, + gatewayUrl, + extraRequestHeaders + }); + + const initialize = async ( + initProps?: NativeAuthInitType + ): Promise => { + if (!apiAddress || !origin) { + return ''; + } + + const getBlockHash = (): Promise => + nativeAuthClient.getCurrentBlockHash(); + const response = + initProps?.latestBlockInfo ?? + (await getLatestBlockHash( + apiAddress, + blockHashShard, + getBlockHash, + initProps?.noCache + )); + console.log(response); + + const { hash, timestamp } = response; + const encodedExtraInfo = nativeAuthClient.encodeValue( + JSON.stringify({ + ...(initProps?.extraInfo ?? extraInfoFromConfig), + ...(timestamp ? { timestamp } : {}) + }) + ); + const encodedOrigin = nativeAuthClient.encodeValue(origin); + + return `${encodedOrigin}.${hash}.${expirySeconds}.${encodedExtraInfo}`; + }; + + const getToken = ({ + address, + token, + signature + }: { + address: string; + token: string; + signature: string; + }): string => nativeAuthClient.getToken(address, token, signature); + + return { + getNativeAuthConfig, + initialize, + getToken, + getTokenExpiration + }; +}; diff --git a/src/services/nativeAuth/nativeAuth.types.ts b/src/services/nativeAuth/nativeAuth.types.ts new file mode 100644 index 0000000..c0c6b88 --- /dev/null +++ b/src/services/nativeAuth/nativeAuth.types.ts @@ -0,0 +1,17 @@ +export interface NativeAuthConfigType { + origin?: string; + apiAddress?: string; + expirySeconds?: number; + blockHashShard?: number; + gatewayUrl?: string; + extraRequestHeaders?: { [key: string]: string }; + extraInfo?: { + [key: string]: string; + }; + /** + * Displays a logout toast warning before token expiration. Defaults to 5 minutes. + * + * If set to `null`, will not trigger any warning. + */ + tokenExpirationToastWarningSeconds?: number | null; +} diff --git a/src/services/nativeAuth/tests/nativeAuth.test.ts b/src/services/nativeAuth/tests/nativeAuth.test.ts new file mode 100644 index 0000000..3abc101 --- /dev/null +++ b/src/services/nativeAuth/tests/nativeAuth.test.ts @@ -0,0 +1,131 @@ +import axios from 'axios'; +import MockAdapter from 'axios-mock-adapter'; +import { server, rest, mockResponse } from '__mocks__'; +import { nativeAuth } from '../nativeAuth'; + +describe('Native Auth', () => { + let mock: MockAdapter; + const ADDRESS = + 'erd13rrn3fwjds8r5260n6q3pd2qa6wqkudrhczh26d957c0edyzermshds0k8'; + const ORIGIN = 'multiversx.com'; + const SIGNATURE = + '4b445f287663b868e269aa0532c9fd73acb37cfd45f46e33995777e68e5ecc15d97318d9af09c4102f9b40ecf347a75e2d2e81acbcc3c72ae32fcf659c2acd0e'; + const BLOCK_HASH = + 'b3d07565293fd5684c97d2b96eb862d124fd698678f3f95b2515ed07178a27b4'; + const TTL = 86400; + const ROUND = 6391457; + const TOKEN = `bXVsdGl2ZXJzeC5jb20.${BLOCK_HASH}.${TTL}.eyJ0aW1lc3RhbXAiOjE2ODZ9`; + const ACCESS_TOKEN = + 'ZXJkMTNycm4zZndqZHM4cjUyNjBuNnEzcGQycWE2d3FrdWRyaGN6aDI2ZDk1N2MwZWR5emVybXNoZHMwazg.YlhWc2RHbDJaWEp6ZUM1amIyMC5iM2QwNzU2NTI5M2ZkNTY4NGM5N2QyYjk2ZWI4NjJkMTI0ZmQ2OTg2NzhmM2Y5NWIyNTE1ZWQwNzE3OGEyN2I0Ljg2NDAwLmV5SjBhVzFsYzNSaGJYQWlPakUyT0RaOQ.4b445f287663b868e269aa0532c9fd73acb37cfd45f46e33995777e68e5ecc15d97318d9af09c4102f9b40ecf347a75e2d2e81acbcc3c72ae32fcf659c2acd0e'; + + const API_URL = 'https://api.multiversx.com'; + const GATEWAY_URL = 'https://gateway.multiversx.com'; + + let timestampSpy: jest.SpyInstance; + const currentTimestamp = 1686847; + + // Create and use the same instance of axios across all requests + const axiosAPI = axios.create(); + + beforeEach(() => { + timestampSpy = jest.spyOn(Date, 'now').mockReturnValue(currentTimestamp); + }); + + beforeAll(() => { + mock = new MockAdapter(axiosAPI); + }); + + afterEach(() => { + timestampSpy.mockRestore(); + mock.reset(); + }); + + const handlers = { + latestBlockApi: rest.get(`${API_URL}/blocks/latest`, (_, res, ctx) => { + return res( + ctx.status(200), + ctx.json([ + { + hash: BLOCK_HASH + } + ]) + ); + }), + latestBlockGateway: rest.get( + `${GATEWAY_URL}/blocks/by-round/${ROUND}`, + mockResponse([ + { + hash: BLOCK_HASH + } + ]) + ), + serverError: [ + rest.get(`${API_URL}/blocks/latest`, (_, res, ctx) => { + return res(ctx.status(500)); + }), + rest.get(`${API_URL}/blocks`, (_, res, ctx) => { + return res(ctx.status(500)); + }) + ] + }; + + describe('Client', () => { + it('Latest block should return signable token - API', async () => { + server.use(handlers.latestBlockApi); + + const client = nativeAuth({ + origin: ORIGIN, + apiAddress: API_URL + }); + + const token = await client.initialize(); + + expect(token).toStrictEqual(TOKEN); + }); + + it('Latest block should return signable token - Gateway', async () => { + server.use(handlers.latestBlockGateway); + + const client = nativeAuth({ + origin: ORIGIN, + apiAddress: API_URL, + gatewayUrl: GATEWAY_URL, + blockHashShard: 1 + }); + + const token = await client.initialize(); + + expect(token).toStrictEqual(TOKEN); + }); + + it('Internal server error', async () => { + server.use(...handlers.serverError); + + //this will make sure to expire the cache + jest + .useFakeTimers() + .setSystemTime(new Date().setSeconds(new Date().getSeconds() + 60)); + const client = nativeAuth({ + origin: ORIGIN, + apiAddress: API_URL + }); + + await expect(client.initialize()).rejects.toThrow(); + }); + + it('Generate Access token', () => { + const client = nativeAuth({ + origin: ORIGIN, + apiAddress: API_URL + }); + + const accessToken = client.getToken({ + address: ADDRESS, + token: TOKEN, + signature: SIGNATURE + }); + + expect(accessToken).toStrictEqual(ACCESS_TOKEN); + }); + }); +}); diff --git a/src/setupTests.js b/src/setupTests.js new file mode 100644 index 0000000..3a3935b --- /dev/null +++ b/src/setupTests.js @@ -0,0 +1,41 @@ +/************** + * MSW config code + ***************/ +import 'isomorphic-fetch'; +import { server } from './__mocks__/server'; + +// Establish API mocking before all tests. +beforeAll(() => server.listen()); + +// Reset any request handlers that we may add during the tests, +// so they don't affect other tests. +afterEach(() => server.resetHandlers()); + +// Clean up after the tests are finished. +afterAll(() => server.close()); + +/************** + * files + ***************/ + +window.scrollTo = jest.fn(); + +jest.retryTimes(3); + +/************** + * window + ***************/ + +Object.defineProperty(window, 'matchMedia', { + writable: true, + value: jest.fn().mockImplementation((query) => ({ + matches: false, + media: query, + onchange: null, + addListener: jest.fn(), // deprecated + removeListener: jest.fn(), // deprecated + addEventListener: jest.fn(), + removeEventListener: jest.fn(), + dispatchEvent: jest.fn() + })) +}); diff --git a/src/store/actions/constants.ts b/src/store/actions/constants.ts index caa2b9c..7035322 100644 --- a/src/store/actions/constants.ts +++ b/src/store/actions/constants.ts @@ -1,3 +1,4 @@ export enum SharedActionsEnum { - LOGOUT = 'LOGOUT' + LOGOUT = 'LOGOUT', + LOGIN = 'LOGIN' } diff --git a/src/store/helpers/eventHandlers.ts b/src/store/helpers/eventHandlers.ts index 1f157aa..25052fd 100644 --- a/src/store/helpers/eventHandlers.ts +++ b/src/store/helpers/eventHandlers.ts @@ -1,12 +1,13 @@ -import { safeWindow } from '../../constants/window'; +import { safeWindow } from 'constants/window'; +import { SharedActionsEnum } from 'store/actions'; +import { StateCreator } from 'zustand/vanilla'; export function createCustomEvent(eventName: string, eventData: T) { const event = new CustomEvent(eventName, { detail: eventData }); safeWindow?.document.dispatchEvent(event); } -// Function to listen to the custom event -export function listenToCustomEvent( +function listenToCustomEvent( eventName: string, callback: (event: CustomEvent) => void ) { @@ -14,3 +15,19 @@ export function listenToCustomEvent( callback(evt as CustomEvent); }); } + +type ListenToCustomEventType = < + T extends (state: T, options: { detail: K }) => void +>( + w: T +) => StateCreator>; + +export const getListenToEvent = + (action: SharedActionsEnum): ListenToCustomEventType => + (wrapper) => + (_set, get) => { + listenToCustomEvent(action, (event: CustomEvent<{ detail: T }>) => { + wrapper(get(), event.detail); + }); + return {}; + }; diff --git a/src/store/slices/account.ts b/src/store/slices/account.ts deleted file mode 100644 index 097affc..0000000 --- a/src/store/slices/account.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { createStore } from 'zustand'; -import { devtools, persist } from 'zustand/middleware'; -import { immer } from 'zustand/middleware/immer'; -import { storage } from '../../constants/storage'; -import { getKeys } from './helpers/getKeys'; -import { getReactStore } from './helpers/getReactStore'; -import { GetSetType } from './helpers/types'; -import { listenToLogout } from './shared/listenToLogout'; - -const initialState = { - ['address']: 'NO_ADDRESS', - ['setAddress']: (_newAddress: string) => {} -}; - -type StateType = typeof initialState; - -const keys = getKeys(initialState); - -const definition = (set: GetSetType): StateType => ({ - address: initialState.address, - setAddress: (newAddress) => - set( - (state) => { - state.address = newAddress; - }, - false, - { type: keys.setAddress } - ) -}); - -const handleLogout = listenToLogout((state: StateType) => { - state.setAddress(''); -}); - -// vanilla store -export const accountStore = createStore()( - devtools( - persist( - immer((...a) => ({ - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore:next-line - ...definition(...a), - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore:next-line - ...handleLogout(...a) - })), - { - name: 'accountStore', - storage - } - ) - ) -); - -// react store -export const useAccountStore = getReactStore({ - initialState, - store: accountStore -}); diff --git a/src/store/slices/account/account.ts b/src/store/slices/account/account.ts new file mode 100644 index 0000000..4e96d71 --- /dev/null +++ b/src/store/slices/account/account.ts @@ -0,0 +1,110 @@ +import { AccountType } from 'types/account.types'; +import { getActions } from '../helpers'; +import { getVanillaStore } from '../helpers/getVanillaStore'; +import { getReactStore } from './../helpers/getReactStore'; +import { GetSetType } from './../helpers/types'; +import { listenToLogout } from './../shared/listenToLogout'; +import { + AccountSliceType, + BatchTransactionsWSResponseType, + LedgerAccountType +} from './account.types'; +import { emptyAccount } from './emptyAccount'; +import { listenToLogin } from '../shared/listenToLogin'; +import { Address } from '@multiversx/sdk-core/out'; + +const initialData: AccountSliceType = { + address: '', + websocketEvent: null, + websocketBatchEvent: null, + accounts: { '': emptyAccount }, + ledgerAccount: null, + publicKey: '', + walletConnectAccount: null +}; + +const actions = { + setAddress: (_address: string) => {}, + setAccount: (_account: AccountType) => {}, + setLedgerAccount: (_ledgerAccount: LedgerAccountType | null) => {}, + updateLedgerAccount: (_ledgerAccount: { + index: LedgerAccountType['index']; + address: LedgerAccountType['address']; + }) => {}, + setWalletConnectAccount: (_walletConnectAccount: string | null) => {}, + setWebsocketEvent: (_message: string) => {}, + setWebsocketBatchEvent: (_data: BatchTransactionsWSResponseType) => {} +}; + +const initialState = { + ...initialData, + ...actions +}; + +type StateType = typeof initialState; + +const definition = (set: GetSetType): StateType => { + const createActions = getActions({ set, actions }); + + return { + ...initialData, + ...createActions({ + setAddress: (state, address) => { + state.address = address; + }, + setAccount: (state, account) => { + const isSameAddress = state.address === account.address; + state.accounts = { + [state.address]: isSameAddress ? account : emptyAccount + }; + }, + setLedgerAccount: (state, ledgerAccount) => { + state.ledgerAccount = ledgerAccount; + }, + updateLedgerAccount: (state, { index, address }) => { + if (state.ledgerAccount) { + state.ledgerAccount.address = address; + state.ledgerAccount.index = index; + } + }, + setWalletConnectAccount: (state, walletConnectAccount) => { + state.walletConnectAccount = walletConnectAccount; + }, + setWebsocketEvent: (state, message) => { + state.websocketEvent = { + timestamp: Date.now(), + message + }; + }, + setWebsocketBatchEvent: (state, data) => { + state.websocketBatchEvent = { + timestamp: Date.now(), + data + }; + } + }) + }; +}; + +const handleLogout = listenToLogout((state: StateType) => { + state.setAddress(''); +}); + +const handleLogin = listenToLogin( + (state: StateType, { detail: { address } }) => { + state.address = address; + state.publicKey = new Address(address).hex(); + } +); + +export const accountStore = getVanillaStore({ + name: 'accountStore', + definition, + middleware: [handleLogout, handleLogin] +}); + +// react store +export const useAccountStore = getReactStore({ + initialState, + store: accountStore +}); diff --git a/src/store/slices/account/account.types.ts b/src/store/slices/account/account.types.ts new file mode 100644 index 0000000..94995d0 --- /dev/null +++ b/src/store/slices/account/account.types.ts @@ -0,0 +1,29 @@ +import { AccountType } from 'types/account.types'; + +export interface LedgerAccountType { + index: number; + address: string; + hasContractDataEnabled: boolean; + version: string; +} + +export type BatchTransactionsWSResponseType = { + batchId: string; + txHashes: string[]; +}; + +export type AccountSliceType = { + address: string; + accounts: { [address: string]: AccountType }; + publicKey: string; + ledgerAccount: LedgerAccountType | null; + walletConnectAccount: string | null; + websocketEvent: { + timestamp: number; + message: string; + } | null; + websocketBatchEvent: { + timestamp: number; + data: BatchTransactionsWSResponseType; + } | null; +}; diff --git a/src/store/slices/account/emptyAccount.ts b/src/store/slices/account/emptyAccount.ts new file mode 100644 index 0000000..08b9bcd --- /dev/null +++ b/src/store/slices/account/emptyAccount.ts @@ -0,0 +1,12 @@ +import { ELLIPSIS, ZERO } from 'constants/placeholders'; +import { AccountType } from 'types/account.types'; + +export const emptyAccount: AccountType = { + balance: ELLIPSIS, + address: '', + isGuarded: false, + nonce: 0, + txCount: 0, + scrCount: 0, + claimableRewards: ZERO +}; diff --git a/src/store/slices/account/index.ts b/src/store/slices/account/index.ts new file mode 100644 index 0000000..362a768 --- /dev/null +++ b/src/store/slices/account/index.ts @@ -0,0 +1 @@ +export * from './account'; diff --git a/src/store/slices/helpers/getActions.ts b/src/store/slices/helpers/getActions.ts new file mode 100644 index 0000000..17e45be --- /dev/null +++ b/src/store/slices/helpers/getActions.ts @@ -0,0 +1,46 @@ +import { getKeys } from './getKeys'; +import { GetSetType } from './types'; + +// Define a function getActions that takes a set function and a set of actions, and returns a function to create wrapped actions +export const getActions = any>>({ + set, + actions, + shouldReplace = false +}: { + set: GetSetType; + actions: A; + shouldReplace?: boolean; +}) => { + type ActionType = typeof actions; + + // Define the return type for the wrapped actions + type CreateSetterReturnType = { + [P in K]: (...args: Parameters) => void; + }; + + const keys = getKeys(actions); // Generate a mapping of action names to keys using the getKeys helper function + + // Define a wrapper function that takes an object with action implementations and returns wrapped actions + const actionsCreator = (actionObj: { + [P in K]: (state: T, ...args: Parameters) => void; + }): CreateSetterReturnType => { + // Initialize the result object to store the wrapped actions + const result = {} as CreateSetterReturnType; + + // Iterate over each action in the provided action object + for (const name in actionObj) { + const func = actionObj[name]; // Get the action implementation function + + // Create a wrapped function for each action that sets the state and dispatches an action type + result[name] = (...args: Parameters) => + set((state) => func(state, ...args), shouldReplace, { + type: keys[name] + }); + } + + return result; + }; + + // Return the wrapper function from getActions + return actionsCreator; +}; diff --git a/src/store/slices/helpers/getVanillaStore.ts b/src/store/slices/helpers/getVanillaStore.ts new file mode 100644 index 0000000..83f95cf --- /dev/null +++ b/src/store/slices/helpers/getVanillaStore.ts @@ -0,0 +1,59 @@ +import { storage } from 'constants/storage'; +import { StoreApi, createStore } from 'zustand'; +import { devtools, persist } from 'zustand/middleware'; +import { immer } from 'zustand/middleware/immer'; +import { GetSetType } from './../helpers/types'; + +const getStore = ({ + definitionFunc, + name +}: { + definitionFunc: (...a: Parameters>) => T; + name: string; +}) => + createStore()( + devtools( + persist( + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore:next-line + immer((...a) => definitionFunc(...a)), + { + name, + storage + } + ) + ) + ); + +type GetDefinitionType = { + definition: (set: GetSetType) => T; + middleware?: Array<(...args: any) => any>; +}; + +// Definition function combining definition and handleLogout +const getDefinition = + ({ definition, middleware = [] }: GetDefinitionType) => + (...a: Parameters>) => { + const appliedMiddleware = middleware.reduce((acc, current) => { + acc = { + ...acc, + ...current(...a) + }; + return acc; + }, {}); + + return { + ...definition(...(a as Parameters)), + ...appliedMiddleware + }; + }; + +export const getVanillaStore = ({ + name, + definition, + middleware = [] +}: GetDefinitionType & { name: string }) => + getStore({ + definitionFunc: getDefinition({ definition, middleware }), + name + }); diff --git a/src/store/slices/helpers/index.ts b/src/store/slices/helpers/index.ts new file mode 100644 index 0000000..26337ae --- /dev/null +++ b/src/store/slices/helpers/index.ts @@ -0,0 +1 @@ +export * from './getActions'; diff --git a/src/store/slices/network/actions.ts b/src/store/slices/network/actions.ts index a5122ff..741834f 100644 --- a/src/store/slices/network/actions.ts +++ b/src/store/slices/network/actions.ts @@ -1,7 +1,7 @@ -import { getServerConfiguration } from '../../../apiCalls/configuration/getServerConfiguration'; -import { fallbackNetworkConfigurations } from '../../../constants/network'; -import { EnvironmentsEnum } from '../../../types/enums.types'; -import { CustomNetworkType } from '../../../types/network.types'; +import { getServerConfiguration } from 'apiCalls/configuration/getServerConfiguration'; +import { fallbackNetworkConfigurations } from 'constants/network'; +import { EnvironmentsEnum } from 'types/enums.types'; +import { CustomNetworkType } from 'types/network.types'; import { networkStore } from './network'; export type InitializeNetworkPropsType = { diff --git a/src/store/slices/network/actions/initializeNetwork.ts b/src/store/slices/network/actions/initializeNetwork.ts index 3b47053..08d2943 100644 --- a/src/store/slices/network/actions/initializeNetwork.ts +++ b/src/store/slices/network/actions/initializeNetwork.ts @@ -1,7 +1,7 @@ -import { getServerConfiguration } from '../../../../apiCalls/configuration/getServerConfiguration'; -import { fallbackNetworkConfigurations } from '../../../../constants/network'; -import { EnvironmentsEnum } from '../../../../types/enums.types'; -import { CustomNetworkType } from '../../../../types/network.types'; +import { getServerConfiguration } from 'apiCalls/configuration/getServerConfiguration'; +import { fallbackNetworkConfigurations } from 'constants/network'; +import { EnvironmentsEnum } from 'types/enums.types'; +import { CustomNetworkType } from 'types/network.types'; import { networkStore } from '../network'; export type InitializeNetworkPropsType = { diff --git a/src/store/slices/network/helpers.ts b/src/store/slices/network/emptyNetwork.ts similarity index 56% rename from src/store/slices/network/helpers.ts rename to src/store/slices/network/emptyNetwork.ts index 2faba7e..2250fdf 100644 --- a/src/store/slices/network/helpers.ts +++ b/src/store/slices/network/emptyNetwork.ts @@ -1,6 +1,6 @@ -import { CurrentNetworkType } from '../../../types/network.types'; +import { CurrentNetworkType } from 'types/network.types'; -export const defaultNetwork: CurrentNetworkType = { +export const emptyNetwork: CurrentNetworkType = { id: 'not-configured', chainId: '', name: 'NOT CONFIGURED', @@ -18,9 +18,3 @@ export const defaultNetwork: CurrentNetworkType = { explorerAddress: '', apiTimeout: '4000' }; - -export function getRandomAddressFromNetwork(walletConnectAddresses: string[]) { - return walletConnectAddresses[ - Math.floor(Math.random() * walletConnectAddresses.length) - ]; -} diff --git a/src/store/slices/network/network.ts b/src/store/slices/network/network.ts index e4f513c..e2b8840 100644 --- a/src/store/slices/network/network.ts +++ b/src/store/slices/network/network.ts @@ -1,79 +1,69 @@ -import { devtools, persist } from 'zustand/middleware'; -import { immer } from 'zustand/middleware/immer'; -import { createStore } from 'zustand/vanilla'; -import { storage } from '../../../constants/storage'; -import { NetworkType } from '../../../types/network.types'; +import { NetworkType } from 'types/network.types'; +import { getActions } from '../helpers'; import { getKeys } from '../helpers/getKeys'; import { getReactStore } from '../helpers/getReactStore'; +import { getVanillaStore } from '../helpers/getVanillaStore'; import { GetSetType } from '../helpers/types'; import { listenToLogout } from '../shared/listenToLogout'; -import { defaultNetwork, getRandomAddressFromNetwork } from './helpers'; +import { emptyNetwork } from './emptyNetwork'; +import { NetworkSliceType } from './network.types'; + +const initialData: NetworkSliceType = { + network: emptyNetwork, + customWalletAddress: '' +}; + +const actions = { + initializeNetworkConfig: (_network: NetworkType) => {}, + setCustomWalletAddress: (_customWalletAddress: string) => {} +}; const initialState = { - ['network']: defaultNetwork, - ['customWalletAddress']: '', - ['setCustomWalletAddress']: (_customWalletAddress: string) => {}, - ['initializeNetworkConfig']: (_network: NetworkType) => {} + ...initialData, + ...actions }; type StateType = typeof initialState; const keys = getKeys(initialState); -const definition = (set: GetSetType): StateType => ({ - network: initialState.network, - customWalletAddress: initialState.customWalletAddress, - initializeNetworkConfig: (newNetwork) => { - const walletConnectV2RelayAddress = getRandomAddressFromNetwork( - newNetwork.walletConnectV2RelayAddresses - ); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { walletConnectV2RelayAddresses, ...rest } = newNetwork; - return set( - (state) => { +const definition = (set: GetSetType): StateType => { + const createActions = getActions({ set, actions }); + + return { + ...initialData, + ...createActions({ + initializeNetworkConfig: (state, newNetwork) => { + const walletConnectV2RelayAddress = + newNetwork.walletConnectV2RelayAddresses[ + Math.floor( + Math.random() * newNetwork.walletConnectV2RelayAddresses.length + ) + ]; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { walletConnectV2RelayAddresses, ...rest } = newNetwork; state[keys.network] = { ...state[keys.network], ...rest, walletConnectV2RelayAddress }; }, - false, - { type: keys.initializeNetworkConfig } - ); - }, - setCustomWalletAddress: (customWalletAddress) => - set( - (state) => { + setCustomWalletAddress: (state, customWalletAddress) => { state[keys.network].customWalletAddress = customWalletAddress; - }, - false, - { type: keys.setCustomWalletAddress } - ) -}); + } + }) + }; +}; const handleLogout = listenToLogout((state: StateType) => { state.setCustomWalletAddress(''); }); -// vanilla store -export const networkStore = createStore()( - devtools( - persist( - immer((...a) => ({ - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore:next-line - ...definition(...a), - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore:next-line - ...handleLogout(...a) - })), - { - name: 'networkStore', - storage - } - ) - ) -); +export const networkStore = getVanillaStore({ + name: 'networkStore', + definition, + middleware: [handleLogout] +}); // react store export const useNetworkStore = getReactStore({ diff --git a/src/store/slices/network/network.types.ts b/src/store/slices/network/network.types.ts new file mode 100644 index 0000000..365d62d --- /dev/null +++ b/src/store/slices/network/network.types.ts @@ -0,0 +1,6 @@ +import { CurrentNetworkType } from 'types/network.types'; + +export interface NetworkSliceType { + network: CurrentNetworkType; + customWalletAddress: string; +} diff --git a/src/store/slices/shared/listenToLogin.ts b/src/store/slices/shared/listenToLogin.ts new file mode 100644 index 0000000..067c8a0 --- /dev/null +++ b/src/store/slices/shared/listenToLogin.ts @@ -0,0 +1,12 @@ +import { SharedActionsEnum } from 'store/actions/constants'; +import { getListenToEvent } from 'store/helpers/eventHandlers'; +import { LoginMethodsEnum } from 'types/enums.types'; + +export interface LoginActionPayloadType { + address: string; + loginMethod: LoginMethodsEnum; +} + +export const listenToLogin = getListenToEvent( + SharedActionsEnum.LOGIN +); diff --git a/src/store/slices/shared/listenToLogout.ts b/src/store/slices/shared/listenToLogout.ts index b12fe49..1098b03 100644 --- a/src/store/slices/shared/listenToLogout.ts +++ b/src/store/slices/shared/listenToLogout.ts @@ -1,18 +1,6 @@ -import { StateCreator } from 'zustand'; -import { SharedActionsEnum } from '../../actions/constants'; -import { listenToCustomEvent } from '../../helpers/eventHandlers'; +import { SharedActionsEnum } from 'store/actions/constants'; +import { getListenToEvent } from 'store/helpers/eventHandlers'; -export const listenToLogout: < - T extends (state: T, options?: { detail?: { message: string } }) => void ->( - w: T -) => StateCreator> = - (wrapper) => (_set, get) => { - listenToCustomEvent( - SharedActionsEnum.LOGOUT, - (event: CustomEvent<{ detail?: { message: string } }>) => { - wrapper(get(), event.detail); - } - ); - return {}; - }; +export const listenToLogout = getListenToEvent( + SharedActionsEnum.LOGOUT +); diff --git a/src/types/account.types.ts b/src/types/account.types.ts new file mode 100644 index 0000000..b8a958a --- /dev/null +++ b/src/types/account.types.ts @@ -0,0 +1,40 @@ +export interface AssetType { + name: string; + description: string; + tags: string[]; + iconPng?: string; + iconSvg?: string; +} + +export interface AccountType { + address: string; + balance: string; + nonce: number; + txCount: number; + scrCount: number; + claimableRewards: string; + code?: string; + username?: string; + shard?: number; + ownerAddress?: string; + developerReward?: string; + deployedAt?: number; + scamInfo?: ScamInfoType; + isUpgradeable?: boolean; + isReadable?: boolean; + isPayable?: boolean; + isPayableBySmartContract?: boolean; + assets?: AssetType; + isGuarded: boolean; + activeGuardianActivationEpoch?: number; + activeGuardianAddress?: string; + activeGuardianServiceUid?: string; + pendingGuardianActivationEpoch?: number; + pendingGuardianAddress?: string; + pendingGuardianServiceUid?: string; +} + +export interface ScamInfoType { + type: string; + info: string; +} diff --git a/src/types/enums.types.ts b/src/types/enums.types.ts index 31fea26..d3c0148 100644 --- a/src/types/enums.types.ts +++ b/src/types/enums.types.ts @@ -3,3 +3,35 @@ export enum EnvironmentsEnum { devnet = 'devnet', mainnet = 'mainnet' } + +export enum LoginMethodsEnum { + ledger = 'ledger', + walletconnect = 'walletconnect', + walletconnectv2 = 'walletconnectv2', + wallet = 'wallet', + crossWindow = 'crossWindow', + extension = 'extension', + metamask = 'metamask', + opera = 'opera', + extra = 'extra', + none = '' +} + +export enum TypesOfSmartContractCallsEnum { + MultiESDTNFTTransfer = 'MultiESDTNFTTransfer', + ESDTNFTTransfer = 'ESDTNFTTransfer' +} + +export enum ESDTTransferTypesEnum { + ESDTNFTTransfer = 'ESDTNFTTransfer', + ESDTNFTBurn = 'ESDTNFTBurn', + ESDTNFTAddQuantity = 'ESDTNFTAddQuantity', + ESDTNFTCreate = 'ESDTNFTCreate', + MultiESDTNFTTransfer = 'MultiESDTNFTTransfer', + ESDTTransfer = 'ESDTTransfer', + ESDTBurn = 'ESDTBurn', + ESDTLocalMint = 'ESDTLocalMint', + ESDTLocalBurn = 'ESDTLocalBurn', + ESDTWipe = 'ESDTWipe', + ESDTFreeze = 'ESDTFreeze' +} diff --git a/src/utils/asyncActions/index.ts b/src/utils/asyncActions/index.ts new file mode 100644 index 0000000..4d81787 --- /dev/null +++ b/src/utils/asyncActions/index.ts @@ -0,0 +1 @@ +export * from './sleep'; diff --git a/src/utils/asyncActions/sleep.ts b/src/utils/asyncActions/sleep.ts new file mode 100644 index 0000000..1f537c3 --- /dev/null +++ b/src/utils/asyncActions/sleep.ts @@ -0,0 +1,10 @@ +export async function sleep(time: number) { + return await new Promise((resolve) => { + //timeouts are broken in jest, if this is a test env + //exit the sleep state immediately + if (process.env.NODE_ENV === 'test') { + resolve(); + } + setTimeout(() => resolve(), time); + }); +} diff --git a/src/utils/dateTime/getUnixTimestamp.ts b/src/utils/dateTime/getUnixTimestamp.ts new file mode 100644 index 0000000..1e1bcc3 --- /dev/null +++ b/src/utils/dateTime/getUnixTimestamp.ts @@ -0,0 +1,3 @@ +export const getUnixTimestamp = () => { + return Date.now() / 1000; +}; diff --git a/src/utils/dateTime/getUnixTimestampWithAddedMilliseconds.ts b/src/utils/dateTime/getUnixTimestampWithAddedMilliseconds.ts new file mode 100644 index 0000000..a2346bf --- /dev/null +++ b/src/utils/dateTime/getUnixTimestampWithAddedMilliseconds.ts @@ -0,0 +1,9 @@ +export const getUnixTimestampWithAddedMilliseconds = ( + addedMilliseconds: number +) => { + return ( + new Date().setMilliseconds( + new Date().getMilliseconds() + addedMilliseconds + ) / 1000 + ); +}; diff --git a/src/utils/dateTime/getUnixTimestampWithAddedSeconds.ts b/src/utils/dateTime/getUnixTimestampWithAddedSeconds.ts new file mode 100644 index 0000000..ad53a33 --- /dev/null +++ b/src/utils/dateTime/getUnixTimestampWithAddedSeconds.ts @@ -0,0 +1,3 @@ +export const getUnixTimestampWithAddedSeconds = (addedSeconds: number) => { + return new Date().setSeconds(new Date().getSeconds() + addedSeconds); +}; diff --git a/src/utils/dateTime/index.ts b/src/utils/dateTime/index.ts new file mode 100644 index 0000000..07fa7da --- /dev/null +++ b/src/utils/dateTime/index.ts @@ -0,0 +1,3 @@ +export * from './getUnixTimestamp'; +export * from './getUnixTimestampWithAddedMilliseconds'; +export * from './getUnixTimestampWithAddedSeconds'; diff --git a/src/utils/decoders/base64Utils.ts b/src/utils/decoders/base64Utils.ts new file mode 100644 index 0000000..d2ec165 --- /dev/null +++ b/src/utils/decoders/base64Utils.ts @@ -0,0 +1,55 @@ +/** + * @description Checks if a string is base64 encoded + * The detection difficulty stands in the format of an encoded string that initially had non-ASCII characters + * + * Usually, when decoding a base64 string, if the result has non-ASCII characters, + * it means that the string was encoded, however, this is not always the case + * + * @example If we encode a string with non-ASCII characters like "👋wxyz{|}~���" to base64 + * the decoded result will also contain non-ASCII characters, but the strings is valid + * For the scenarios above, the Buffer.from() conversion is not equal to the atob() conversion + * and, the encoded string format is also different from a regular base64 string (e.g. "GamRHHZiaUR3bjVtQQ==") + * + * Solution: + * - if any conversion fails (atob(), btoa() or Buffer.from()), it is definitely not an encoded string + * - if the string is equal + * + * @see The tests for this function are in src/utils/decoders/tests/base64Utils.test.ts + * @param str + */ +export function isStringBase64(str: string) { + try { + // Try to decode the string and encode it back using base64 functions + const atobDecoded = atob(str); + const btoaEncoded = btoa(atobDecoded); + const bufferFromDecoded = Buffer.from(str, 'base64').toString(); + const bufferFromEncoded = Buffer.from(bufferFromDecoded).toString('base64'); + + // If the result is equal to the initial string + const isBtoaEqual = str === btoaEncoded || btoaEncoded.startsWith(str); + const isBufferFromBase64Equal = + str === bufferFromEncoded || bufferFromEncoded.startsWith(str); + const isEqualToInitialString = isBtoaEqual && isBufferFromBase64Equal; + + if (isEqualToInitialString) { + // it is a regular base64 string + return true; + } + } catch (e) { + return false; + } + + return false; +} + +export function encodeToBase64(string: string) { + return btoa(string); +} + +export function decodeBase64(string: string) { + if (!isStringBase64(string)) { + return string; + } + + return atob(string); +} diff --git a/src/utils/decoders/decodePart.ts b/src/utils/decoders/decodePart.ts new file mode 100644 index 0000000..cb77935 --- /dev/null +++ b/src/utils/decoders/decodePart.ts @@ -0,0 +1,15 @@ +import { isUtf8 } from './isUtf8'; + +export function decodePart(part: string) { + let decodedPart = part; + + try { + const hexPart = Buffer.from(part, 'hex').toString(); + + if (isUtf8(hexPart) && hexPart.length > 1) { + decodedPart = hexPart; + } + } catch (error) {} + + return decodedPart; +} diff --git a/src/utils/decoders/index.ts b/src/utils/decoders/index.ts new file mode 100644 index 0000000..2a3d673 --- /dev/null +++ b/src/utils/decoders/index.ts @@ -0,0 +1,5 @@ +export * from './base64Utils'; +export * from './decodePart'; +export * from './isAscii'; +export * from './isUtf8'; +export * from './stringContainsNumbers'; diff --git a/src/utils/decoders/isAscii.ts b/src/utils/decoders/isAscii.ts new file mode 100644 index 0000000..bc00a95 --- /dev/null +++ b/src/utils/decoders/isAscii.ts @@ -0,0 +1 @@ +export const isAscii = (str: string) => !/[^\x00-\x7F]/gm.test(str); diff --git a/src/utils/decoders/isUtf8.ts b/src/utils/decoders/isUtf8.ts new file mode 100644 index 0000000..3c34598 --- /dev/null +++ b/src/utils/decoders/isUtf8.ts @@ -0,0 +1,6 @@ +export function isUtf8(str: string) { + for (let i = 0; i < str.length; i++) { + if (str.charCodeAt(i) > 127) return false; + } + return true; +} diff --git a/src/utils/decoders/stringContainsNumbers.ts b/src/utils/decoders/stringContainsNumbers.ts new file mode 100644 index 0000000..fea36d6 --- /dev/null +++ b/src/utils/decoders/stringContainsNumbers.ts @@ -0,0 +1 @@ +export const stringContainsNumbers = (str: string) => /\d/.test(str); diff --git a/src/utils/decoders/tests/base64Utils.test.ts b/src/utils/decoders/tests/base64Utils.test.ts new file mode 100644 index 0000000..b175f56 --- /dev/null +++ b/src/utils/decoders/tests/base64Utils.test.ts @@ -0,0 +1,72 @@ +import { isStringBase64 } from '../base64Utils'; + +describe('isStringBase64', () => { + it('should return true for base64 encoding of emoji string', async () => { + const result = isStringBase64('dGVzdCB0cmFuc2FjdGlvbiDwn5mA'); + expect(result).toStrictEqual(true); + }); + + it('should return true for base64 encoding of another base64 encoding', async () => { + const result = isStringBase64('ZEdWemRDQjBjbUZ1YzJGamRHbHZiaUR3bjVtQQ=='); + expect(result).toStrictEqual(true); + }); + + it('should return true for base64 string of non-ASCII characters', async () => { + const result = isStringBase64( + '8J+ZgCEiYWJjZDEyM3x9fu+/ve+/vfCfmYAxMzJkYXNk' + ); + expect(result).toStrictEqual(true); + }); + + it('should return true for base64 encoding of @', async () => { + const result = isStringBase64('bGVuZGVnYXRlQDAx'); + expect(result).toStrictEqual(true); + }); + + it('should return true for base64 encoding of chinese characters', async () => { + const result = isStringBase64('5aeT5ZCN'); + expect(result).toStrictEqual(true); + }); + + it('should return false for simple uppercase letter word', async () => { + const result = isStringBase64('TEST'); + expect(result).toStrictEqual(false); + }); + + it('should return false for simple lowercase letter word', async () => { + const result = isStringBase64('test'); + expect(result).toStrictEqual(false); + }); + + it('should return false for number', async () => { + const result = isStringBase64('1231434'); + expect(result).toStrictEqual(false); + }); + + it('should return false for simple letter word', async () => { + const result = isStringBase64('TeSt'); + expect(result).toStrictEqual(false); + }); + + it('should return false for simple letter word with numbers', async () => { + const result = isStringBase64('TeSt123'); + expect(result).toStrictEqual(false); + }); + + it('should return false for non-ASCII chinese string', async () => { + const result = isStringBase64('姓名'); + expect(result).toStrictEqual(false); + }); + + it('should return false for non-ASCII string', async () => { + const result = isStringBase64( + '🙀!"#$%&\\() * +, -./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~������' + ); + expect(result).toStrictEqual(false); + }); + + it('should return false for atob equal to base64 conversion', async () => { + const result = isStringBase64('fd'); + expect(result).toStrictEqual(false); + }); +}); diff --git a/src/utils/decoders/tests/decodePart.test.tsx b/src/utils/decoders/tests/decodePart.test.tsx new file mode 100644 index 0000000..82375d2 --- /dev/null +++ b/src/utils/decoders/tests/decodePart.test.tsx @@ -0,0 +1,13 @@ +import { decodePart } from '../decodePart'; + +describe('decodePart', () => { + it('should decode hex to utf-8 string', async () => { + const result = decodePart('6f6b'); + expect(result).toBe('ok'); + }); + + it('should return input value if not utf-8 string and not a number', async () => { + const result = decodePart('oÉD'); + expect(result).toBe('oÉD'); + }); +}); diff --git a/src/utils/decoders/tests/isAscii.test.ts b/src/utils/decoders/tests/isAscii.test.ts new file mode 100644 index 0000000..91e2fe6 --- /dev/null +++ b/src/utils/decoders/tests/isAscii.test.ts @@ -0,0 +1,25 @@ +import { isAscii } from '../isAscii'; + +describe('isAscii', () => { + it('should return false for strings with unknown characters', async () => { + const result = isAscii( + '!"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������' + ); + expect(result).toStrictEqual(false); + }); + + it('should return false for strings with emojis', async () => { + const result = isAscii('This ❌ h🅰s some 😱🙀 emojis inside'); + expect(result).toStrictEqual(false); + }); + + it('should return true for strings with symbols, letters, and numbers', async () => { + const result = isAscii('ESDTTransfer@a129asnas98d@a9s8h98h9'); + expect(result).toStrictEqual(true); + }); + + it('should return true for simple strings with letters', async () => { + const result = isAscii('Some example'); + expect(result).toStrictEqual(true); + }); +}); diff --git a/src/utils/decoders/tests/isUtf8.test.ts b/src/utils/decoders/tests/isUtf8.test.ts new file mode 100644 index 0000000..1035d60 --- /dev/null +++ b/src/utils/decoders/tests/isUtf8.test.ts @@ -0,0 +1,23 @@ +import { isUtf8 } from '../isUtf8'; + +describe('isUtf8', () => { + it('should return valid UTF-8', async () => { + const result = isUtf8('dGVzdCB0cmFuc2FjdGlvbiDwn5mA'); + expect(result).toStrictEqual(true); + }); + + it('should return valid UTF-8', async () => { + const result = isUtf8('ZEdWemRDQjBjbUZ1YzJGamRHbHZiaUR3bjVtQQ=='); + expect(result).toStrictEqual(true); + }); + + it('should return invalid UTF-8', async () => { + const result = isUtf8('test transaction 🙀'); + expect(result).toStrictEqual(false); + }); + + it('should return invalid UTF-8', async () => { + const result = isUtf8('��-'); + expect(result).toStrictEqual(false); + }); +}); diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..df58c3b --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,6 @@ +export * from './dateTime'; +export * from './window'; +export * from './asyncActions'; +export * from './decoders'; +export * from './validation'; +export * from './retryMultipleTimes'; diff --git a/src/utils/retryMultipleTimes.ts b/src/utils/retryMultipleTimes.ts new file mode 100644 index 0000000..8d1578d --- /dev/null +++ b/src/utils/retryMultipleTimes.ts @@ -0,0 +1,36 @@ +import { sleep } from './asyncActions'; + +interface Options { + retries: number; + delay?: number; +} + +const executeAsyncCall = async ( + cb: (...args: any[]) => any, + options: Options, + args: any[], + retries = 0 +): Promise => { + try { + return await cb(...args); + } catch (error) { + if (retries < options.retries) { + if (options?.delay != null) { + await sleep(options.delay); + } + + return await executeAsyncCall(cb, options, args, retries + 1); + } + + return null; + } +}; + +export const retryMultipleTimes = + ( + cb: (...args: any[]) => any, + options: Options = { retries: 5, delay: 500 } + ) => + async (...args: any[]) => { + return await executeAsyncCall(cb, options, args); + }; diff --git a/src/utils/validation/addressIsValid.ts b/src/utils/validation/addressIsValid.ts new file mode 100644 index 0000000..6b877bc --- /dev/null +++ b/src/utils/validation/addressIsValid.ts @@ -0,0 +1,19 @@ +import { Address } from '@multiversx/sdk-core'; + +function canTransformToPublicKey(address: string) { + try { + const checkAddress = new Address(address); + return Boolean(checkAddress.bech32()); + } catch { + return false; + } +} + +export function addressIsValid(destinationAddress: string) { + const isValidBach = + destinationAddress?.startsWith('erd') && + destinationAddress.length === 62 && + /^\w+$/.test(destinationAddress); + + return isValidBach && canTransformToPublicKey(destinationAddress); +} diff --git a/src/utils/validation/getIdentifierType.ts b/src/utils/validation/getIdentifierType.ts new file mode 100644 index 0000000..b839e35 --- /dev/null +++ b/src/utils/validation/getIdentifierType.ts @@ -0,0 +1,33 @@ +const esdtParts = 2; +const nftParts = 3; + +const defaultResult = { + isEsdt: false, + isNft: false, + isEgld: false +}; + +export function getIdentifierType(identifier?: string): { + isEsdt: boolean; + isNft: boolean; + isEgld: boolean; +} { + const parts = identifier?.split('-').length; + + if (parts === esdtParts) { + return { + ...defaultResult, + isEsdt: true + }; + } + if (parts === nftParts) { + return { + ...defaultResult, + isNft: true + }; + } + return { + ...defaultResult, + isEgld: true + }; +} diff --git a/src/utils/validation/index.ts b/src/utils/validation/index.ts new file mode 100644 index 0000000..ec1521a --- /dev/null +++ b/src/utils/validation/index.ts @@ -0,0 +1,6 @@ +export * from './stringIsInteger'; +export * from './stringIsFloat'; +export * from './maxDecimals'; +export * from './getIdentifierType'; +export * from './addressIsValid'; +export * from './isContract'; diff --git a/src/utils/validation/isContract.ts b/src/utils/validation/isContract.ts new file mode 100644 index 0000000..a3a5b06 --- /dev/null +++ b/src/utils/validation/isContract.ts @@ -0,0 +1,99 @@ +import { Address, TransactionPayload } from '@multiversx/sdk-core'; +import { ESDTTransferTypesEnum, TypesOfSmartContractCallsEnum } from 'types'; +import { addressIsValid } from './addressIsValid'; +import { isStringBase64 } from 'utils/decoders/base64Utils'; + +export function isContract( + receiver: string, + sender?: string, + data = '' +): boolean { + const isValid = addressIsValid(receiver); + + if (!isValid) { + return false; + } + + const isContract = new Address(receiver).isContractAddress(); + + if (isContract) { + return true; + } + + const extractedAddress = getAddressFromDataField({ receiver, data }); + + if (!extractedAddress) { + return false; + } + + const isExtractedAddressContractCall = new Address( + extractedAddress + ).isContractAddress(); + + return ( + isExtractedAddressContractCall || isSelfESDTContract(receiver, sender, data) + ); +} + +const isHexValidCharacters = (str: string) => { + return str.toLowerCase().match(/[0-9a-f]/g); +}; +const isHexValidLength = (str: string) => { + return str.length % 2 === 0; +}; + +export function isSelfESDTContract( + receiver: string, + sender?: string, + data?: string +) { + const parts = data?.split('@'); + if (parts == null) { + return false; + } + const [type, ...restParts] = parts; + const isSelfTransaction = + sender != null && receiver != null && receiver === sender; + const isCorrectESDTType = Object.values(ESDTTransferTypesEnum).includes( + type as ESDTTransferTypesEnum + ); + const areDataPartsValid = restParts.every( + (part) => isHexValidCharacters(part) && isHexValidLength(part) + ); + return isSelfTransaction && isCorrectESDTType && areDataPartsValid; +} + +export function getAddressFromDataField({ + receiver, + data +}: { + receiver: string; + data: string; +}) { + try { + if (!data) { + return receiver; + } + const parsedData = isStringBase64(data) + ? TransactionPayload.fromEncoded(data).toString() + : data; + + const addressIndex = getAddressIndex(parsedData); + + const parts = parsedData.split('@'); + return addressIndex > -1 ? parts[addressIndex] : receiver; + } catch (err) { + console.log(err); + return; + } +} + +function getAddressIndex(data: string) { + if (data.includes(TypesOfSmartContractCallsEnum.MultiESDTNFTTransfer)) { + return 1; + } + if (data.includes(TypesOfSmartContractCallsEnum.ESDTNFTTransfer)) { + return 4; + } + return -1; +} diff --git a/src/utils/validation/maxDecimals.ts b/src/utils/validation/maxDecimals.ts new file mode 100644 index 0000000..b56d2a7 --- /dev/null +++ b/src/utils/validation/maxDecimals.ts @@ -0,0 +1,10 @@ +export const maxDecimals = (amount: string, decimals = 18) => { + if ( + amount != null && + amount.toString().indexOf('.') >= 0 && + (amount as any).toString().split('.').pop().length > decimals + ) { + return false; + } + return true; +}; diff --git a/src/utils/validation/stringIsFloat.ts b/src/utils/validation/stringIsFloat.ts new file mode 100755 index 0000000..f95e875 --- /dev/null +++ b/src/utils/validation/stringIsFloat.ts @@ -0,0 +1,25 @@ +import BigNumber from 'bignumber.js'; +import { ZERO } from 'constants/index'; + +export const stringIsFloat = (amount: string) => { + if (isNaN(amount as any)) { + return false; + } + if (amount == null) { + return false; + } + if (String(amount).includes('Infinity')) { + return false; + } + + // eslint-disable-next-line + let [wholes, decimals] = amount.split('.'); + if (decimals) { + while (decimals.charAt(decimals.length - 1) === ZERO) { + decimals = decimals.slice(0, -1); + } + } + const number = decimals ? [wholes, decimals].join('.') : wholes; + const bNparsed = new BigNumber(number); + return bNparsed.toString(10) === number && bNparsed.comparedTo(0) >= 0; +}; diff --git a/src/utils/validation/stringIsInteger.ts b/src/utils/validation/stringIsInteger.ts new file mode 100644 index 0000000..990c232 --- /dev/null +++ b/src/utils/validation/stringIsInteger.ts @@ -0,0 +1,16 @@ +import BigNumber from 'bignumber.js'; + +export const stringIsInteger = ( + integer: string, + positiveNumbersOnly = true +) => { + const stringInteger = String(integer); + if (!stringInteger.match(/^[-]?\d+$/)) { + return false; + } + const bNparsed = new BigNumber(stringInteger); + const limit = positiveNumbersOnly ? 0 : -1; + return ( + bNparsed.toString(10) === stringInteger && bNparsed.comparedTo(0) >= limit + ); +}; diff --git a/src/utils/validation/tests/isContract.test.ts b/src/utils/validation/tests/isContract.test.ts new file mode 100644 index 0000000..88a9e24 --- /dev/null +++ b/src/utils/validation/tests/isContract.test.ts @@ -0,0 +1,29 @@ +import { isContract } from '../isContract'; + +const userAddress = + 'erd1a07ey0xj28u90mtk8858zsavs0cj7s3cy74ufgxdmcq3nslr0y2st2aaax'; +const contractAddress = + 'erd1qqqqqqqqqqqqqpgqv9gxgq8nurz754spjfck6rdwlg9etpcp0n4sjg2dhc'; + +describe('isContract tests', () => { + it('returns false for user account', () => { + const valid = isContract(userAddress); + expect(valid).toBe(false); + }); + it('returns true for smart contract', () => { + const valid = isContract(contractAddress); + expect(valid).toBe(true); + }); + it('returns false for invalid address', () => { + const valid = isContract('erd1qqqqqqqqqqqqqqqpq'); + expect(valid).toBe(false); + }); + it('returns true for contract address in data', () => { + const valid = isContract( + userAddress, + undefined, + 'MultiESDTNFTTransfer@0000000000000000050061506400f3e0c5ea560192716d0daefa0b9587017ceb@02@5745474c442d383836303061@@8ac7230489e80000@555344432d613332393036@@464e61d6@6164644c6971756964697479@8963dd8c2c5e0000@459a65fa' + ); + expect(valid).toBe(true); + }); +}); diff --git a/src/utils/validation/tests/stringIsFloat.test.ts b/src/utils/validation/tests/stringIsFloat.test.ts new file mode 100644 index 0000000..7b6f511 --- /dev/null +++ b/src/utils/validation/tests/stringIsFloat.test.ts @@ -0,0 +1,57 @@ +import { stringIsFloat } from '../stringIsFloat'; + +describe('stringIsFloat tests', () => { + it('rejects undefined', () => { + expect(stringIsFloat(undefined as any)).toBe(false); + }); + it('rejects object', () => { + expect(stringIsFloat({} as any)).toBe(false); + }); + it('rejects null', () => { + expect(stringIsFloat(null as any)).toBe(false); + }); + it('allows valid numbers', () => { + expect(stringIsFloat('1')).toBe(true); + }); + it('allows decimal numbers with zeros', () => { + expect(stringIsFloat('0.1')).toBe(true); + expect(stringIsFloat('0.001')).toBe(true); + }); + it('allows large decimal places', () => { + expect(stringIsFloat('999999999999999999999.123456789012345678')).toBe( + true + ); + expect(stringIsFloat('0.111111111111111111')).toBe(true); + }); + it('allows trailing 0', () => { + expect(stringIsFloat('0.10')).toBe(true); + expect(stringIsFloat('10')).toBe(true); + }); + it('denies negative numbers', () => { + expect(stringIsFloat('-1')).toBe(false); + }); + it('denies explicit positive', () => { + expect(stringIsFloat('+1')).toBe(false); + }); + it('denies leading 0', () => { + expect(stringIsFloat('01')).toBe(false); + }); + it('denies string', () => { + expect(stringIsFloat('null')).toBe(false); + }); + it('denies hexadecimal', () => { + expect(stringIsFloat('0x2')).toBe(false); + }); + it('denies exponential', () => { + expect(stringIsFloat('1e2')).toBe(false); + }); + it('denies caret separation', () => { + expect(stringIsFloat('100_200')).toBe(false); + }); + it('denies NaN', () => { + expect(stringIsFloat(NaN as any)).toBe(false); + }); + it('denies caret separation', () => { + expect(stringIsFloat(Infinity as any)).toBe(false); + }); +}); diff --git a/src/utils/validation/tests/stringIsInteger.test.tsx b/src/utils/validation/tests/stringIsInteger.test.tsx new file mode 100644 index 0000000..357ab67 --- /dev/null +++ b/src/utils/validation/tests/stringIsInteger.test.tsx @@ -0,0 +1,51 @@ +import { stringIsInteger } from './../stringIsInteger'; + +describe('stringIsInteger tests', () => { + it('allows valid numbers', () => { + expect(stringIsInteger('1')).toBe(true); + expect(stringIsInteger('999999999999999999999')).toBe(true); + }); + it('allows valid integer numbers', () => { + expect(stringIsInteger(1 as any)).toBe(true); + expect(stringIsInteger(0 as any)).toBe(true); + // eslint-disable-next-line + expect(stringIsInteger(999999999999999999999 as any)).toBe(false); + }); + it('rejects float numbers', () => { + expect(stringIsInteger('1.1')).toBe(false); + }); + it('rejects strings', () => { + expect(stringIsInteger('1a')).toBe(false); + }); + it('rejects undefined', () => { + expect(stringIsInteger(undefined as any)).toBe(false); + }); + it('rejects NaN', () => { + expect(stringIsInteger(NaN as any)).toBe(false); + }); + it('rejects null', () => { + expect(stringIsInteger(null as any)).toBe(false); + }); + it('rejects negative', () => { + expect(stringIsInteger('-1')).toBe(false); + }); + it('allows negative if specified', () => { + expect(stringIsInteger('-1', false)).toBe(true); + expect(stringIsInteger('-3456000000000000000', false)).toBe(true); + }); + it('denies string', () => { + expect(stringIsInteger('null')).toBe(false); + }); + it('denies leading 0', () => { + expect(stringIsInteger('01')).toBe(false); + }); + it('rejects explicit positive', () => { + expect(stringIsInteger('+1')).toBe(false); + }); + it('rejects hexa', () => { + expect(stringIsInteger('0x69859')).toBe(false); + }); + it('rejects exponential string', () => { + expect(stringIsInteger('1e20')).toBe(false); + }); +}); diff --git a/src/utils/window/addOriginToLocationPath.ts b/src/utils/window/addOriginToLocationPath.ts new file mode 100644 index 0000000..ffd408d --- /dev/null +++ b/src/utils/window/addOriginToLocationPath.ts @@ -0,0 +1,15 @@ +import { getWindowLocation } from './getWindowLocation'; + +export const addOriginToLocationPath = (path = '') => { + const location = getWindowLocation(); + const isHrefUrl = path.startsWith('http') || path.startsWith('www.'); + + const shouldNotChangePath = + !location.origin || path.startsWith(location.origin) || isHrefUrl; + + if (shouldNotChangePath) { + return path; + } + + return `${location.origin}/${path.replace('/', '')}`; +}; diff --git a/src/utils/window/buildUrlParams.ts b/src/utils/window/buildUrlParams.ts new file mode 100644 index 0000000..ba7cbff --- /dev/null +++ b/src/utils/window/buildUrlParams.ts @@ -0,0 +1,14 @@ +export function buildUrlParams( + search: string, + urlParams: { + [key: string]: string; + } +) { + const urlSearchParams: any = new URLSearchParams(search); + const params = Object.fromEntries(urlSearchParams); + const nextUrlParams = new URLSearchParams({ + ...params, + ...urlParams + }).toString(); + return { nextUrlParams, params }; +} diff --git a/src/utils/window/getDefaultCallbackUrl.ts b/src/utils/window/getDefaultCallbackUrl.ts new file mode 100644 index 0000000..d5e149b --- /dev/null +++ b/src/utils/window/getDefaultCallbackUrl.ts @@ -0,0 +1,7 @@ +import { getWindowLocation } from './index'; + +export const getDefaultCallbackUrl = () => { + const { pathname, search, hash } = getWindowLocation(); + + return `${pathname ?? ''}${search ?? ''}${hash ?? ''}`; +}; diff --git a/src/utils/window/getWindowLocation.ts b/src/utils/window/getWindowLocation.ts new file mode 100644 index 0000000..e5a415d --- /dev/null +++ b/src/utils/window/getWindowLocation.ts @@ -0,0 +1,35 @@ +import { isWindowAvailable } from './isWindowAvailable'; + +type GetWindowLocationType = { + pathname: string; + hash: string; + origin: string; + href: string; + search: string; +}; + +export const getWindowLocation = (): GetWindowLocationType => { + const isAvailable = isWindowAvailable(); + + if (!isAvailable) { + return { + pathname: '', + hash: '', + origin: '', + href: '', + search: '' + }; + } + + const { + location: { pathname, hash, origin, href, search } + } = window; + + return { + pathname, + hash, + origin, + href, + search + }; +}; diff --git a/src/utils/window/index.ts b/src/utils/window/index.ts new file mode 100644 index 0000000..c4aeeff --- /dev/null +++ b/src/utils/window/index.ts @@ -0,0 +1,6 @@ +export * from './addOriginToLocationPath'; +export * from './getDefaultCallbackUrl'; +export * from './getWindowLocation'; +export * from './isWindowAvailable'; +export * from './sanitizeCallbackUrl'; +export * from './buildUrlParams'; diff --git a/src/utils/window/isWindowAvailable.ts b/src/utils/window/isWindowAvailable.ts new file mode 100644 index 0000000..46354e5 --- /dev/null +++ b/src/utils/window/isWindowAvailable.ts @@ -0,0 +1,2 @@ +export const isWindowAvailable = () => + typeof window != 'undefined' && typeof window?.location != 'undefined'; diff --git a/src/utils/window/sanitizeCallbackUrl.ts b/src/utils/window/sanitizeCallbackUrl.ts new file mode 100644 index 0000000..bea5ea4 --- /dev/null +++ b/src/utils/window/sanitizeCallbackUrl.ts @@ -0,0 +1,22 @@ +export const sanitizeCallbackUrl = ( + targetURL: string, + vulnerableItems: string[] = ['address'] +) => { + const url = new URL(targetURL); + const params = new URLSearchParams(url.search); + + vulnerableItems.forEach((vulnerableItem) => params.delete(vulnerableItem)); + + const questionMark = Array.from(params.values()).length > 0 ? '?' : ''; + + const pathname = + url.pathname === '/' && !targetURL.endsWith('/') ? '' : url.pathname; + + if (url.protocol === 'vscode:') { + return targetURL; + } + + return `${url.origin}${pathname}${questionMark}${params.toString()}${ + url.hash + }`; +}; diff --git a/src/utils/window/tests/addOriginToLocationPath.test.ts b/src/utils/window/tests/addOriginToLocationPath.test.ts new file mode 100644 index 0000000..e61f23e --- /dev/null +++ b/src/utils/window/tests/addOriginToLocationPath.test.ts @@ -0,0 +1,67 @@ +import { addOriginToLocationPath } from '../addOriginToLocationPath'; + +let windowSpy: jest.SpyInstance; + +beforeEach(() => { + windowSpy = jest.spyOn(window, 'window', 'get'); +}); +afterEach(() => { + windowSpy.mockRestore(); +}); + +describe('Add window origin to pathname', () => { + it('should leave the path unchanged if origin is not available', () => { + windowSpy.mockImplementation(() => ({ + location: { + origin: '' + } + })); + + const path = addOriginToLocationPath('http://somesite/unlock'); + expect(path).toStrictEqual('http://somesite/unlock'); + }); + + it('should leave the path unchanged if it contains origin', () => { + windowSpy.mockImplementation(() => ({ + location: { + origin: 'https://multiversx.com' + } + })); + + const path = addOriginToLocationPath('http://somesite/unlock'); + expect(path).toStrictEqual('http://somesite/unlock'); + }); + + it('should leave the path unchanged if it contains the same origin as current one', () => { + windowSpy.mockImplementation(() => ({ + location: { + origin: 'http://somesite' + } + })); + + const path = addOriginToLocationPath('http://somesite/unlock'); + expect(path).toStrictEqual('http://somesite/unlock'); + }); + + it('should add the current origin to the path', () => { + windowSpy.mockImplementation(() => ({ + location: { + origin: 'https://multiversx.com' + } + })); + + const path = addOriginToLocationPath('/unlock'); + expect(path).toStrictEqual('https://multiversx.com/unlock'); + }); + + it('should return current origin if no parameter is specified', () => { + windowSpy.mockImplementation(() => ({ + location: { + origin: 'https://multiversx.com' + } + })); + + const path = addOriginToLocationPath(); + expect(path).toStrictEqual('https://multiversx.com/'); + }); +}); diff --git a/src/utils/window/tests/buildUrlParams.test.ts b/src/utils/window/tests/buildUrlParams.test.ts new file mode 100644 index 0000000..80baccd --- /dev/null +++ b/src/utils/window/tests/buildUrlParams.test.ts @@ -0,0 +1,75 @@ +import { buildUrlParams } from '../buildUrlParams'; + +describe('buildUrlParams', () => { + test('should combine search and urlParams correctly', () => { + const search = 'foo=bar&baz=qux'; + const urlParams = { alpha: 'beta', gamma: 'delta' }; + + const result = buildUrlParams(search, urlParams); + + expect(result).toEqual({ + nextUrlParams: 'foo=bar&baz=qux&alpha=beta&gamma=delta', + params: { foo: 'bar', baz: 'qux' } + }); + }); + + test('should overwrite existing params with urlParams', () => { + const search = 'foo=bar&baz=qux'; + const urlParams = { foo: 'newBar', gamma: 'delta' }; + + const result = buildUrlParams(search, urlParams); + + expect(result).toEqual({ + nextUrlParams: 'foo=newBar&baz=qux&gamma=delta', + params: { foo: 'bar', baz: 'qux' } + }); + }); + + test('should handle empty search string', () => { + const search = ''; + const urlParams = { alpha: 'beta', gamma: 'delta' }; + + const result = buildUrlParams(search, urlParams); + + expect(result).toEqual({ + nextUrlParams: 'alpha=beta&gamma=delta', + params: {} + }); + }); + + test('should handle empty urlParams', () => { + const search = 'foo=bar&baz=qux'; + const urlParams = {}; + + const result = buildUrlParams(search, urlParams); + + expect(result).toEqual({ + nextUrlParams: 'foo=bar&baz=qux', + params: { foo: 'bar', baz: 'qux' } + }); + }); + + test('should handle both empty search and urlParams', () => { + const search = ''; + const urlParams = {}; + + const result = buildUrlParams(search, urlParams); + + expect(result).toEqual({ + nextUrlParams: '', + params: {} + }); + }); + + test('should handle special characters in params', () => { + const search = 'foo=bar%20baz&baz=qux'; + const urlParams = { alpha: 'beta gamma', gamma: 'delta' }; + + const result = buildUrlParams(search, urlParams); + + expect(result).toEqual({ + nextUrlParams: 'foo=bar+baz&baz=qux&alpha=beta+gamma&gamma=delta', + params: { foo: 'bar baz', baz: 'qux' } + }); + }); +}); diff --git a/src/utils/window/tests/getDefaultCallbackUrl.test.ts b/src/utils/window/tests/getDefaultCallbackUrl.test.ts new file mode 100644 index 0000000..d6f78ed --- /dev/null +++ b/src/utils/window/tests/getDefaultCallbackUrl.test.ts @@ -0,0 +1,96 @@ +import { getDefaultCallbackUrl } from '../getDefaultCallbackUrl'; + +const searchMock = '?search=mock'; +const pathnameMock = '/unlock'; +const originMock = 'https://multiversx.com'; +const hashMock = '#main'; +const hrefMock = 'https://multiversx.com/technology'; +const urlMock = '/unlock?search=mock#main'; + +let windowSpy: jest.SpyInstance; + +beforeEach(() => { + windowSpy = jest.spyOn(window, 'window', 'get'); +}); +afterEach(() => { + windowSpy.mockRestore(); +}); + +describe('Get window location', () => { + it('getDefaultCallbackUrl should be undefined', () => { + windowSpy.mockImplementation(() => undefined); + + const callbackUrl = getDefaultCallbackUrl(); + expect(callbackUrl).toStrictEqual(''); + }); + + it('window should return search', () => { + windowSpy.mockImplementation(() => ({ + location: { + search: searchMock + } + })); + + const callbackUrl = getDefaultCallbackUrl(); + expect(callbackUrl).toStrictEqual(searchMock); + }); + + it('getDefaultCallbackUrl should return pathname', () => { + windowSpy.mockImplementation(() => ({ + location: { + pathname: pathnameMock + } + })); + + const callbackUrl = getDefaultCallbackUrl(); + expect(callbackUrl).toStrictEqual(pathnameMock); + }); + + it('getDefaultCallbackUrl should return empty string when only origin is specified', () => { + windowSpy.mockImplementation(() => ({ + location: { + origin: originMock + } + })); + + const callbackUrl = getDefaultCallbackUrl(); + expect(callbackUrl).toStrictEqual(''); + }); + + it('getDefaultCallbackUrl should return hash', () => { + windowSpy.mockImplementation(() => ({ + location: { + hash: hashMock + } + })); + + const callbackUrl = getDefaultCallbackUrl(); + expect(callbackUrl).toStrictEqual(hashMock); + }); + + it('getDefaultCallbackUrl should return empty', () => { + windowSpy.mockImplementation(() => ({ + location: { + href: hrefMock + } + })); + + const callbackUrl = getDefaultCallbackUrl(); + expect(callbackUrl).toStrictEqual(''); + }); + + it('getDefaultCallbackUrl should return complete URL without origin', () => { + windowSpy.mockImplementation(() => ({ + location: { + pathname: pathnameMock, + origin: originMock, + hash: hashMock, + href: hrefMock, + search: searchMock + } + })); + + const callbackUrl = getDefaultCallbackUrl(); + expect(callbackUrl).toStrictEqual(urlMock); + }); +}); diff --git a/src/utils/window/tests/getWindowLocation.test.ts b/src/utils/window/tests/getWindowLocation.test.ts new file mode 100644 index 0000000..fa64246 --- /dev/null +++ b/src/utils/window/tests/getWindowLocation.test.ts @@ -0,0 +1,80 @@ +import { getWindowLocation } from '../getWindowLocation'; + +const searchMock = '?search=mock'; +const pathnameMock = '/unlock'; +const originMock = 'https://multiversx.com'; +const hashMock = '#main'; +const hrefMock = 'https://multiversx.com/technology'; + +let windowSpy: jest.SpyInstance; + +beforeEach(() => { + windowSpy = jest.spyOn(window, 'window', 'get'); +}); +afterEach(() => { + windowSpy.mockRestore(); +}); + +describe('Get window location', () => { + it('Window should be undefined', () => { + windowSpy.mockImplementation(() => undefined); + + const { search } = getWindowLocation(); + expect(search).toStrictEqual(''); + }); + + it('window should return search', () => { + windowSpy.mockImplementation(() => ({ + location: { + search: searchMock + } + })); + + const { search } = getWindowLocation(); + expect(search).toStrictEqual(searchMock); + }); + + it('Window should return pathname', () => { + windowSpy.mockImplementation(() => ({ + location: { + pathname: pathnameMock + } + })); + + const { pathname } = getWindowLocation(); + expect(pathname).toStrictEqual(pathnameMock); + }); + + it('Window should return origin', () => { + windowSpy.mockImplementation(() => ({ + location: { + origin: originMock + } + })); + + const { origin } = getWindowLocation(); + expect(origin).toStrictEqual(originMock); + }); + + it('Window should return hash', () => { + windowSpy.mockImplementation(() => ({ + location: { + hash: hashMock + } + })); + + const { hash } = getWindowLocation(); + expect(hash).toStrictEqual(hashMock); + }); + + it('Window should return href', () => { + windowSpy.mockImplementation(() => ({ + location: { + href: hrefMock + } + })); + + const { href } = getWindowLocation(); + expect(href).toStrictEqual(hrefMock); + }); +}); diff --git a/src/utils/window/tests/sanitizeCallbackUrl.test.ts b/src/utils/window/tests/sanitizeCallbackUrl.test.ts new file mode 100644 index 0000000..248397d --- /dev/null +++ b/src/utils/window/tests/sanitizeCallbackUrl.test.ts @@ -0,0 +1,39 @@ +import { sanitizeCallbackUrl } from '../sanitizeCallbackUrl'; + +describe('sanitizeLoginCallbackUrl tests', () => { + test('Keeps original URL unchanged', () => { + const result = sanitizeCallbackUrl('https://wallet.multiversx.com'); + expect(result).toEqual('https://wallet.multiversx.com'); + }); + test('Keeps the path and hash of the URL', () => { + const result = sanitizeCallbackUrl( + 'https://wallet.multiversx.com/path#hash' + ); + expect(result).toEqual('https://wallet.multiversx.com/path#hash'); + }); + test('remove "address" item from query params when this is the only query item', () => { + const result = sanitizeCallbackUrl( + 'https://localhost:3000/feed?address=erd1-address' + ); + expect(result).toEqual('https://localhost:3000/feed'); + }); + test('remove only "address" item from query params when many query params exits on the URL', () => { + const result = sanitizeCallbackUrl( + 'https://localhost:3000/feed?address=erd1-address&qp1=some-val&qp2=some-val-2' + ); + expect(result).toEqual( + 'https://localhost:3000/feed?qp1=some-val&qp2=some-val-2' + ); + }); + test('remove only all vulnerable items from query params', () => { + const result = sanitizeCallbackUrl( + 'https://localhost:3000/feed?address=erd1-address&qp1=some-val&vulnerableItem1=vi1&vulnerableItem2=vi2&abc=123', + ['address', 'vulnerableItem1', 'vulnerableItem2'] + ); + expect(result).toEqual('https://localhost:3000/feed?qp1=some-val&abc=123'); + }); + test('allow sanitize vscode origin', () => { + const result = sanitizeCallbackUrl('vscode://elrond.vscode-elrond-ide'); + expect(result).toEqual('vscode://elrond.vscode-elrond-ide'); + }); +}); diff --git a/yarn.lock b/yarn.lock index b899d69..4e66358 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,156 +10,159 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2": - version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" - integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== dependencies: - "@babel/highlight" "^7.24.2" + "@babel/highlight" "^7.24.7" picocolors "^1.0.0" -"@babel/compat-data@^7.23.5": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" - integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== +"@babel/compat-data@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed" + integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw== "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" - integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.7.tgz#b676450141e0b52a3d43bc91da86aa608f950ac4" + integrity sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.5" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.24.5" - "@babel/helpers" "^7.24.5" - "@babel/parser" "^7.24.5" - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.5" - "@babel/types" "^7.24.5" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helpers" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/template" "^7.24.7" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.24.5", "@babel/generator@^7.7.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" - integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== +"@babel/generator@^7.24.7", "@babel/generator@^7.7.2": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.7.tgz#1654d01de20ad66b4b4d99c135471bc654c55e6d" + integrity sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA== dependencies: - "@babel/types" "^7.24.5" + "@babel/types" "^7.24.7" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" - integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== +"@babel/helper-compilation-targets@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz#4eb6c4a80d6ffeac25ab8cd9a21b5dfa48d503a9" + integrity sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg== dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-validator-option" "^7.23.5" + "@babel/compat-data" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" browserslist "^4.22.2" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.24.3": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" - integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== - dependencies: - "@babel/types" "^7.24.0" - -"@babel/helper-module-transforms@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" - integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.24.3" - "@babel/helper-simple-access" "^7.24.5" - "@babel/helper-split-export-declaration" "^7.24.5" - "@babel/helper-validator-identifier" "^7.24.5" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" - integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== - -"@babel/helper-simple-access@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba" - integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ== - dependencies: - "@babel/types" "^7.24.5" - -"@babel/helper-split-export-declaration@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6" - integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== - dependencies: - "@babel/types" "^7.24.5" - -"@babel/helper-string-parser@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" - integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== - -"@babel/helper-validator-identifier@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" - integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== - -"@babel/helper-validator-option@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" - integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== - -"@babel/helpers@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a" - integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q== - dependencies: - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.5" - "@babel/types" "^7.24.5" - -"@babel/highlight@^7.24.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" - integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== - dependencies: - "@babel/helper-validator-identifier" "^7.24.5" +"@babel/helper-environment-visitor@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" + integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-function-name@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" + integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== + dependencies: + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-hoist-variables@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" + integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-module-transforms@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz#31b6c9a2930679498db65b685b1698bfd6c7daf8" + integrity sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ== + dependencies: + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.8.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz#98c84fe6fe3d0d3ae7bfc3a5e166a46844feb2a0" + integrity sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg== + +"@babel/helper-simple-access@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-split-export-declaration@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" + integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-string-parser@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2" + integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== + +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/helper-validator-option@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz#24c3bb77c7a425d1742eec8fb433b5a1b38e62f6" + integrity sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw== + +"@babel/helpers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.7.tgz#aa2ccda29f62185acb5d42fb4a3a1b1082107416" + integrity sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg== + dependencies: + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" chalk "^2.4.2" js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" - integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" + integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -197,11 +200,11 @@ "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.7.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" - integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d" + integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" @@ -253,44 +256,44 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" - integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== - dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - -"@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" - integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.24.0" - "@babel/types" "^7.24.0" - -"@babel/traverse@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" - integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== - dependencies: - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.24.5" - "@babel/parser" "^7.24.5" - "@babel/types" "^7.24.5" + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz#58d458271b4d3b6bb27ee6ac9525acbb259bad1c" + integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/template@^7.24.7", "@babel/template@^7.3.3": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315" + integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/traverse@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.7.tgz#de2b900163fa741721ba382163fe46a936c40cf5" + integrity sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-hoist-variables" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/types" "^7.24.7" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.3.3": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" - integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.3.3": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.7.tgz#6027fe12bc1aa724cd32ab113fb7f1988f1f66f2" + integrity sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q== dependencies: - "@babel/helper-string-parser" "^7.24.1" - "@babel/helper-validator-identifier" "^7.24.5" + "@babel/helper-string-parser" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -298,120 +301,120 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@esbuild/aix-ppc64@0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.1.tgz#044268dc9ca4dc67f8d4aad8f51cfb894bfd7114" - integrity sha512-O7yppwipkXvnEPjzkSXJRk2g4bS8sUx9p9oXHq9MU/U7lxUzZVsnFZMDTmeeX9bfQxrFcvOacl/ENgOh0WP9pA== - -"@esbuild/android-arm64@0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.1.tgz#76aacd934449e541f05b66d5ec8cbff96ec2ae81" - integrity sha512-jXhccq6es+onw7x8MxoFnm820mz7sGa9J14kLADclmiEUH4fyj+FjR6t0M93RgtlI/awHWhtF0Wgfhqgf9gDZA== - -"@esbuild/android-arm@0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.1.tgz#8247c5aef933a212bca261290f6e43a9dca07cc5" - integrity sha512-hh3jKWikdnTtHCglDAeVO3Oyh8MaH8xZUaWMiCCvJ9/c3NtPqZq+CACOlGTxhddypXhl+8B45SeceYBfB/e8Ow== - -"@esbuild/android-x64@0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.1.tgz#80cbfa35412299edefbc4ab78064f0b66e448008" - integrity sha512-NPObtlBh4jQHE01gJeucqEhdoD/4ya2owSIS8lZYS58aR0x7oZo9lB2lVFxgTANSa5MGCBeoQtr+yA9oKCGPvA== - -"@esbuild/darwin-arm64@0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.1.tgz#154167fb9e54017dac4b343f8e5e25c9d9324036" - integrity sha512-BLT7TDzqsVlQRmJfO/FirzKlzmDpBWwmCUlyggfzUwg1cAxVxeA4O6b1XkMInlxISdfPAOunV9zXjvh5x99Heg== - -"@esbuild/darwin-x64@0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.1.tgz#db971502c9fa204906b89e489810c902bf6d9afb" - integrity sha512-D3h3wBQmeS/vp93O4B+SWsXB8HvRDwMyhTNhBd8yMbh5wN/2pPWRW5o/hM3EKgk9bdKd9594lMGoTCTiglQGRQ== - -"@esbuild/freebsd-arm64@0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.1.tgz#f0f3bc20c23af999bd696099a324dceb66d77761" - integrity sha512-/uVdqqpNKXIxT6TyS/oSK4XE4xWOqp6fh4B5tgAwozkyWdylcX+W4YF2v6SKsL4wCQ5h1bnaSNjWPXG/2hp8AQ== - -"@esbuild/freebsd-x64@0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.1.tgz#d36af9085edb34244b41e5a57640e6b4452cbec2" - integrity sha512-paAkKN1n1jJitw+dAoR27TdCzxRl1FOEITx3h201R6NoXUojpMzgMLdkXVgCvaCSCqwYkeGLoe9UVNRDKSvQgw== - -"@esbuild/linux-arm64@0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.1.tgz#9d2ad42eea33b2a9571f13e7ecc39ee9d3ff0c6d" - integrity sha512-G65d08YoH00TL7Xg4LaL3gLV21bpoAhQ+r31NUu013YB7KK0fyXIt05VbsJtpqh/6wWxoLJZOvQHYnodRrnbUQ== - -"@esbuild/linux-arm@0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.1.tgz#d6f7c5873479dd97148bef3e3a7f09d486642883" - integrity sha512-tRHnxWJnvNnDpNVnsyDhr1DIQZUfCXlHSCDohbXFqmg9W4kKR7g8LmA3kzcwbuxbRMKeit8ladnCabU5f2traA== - -"@esbuild/linux-ia32@0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.1.tgz#8f2aef34a31c8d16dbce0b8679021f4881f38efe" - integrity sha512-tt/54LqNNAqCz++QhxoqB9+XqdsaZOtFD/srEhHYwBd3ZUOepmR1Eeot8bS+Q7BiEvy9vvKbtpHf+r6q8hF5UA== - -"@esbuild/linux-loong64@0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.1.tgz#44461ea2388efbafa6cf12b2bc1407a5388da066" - integrity sha512-MhNalK6r0nZD0q8VzUBPwheHzXPr9wronqmZrewLfP7ui9Fv1tdPmg6e7A8lmg0ziQCziSDHxh3cyRt4YMhGnQ== - -"@esbuild/linux-mips64el@0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.1.tgz#754d533a4fef4b0790d82bfe1e82d6876f18370e" - integrity sha512-YCKVY7Zen5rwZV+nZczOhFmHaeIxR4Zn3jcmNH53LbgF6IKRwmrMywqDrg4SiSNApEefkAbPSIzN39FC8VsxPg== - -"@esbuild/linux-ppc64@0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.1.tgz#2aafcfe2826c7d5d2e3c41eb8934e6368a7cada5" - integrity sha512-bw7bcQ+270IOzDV4mcsKAnDtAFqKO0jVv3IgRSd8iM0ac3L8amvCrujRVt1ajBTJcpDaFhIX+lCNRKteoDSLig== - -"@esbuild/linux-riscv64@0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.1.tgz#481ceaf5939d14fb25da62a385b5e6c2096a3370" - integrity sha512-ARmDRNkcOGOm1AqUBSwRVDfDeD9hGYRfkudP2QdoonBz1ucWVnfBPfy7H4JPI14eYtZruRSczJxyu7SRYDVOcg== - -"@esbuild/linux-s390x@0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.1.tgz#e25b97005e4c82540d1bc7af88e333fb55142570" - integrity sha512-o73TcUNMuoTZlhwFdsgr8SfQtmMV58sbgq6gQq9G1xUiYnHMTmJbwq65RzMx89l0iya69lR4bxBgtWiiOyDQZA== - -"@esbuild/linux-x64@0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.1.tgz#a05a61d0a0cbb03baa6db12cd8164c1e5265ffb2" - integrity sha512-da4/1mBJwwgJkbj4fMH7SOXq2zapgTo0LKXX1VUZ0Dxr+e8N0WbS80nSZ5+zf3lvpf8qxrkZdqkOqFfm57gXwA== - -"@esbuild/netbsd-x64@0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.1.tgz#e298f854e8999563f2e4668bd542678c46be4b53" - integrity sha512-CPWs0HTFe5woTJN5eKPvgraUoRHrCtzlYIAv9wBC+FAyagBSaf+UdZrjwYyTGnwPGkThV4OCI7XibZOnPvONVw== - -"@esbuild/openbsd-x64@0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.1.tgz#640d34de1e3c6bc3ff64e0379aae00ede3608f14" - integrity sha512-xxhTm5QtzNLc24R0hEkcH+zCx/o49AsdFZ0Cy5zSd/5tOj4X2g3/2AJB625NoadUuc4A8B3TenLJoYdWYOYCew== - -"@esbuild/sunos-x64@0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.1.tgz#f53cb1cdcbf05b3320e147ddb85ec2b1cf2b6cfc" - integrity sha512-CWibXszpWys1pYmbr9UiKAkX6x+Sxw8HWtw1dRESK1dLW5fFJ6rMDVw0o8MbadusvVQx1a8xuOxnHXT941Hp1A== - -"@esbuild/win32-arm64@0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.1.tgz#df4f44f9b4fec9598c0ec2c34fec9c568c8ab85d" - integrity sha512-jb5B4k+xkytGbGUS4T+Z89cQJ9DJ4lozGRSV+hhfmCPpfJ3880O31Q1srPCimm+V6UCbnigqD10EgDNgjvjerQ== - -"@esbuild/win32-ia32@0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.1.tgz#a57edbd9905db9f957327ae0facfbf406a80a4e4" - integrity sha512-PgyFvjJhXqHn1uxPhyN1wZ6dIomKjiLUQh1LjFvjiV1JmnkZ/oMPrfeEAZg5R/1ftz4LZWZr02kefNIQ5SKREQ== - -"@esbuild/win32-x64@0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.1.tgz#eb86553d90e86a8c174b96650fdb4c60f2de16a7" - integrity sha512-W9NttRZQR5ehAiqHGDnvfDaGmQOm6Fi4vSlce8mjM75x//XKuVAByohlEX6N17yZnVXxQFuh4fDRunP8ca6bfA== +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + +"@esbuild/darwin-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== + +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== + +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== + +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== + +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== + +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== + +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" @@ -421,14 +424,14 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + version "4.10.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.1.tgz#361461e5cb3845d874e61731c11cfedd664d83a0" + integrity sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA== "@eslint/eslintrc@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.0.2.tgz#36180f8e85bf34d2fe3ccc2261e8e204a411ab4e" - integrity sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg== + version "3.1.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6" + integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -465,9 +468,9 @@ integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@humanwhocodes/retry@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.2.3.tgz#c9aa036d1afa643f1250e83150f39efb3a15a631" - integrity sha512-X38nUbachlb01YMlvPFojKoiXq+LzZvuSce70KPMPdeM1Rj03k4dR7lDslhbqXn3Ang4EU3+EAmwEAsbrjHW3g== + version "0.2.4" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.2.4.tgz#4f3059423823bd8176132ceea9447dee101dfac1" + integrity sha512-Ttl/jHpxfS3st5sxwICYfk4pOH0WrLI1SpW283GgQL7sCWU7EHIOhX4b4fkIxr3tkfzwg8+FNojtzsIEE7Ecgg== "@isaacs/cliui@^8.0.2": version "8.0.2" @@ -728,22 +731,32 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@lit-labs/ssr-dom-shim@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.0.tgz#353ce4a76c83fadec272ea5674ede767650762fd" - integrity sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g== - -"@lit/reactive-element@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@lit/reactive-element/-/reactive-element-2.0.4.tgz#8f2ed950a848016383894a26180ff06c56ae001b" - integrity sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ== - dependencies: - "@lit-labs/ssr-dom-shim" "^1.2.0" - -"@multiversx/sdk-core@>= 12.18.0": - version "13.1.0" - resolved "https://registry.yarnpkg.com/@multiversx/sdk-core/-/sdk-core-13.1.0.tgz#ec3a117f8444611cc85941513f7d16c3f8236064" - integrity sha512-Z8lDPX4mKKD0QUtAqRzM0bf8zex3xCWRd5yYRLCxjW1F+jYg+9LjIQjkyvDSWGYJHY4IJeYqkORoS3gQG8NDbA== +"@mswjs/cookies@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@mswjs/cookies/-/cookies-0.2.2.tgz#b4e207bf6989e5d5427539c2443380a33ebb922b" + integrity sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g== + dependencies: + "@types/set-cookie-parser" "^2.4.0" + set-cookie-parser "^2.4.6" + +"@mswjs/interceptors@^0.17.10": + version "0.17.10" + resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.17.10.tgz#857b41f30e2b92345ed9a4e2b1d0a08b8b6fcad4" + integrity sha512-N8x7eSLGcmUFNWZRxT1vsHvypzIRgQYdG0rJey/rZCy6zT/30qDt8Joj7FxzGNLSwXbeZqJOMqDurp7ra4hgbw== + dependencies: + "@open-draft/until" "^1.0.3" + "@types/debug" "^4.1.7" + "@xmldom/xmldom" "^0.8.3" + debug "^4.3.3" + headers-polyfill "3.2.5" + outvariant "^1.2.1" + strict-event-emitter "^0.2.4" + web-encoding "^1.1.5" + +"@multiversx/sdk-core@>= 13.0.0": + version "13.2.1" + resolved "https://registry.yarnpkg.com/@multiversx/sdk-core/-/sdk-core-13.2.1.tgz#ed7cb7048b76d611adb2601ecb58eddb74977228" + integrity sha512-qnC4Q2x+lc7jw5GYja5yvRhqKaJ+2m95txNS6FwLXPb/MxW0ZwRZsAt4qByxOF5hpx6m9v3bJnKFFZn9VrHcNw== dependencies: "@multiversx/sdk-transaction-decoder" "1.0.2" bech32 "1.1.4" @@ -757,6 +770,13 @@ resolved "https://registry.yarnpkg.com/@multiversx/sdk-dapp-utils/-/sdk-dapp-utils-0.0.1.tgz#ba8bd9319649d45dea9a76beca1e03d957dea2cb" integrity sha512-fl3TdES93Jc4T559BI+QxNRGRUTabb7TiAXHKL9g6mbLD+silK+5euAoDpPBkbZpVFnfsXQssUVuyKBV4Ine6w== +"@multiversx/sdk-native-auth-client@^1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@multiversx/sdk-native-auth-client/-/sdk-native-auth-client-1.0.8.tgz#160b34b9ce80595008b1d7fdab75cea6347eb907" + integrity sha512-anXcQplVp3/m2rBH4oGQZNIhk0m/J45SomubNMCgSzepJ2PU5E5eQLYletvSDObhTGfRnNCF8edAldkDP9a4Kw== + dependencies: + axios "^1.6.8" + "@multiversx/sdk-transaction-decoder@1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/@multiversx/sdk-transaction-decoder/-/sdk-transaction-decoder-1.0.2.tgz#83ded4f6d4b877b4421234856eb19709be2af31b" @@ -794,6 +814,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@open-draft/until@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-1.0.3.tgz#db9cc719191a62e7d9200f6e7bab21c5b848adca" + integrity sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q== + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -876,76 +901,76 @@ dependencies: "@sinonjs/commons" "^3.0.0" -"@swc/core-darwin-arm64@1.4.17": - version "1.4.17" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.17.tgz#e62fa7f247bdd1c0c50a3f99722da4dd098c7c67" - integrity sha512-HVl+W4LezoqHBAYg2JCqR+s9ife9yPfgWSj37iIawLWzOmuuJ7jVdIB7Ee2B75bEisSEKyxRlTl6Y1Oq3owBgw== - -"@swc/core-darwin-x64@1.4.17": - version "1.4.17" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.4.17.tgz#1145cbb7575e317204ed3a7d0274bd26fe9ffab6" - integrity sha512-WYRO9Fdzq4S/he8zjW5I95G1zcvyd9yyD3Tgi4/ic84P5XDlSMpBDpBLbr/dCPjmSg7aUXxNQqKqGkl6dQxYlA== - -"@swc/core-linux-arm-gnueabihf@1.4.17": - version "1.4.17" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.17.tgz#7145b3ada5cf9b748eaacbc9a7c7037ba0fb26bb" - integrity sha512-cgbvpWOvtMH0XFjvwppUCR+Y+nf6QPaGu6AQ5hqCP+5Lv2zO5PG0RfasC4zBIjF53xgwEaaWmGP5/361P30X8Q== - -"@swc/core-linux-arm64-gnu@1.4.17": - version "1.4.17" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.17.tgz#5c0833ef132af17bd3cbdf2253f35b57c0cf62bb" - integrity sha512-l7zHgaIY24cF9dyQ/FOWbmZDsEj2a9gRFbmgx2u19e3FzOPuOnaopFj0fRYXXKCmtdx+anD750iBIYnTR+pq/Q== - -"@swc/core-linux-arm64-musl@1.4.17": - version "1.4.17" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.17.tgz#5bfe81eb23c905f04b669a7d2b060a147a263483" - integrity sha512-qhH4gr9gAlVk8MBtzXbzTP3BJyqbAfUOATGkyUtohh85fPXQYuzVlbExix3FZXTwFHNidGHY8C+ocscI7uDaYw== - -"@swc/core-linux-x64-gnu@1.4.17": - version "1.4.17" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.17.tgz#a0c19bc9635e86ebd1c7f8e9e026503d1a1bf83d" - integrity sha512-vRDFATL1oN5oZMImkwbgSHEkp8xG1ofEASBypze01W1Tqto8t+yo6gsp69wzCZBlxldsvPpvFZW55Jq0Rn+UnA== - -"@swc/core-linux-x64-musl@1.4.17": - version "1.4.17" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.17.tgz#2179b9536235a3b02a46997ddb1c178dfadf1667" - integrity sha512-zQNPXAXn3nmPqv54JVEN8k2JMEcMTQ6veVuU0p5O+A7KscJq+AGle/7ZQXzpXSfUCXlLMX4wvd+rwfGhh3J4cw== - -"@swc/core-win32-arm64-msvc@1.4.17": - version "1.4.17" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.17.tgz#3004a431c836c6b16b4660ea2425dde467a8ee36" - integrity sha512-z86n7EhOwyzxwm+DLE5NoLkxCTme2lq7QZlDjbQyfCxOt6isWz8rkW5QowTX8w9Rdmk34ncrjSLvnHOeLY17+w== - -"@swc/core-win32-ia32-msvc@1.4.17": - version "1.4.17" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.17.tgz#59155485d5307fb2a267e5acb215e0f440b6f48f" - integrity sha512-JBwuSTJIgiJJX6wtr4wmXbfvOswHFj223AumUrK544QV69k60FJ9q2adPW9Csk+a8wm1hLxq4HKa2K334UHJ/g== - -"@swc/core-win32-x64-msvc@1.4.17": - version "1.4.17" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.17.tgz#b98f25fc277fb0e319f25f9fd00a82023662716b" - integrity sha512-jFkOnGQamtVDBm3MF5Kq1lgW8vx4Rm1UvJWRUfg+0gx7Uc3Jp3QMFeMNw/rDNQYRDYPG3yunCC+2463ycd5+dg== +"@swc/core-darwin-arm64@1.5.28": + version "1.5.28" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.28.tgz#b0b5a163c6bb34468f1a2307c040811e73a1b253" + integrity sha512-sP6g63ybzIdOWNDbn51tyHN8EMt7Mb4RMeHQEsXB7wQfDvzhpWB+AbfK6Gs3Q8fwP/pmWIrWW9csKOc1K2Mmkg== + +"@swc/core-darwin-x64@1.5.28": + version "1.5.28" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.5.28.tgz#66829b4c1ab7a0dcb708c5af381b2c5b20c41291" + integrity sha512-Bd/agp/g7QocQG5AuorOzSC78t8OzeN+pCN/QvJj1CvPhvppjJw6e1vAbOR8vO2vvGi2pvtf3polrYQStJtSiA== + +"@swc/core-linux-arm-gnueabihf@1.5.28": + version "1.5.28" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.28.tgz#9f85d568d81928301d633ae2ff19c916d07a2d15" + integrity sha512-Wr3TwPGIveS9/OBWm0r9VAL8wkCR0zQn46J8K01uYCmVhUNK3Muxjs0vQBZaOrGu94mqbj9OXY+gB3W7aDvGdA== + +"@swc/core-linux-arm64-gnu@1.5.28": + version "1.5.28" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.28.tgz#5489cc4f7a1846e783bc85ba017306b235f97764" + integrity sha512-8G1ZwVTuLgTAVTMPD+M97eU6WeiRIlGHwKZ5fiJHPBcz1xqIC7jQcEh7XBkobkYoU5OILotls3gzjRt8CMNyDQ== + +"@swc/core-linux-arm64-musl@1.5.28": + version "1.5.28" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.28.tgz#30894beef4b86fee461d986be2633fa978c03083" + integrity sha512-0Ajdzb5Fzvz+XUbN5ESeHAz9aHHSYiQcm+vmsDi0TtPHmsalfnqEPZmnK0zPALPJPLQP2dDo4hELeDg3/c3xgA== + +"@swc/core-linux-x64-gnu@1.5.28": + version "1.5.28" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.28.tgz#e57aff87b9e28c9f239cdfa071dfb2f1123eefa7" + integrity sha512-ueQ9VejnQUM2Pt+vT0IAKoF4vYBWUP6n1KHGdILpoGe3LuafQrqu7RoyQ15C7/AYii7hAeNhTFdf6gLbg8cjFg== + +"@swc/core-linux-x64-musl@1.5.28": + version "1.5.28" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.28.tgz#d766c396063568a18db250c7783cef7141f86d44" + integrity sha512-G5th8Mg0az8CbY4GQt9/m5hg2Y0kGIwvQBeVACuLQB6q2Y4txzdiTpjmFqUUhEvvl7Klyx1IHvNhfXs3zpt7PA== + +"@swc/core-win32-arm64-msvc@1.5.28": + version "1.5.28" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.28.tgz#aebb03f89e00d0381d7586d34374d909525975f1" + integrity sha512-JezwCGavZ7CkNXx4yInI4kpb71L0zxzxA9BFlmnsGKEEjVQcKc3hFpmIzfFVs+eotlBUwDNb0+Yo9m6Cb7lllA== + +"@swc/core-win32-ia32-msvc@1.5.28": + version "1.5.28" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.28.tgz#37d2698c51001d129fa7380728673911c90b58bc" + integrity sha512-q8tW5J4RkOkl7vYShnWS//VAb2Ngolfm9WOMaF2GRJUr2Y/Xeb/+cNjdsNOqea2BzW049D5vdP7XPmir3/zUZw== + +"@swc/core-win32-x64-msvc@1.5.28": + version "1.5.28" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.28.tgz#57c9f955215e0103fe8a60994bdf256a3b6dc31d" + integrity sha512-jap6EiB3wG1YE1hyhNr9KLPpH4PGm+5tVMfN0l7fgKtV0ikgpcEN/YF94tru+z5m2HovqYW009+Evq9dcVGmpg== "@swc/core@^1.4.17": - version "1.4.17" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.4.17.tgz#3ea4180fa5c54282b284006a6de1263ef1cf887f" - integrity sha512-tq+mdWvodMBNBBZbwFIMTVGYHe9N7zvEaycVVjfvAx20k1XozHbHhRv+9pEVFJjwRxLdXmtvFZd3QZHRAOpoNQ== + version "1.5.28" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.5.28.tgz#cba572d6a205cc3efa20b38935cad631d6ba2deb" + integrity sha512-muCdNIqOTURUgYeyyOLYE3ShL8SZO6dw6bhRm6dCvxWzCZOncPc5fB0kjcPXTML+9KJoHL7ks5xg+vsQK+v6ig== dependencies: - "@swc/counter" "^0.1.2" - "@swc/types" "^0.1.5" + "@swc/counter" "^0.1.3" + "@swc/types" "^0.1.8" optionalDependencies: - "@swc/core-darwin-arm64" "1.4.17" - "@swc/core-darwin-x64" "1.4.17" - "@swc/core-linux-arm-gnueabihf" "1.4.17" - "@swc/core-linux-arm64-gnu" "1.4.17" - "@swc/core-linux-arm64-musl" "1.4.17" - "@swc/core-linux-x64-gnu" "1.4.17" - "@swc/core-linux-x64-musl" "1.4.17" - "@swc/core-win32-arm64-msvc" "1.4.17" - "@swc/core-win32-ia32-msvc" "1.4.17" - "@swc/core-win32-x64-msvc" "1.4.17" - -"@swc/counter@^0.1.2", "@swc/counter@^0.1.3": + "@swc/core-darwin-arm64" "1.5.28" + "@swc/core-darwin-x64" "1.5.28" + "@swc/core-linux-arm-gnueabihf" "1.5.28" + "@swc/core-linux-arm64-gnu" "1.5.28" + "@swc/core-linux-arm64-musl" "1.5.28" + "@swc/core-linux-x64-gnu" "1.5.28" + "@swc/core-linux-x64-musl" "1.5.28" + "@swc/core-win32-arm64-msvc" "1.5.28" + "@swc/core-win32-ia32-msvc" "1.5.28" + "@swc/core-win32-x64-msvc" "1.5.28" + +"@swc/counter@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== @@ -959,10 +984,10 @@ "@swc/counter" "^0.1.3" jsonc-parser "^3.2.0" -"@swc/types@^0.1.5": - version "0.1.6" - resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.6.tgz#2f13f748995b247d146de2784d3eb7195410faba" - integrity sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg== +"@swc/types@^0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.8.tgz#2c81d107c86cfbd0c3a05ecf7bb54c50dfa58a95" + integrity sha512-RNFA3+7OJFNYY78x0FYwi1Ow+iF1eF5WvmfY1nXPOEH4R2p/D4Cr1vzje7dNAI2aLFqpv8Wyz4oKSWqIZArpQA== dependencies: "@swc/counter" "^0.1.3" @@ -998,12 +1023,24 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" - integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== dependencies: "@babel/types" "^7.20.7" +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/debug@^4.1.7": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + "@types/graceful-fs@^4.1.3": version "4.1.9" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" @@ -1038,6 +1075,11 @@ expect "^29.0.0" pretty-format "^29.0.0" +"@types/js-levenshtein@^1.1.1": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@types/js-levenshtein/-/js-levenshtein-1.1.3.tgz#a6fd0bdc8255b274e5438e0bfb25f154492d1106" + integrity sha512-jd+Q+sD20Qfu9e2aEXogiO3vpOC1PYJOUdyN9gvs4Qrvkg4wF43L5OhqrPeokdv8TL0/mXoYfpkcoGZMNN2pkQ== + "@types/jsdom@^20.0.0": version "20.0.1" resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" @@ -1057,10 +1099,20 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/node@*": - version "20.12.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384" - integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== +"@types/lodash@^4.17.4": + version "4.17.5" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.5.tgz#e6c29b58e66995d57cd170ce3e2a61926d55ee04" + integrity sha512-MBIOHVZqVqgfro1euRDWX7OO0fBVUUMrN6Pwm8LQsz8cWhEpihlvR70ENj3f40j58TNxZaWv2ndSkInykNBBJw== + +"@types/ms@*": + version "0.7.34" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== + +"@types/node@*", "@types/node@>=13.7.0": + version "20.14.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.2.tgz#a5f4d2bcb4b6a87bffcaa717718c5a0f208f4a18" + integrity sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q== dependencies: undici-types "~5.26.4" @@ -1071,13 +1123,6 @@ dependencies: undici-types "~5.26.4" -"@types/node@>=13.7.0": - version "20.12.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.11.tgz#c4ef00d3507000d17690643278a60dc55a9dc9be" - integrity sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw== - dependencies: - undici-types "~5.26.4" - "@types/qs@6.9.10": version "6.9.10" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.10.tgz#0af26845b5067e1c9a622658a51f60a3934d51e8" @@ -1088,6 +1133,13 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== +"@types/set-cookie-parser@^2.4.0": + version "2.4.7" + resolved "https://registry.yarnpkg.com/@types/set-cookie-parser/-/set-cookie-parser-2.4.7.tgz#4a341ed1d3a922573ee54db70b6f0a6d818290e7" + integrity sha512-+ge/loa0oTozxip6zmhRIk8Z/boU51wl9Q6QdLZcokIGMzY5lFXYy/x7Htj2HTC6/KZP1hUbZ1ekx8DYXICvWg== + dependencies: + "@types/node" "*" + "@types/stack-utils@^2.0.0": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" @@ -1098,11 +1150,6 @@ resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== -"@types/trusted-types@^2.0.2": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" - integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== - "@types/yargs-parser@*": version "21.0.3" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" @@ -1201,6 +1248,16 @@ "@typescript-eslint/types" "7.8.0" eslint-visitor-keys "^3.4.3" +"@xmldom/xmldom@^0.8.3": + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== + +"@zxing/text-encoding@0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" + integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== + abab@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" @@ -1253,6 +1310,11 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.21.3" +ansi-regex@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -1390,10 +1452,18 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" -axios@>=1.6.5: - version "1.6.8" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" - integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== +axios-mock-adapter@^1.22.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/axios-mock-adapter/-/axios-mock-adapter-1.22.0.tgz#0f3e6be0fc9b55baab06f2d49c0b71157e7c053d" + integrity sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw== + dependencies: + fast-deep-equal "^3.1.3" + is-buffer "^2.0.5" + +axios@>=1.6.5, axios@^1.6.8: + version "1.7.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.2.tgz#b625db8a7051fbea61c35a3cbb3a1daa7b9c7621" + integrity sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw== dependencies: follow-redirects "^1.15.6" form-data "^4.0.0" @@ -1479,7 +1549,7 @@ bech32@^2.0.0: resolved "https://registry.yarnpkg.com/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355" integrity sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg== -bignumber.js@^9.0.0: +bignumber.js@9.x, bignumber.js@^9.0.0: version "9.1.2" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== @@ -1489,6 +1559,15 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + blake2b-wasm@^1.1.0: version "1.1.7" resolved "https://registry.yarnpkg.com/blake2b-wasm/-/blake2b-wasm-1.1.7.tgz#e4d075da10068e5d4c3ec1fb9accc4d186c55d81" @@ -1519,22 +1598,22 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" browserslist@^4.22.2: - version "4.23.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" - integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== + version "4.23.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.1.tgz#ce4af0534b3d37db5c1a4ca98b9080f985041e96" + integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== dependencies: - caniuse-lite "^1.0.30001587" - electron-to-chromium "^1.4.668" + caniuse-lite "^1.0.30001629" + electron-to-chromium "^1.4.796" node-releases "^2.0.14" - update-browserslist-db "^1.0.13" + update-browserslist-db "^1.0.16" bs-logger@0.x: version "0.2.6" @@ -1563,6 +1642,14 @@ buffer@6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" @@ -1589,10 +1676,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001587: - version "1.0.30001614" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001614.tgz#f894b4209376a0bf923d67d9c361d96b1dfebe39" - integrity sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog== +caniuse-lite@^1.0.30001629: + version "1.0.30001632" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001632.tgz#964207b7cba5851701afb4c8afaf1448db3884b6" + integrity sha512-udx3o7yHJfUxMLkGohMlVHCvFvWmirKh9JAH/d7WOLPetlH+LTL5cocMZ0t7oZx/mdlOWXti97xLZWc8uURRHg== chalk@^2.4.2: version "2.4.2" @@ -1603,7 +1690,7 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -1616,7 +1703,12 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -chokidar@^3.5.3: +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chokidar@^3.4.2, chokidar@^3.5.3: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -1641,6 +1733,23 @@ cjs-module-lexer@^1.0.0: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -1650,6 +1759,11 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -1706,6 +1820,11 @@ convert-source-map@^2.0.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== +cookie@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + create-jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" @@ -1781,10 +1900,10 @@ data-view-byte-offset@^1.0.0: es-errors "^1.3.0" is-data-view "^1.0.1" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: + version "4.3.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== dependencies: ms "2.1.2" @@ -1815,6 +1934,13 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" @@ -1869,15 +1995,10 @@ domexception@^4.0.0: dependencies: webidl-conversions "^7.0.0" -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -electron-to-chromium@^1.4.668: - version "1.4.752" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.752.tgz#99227455547c8254488e3dab7d316c34a2c067b8" - integrity sha512-P3QJreYI/AUTcfBVrC4zy9KvnZWekViThgQMX/VpJ+IsOBbcX5JFpORM4qWapwWQ+agb2nYAOyn/4PMXOk0m2Q== +electron-to-chromium@^1.4.796: + version "1.4.798" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.798.tgz#6a3fcab2edc1e66e3883466f6b4b8944323c0164" + integrity sha512-by9J2CiM9KPGj9qfp5U4FcPSbXJG7FNzqnYaY4WLzX+v2PHieVGmnsA4dxfpGE3QEC7JofpPZmn7Vn1B9NR2+Q== emittery@^0.13.1: version "0.13.1" @@ -1889,15 +2010,10 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - enhanced-resolve@^5.12.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" - integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== + version "5.17.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz#d037603789dd9555b89aaec7eb78845c49089bc5" + integrity sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -2011,35 +2127,35 @@ es-to-primitive@^1.2.1: is-symbol "^1.0.2" esbuild@^0.21.1: - version "0.21.1" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.1.tgz#3d6f199f6ec849158278c6632f438463bab88c38" - integrity sha512-GPqx+FX7mdqulCeQ4TsGZQ3djBJkx5k7zBGtqt9ycVlWNg8llJ4RO9n2vciu8BN2zAEs6lPbPl0asZsAh7oWzg== + version "0.21.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== optionalDependencies: - "@esbuild/aix-ppc64" "0.21.1" - "@esbuild/android-arm" "0.21.1" - "@esbuild/android-arm64" "0.21.1" - "@esbuild/android-x64" "0.21.1" - "@esbuild/darwin-arm64" "0.21.1" - "@esbuild/darwin-x64" "0.21.1" - "@esbuild/freebsd-arm64" "0.21.1" - "@esbuild/freebsd-x64" "0.21.1" - "@esbuild/linux-arm" "0.21.1" - "@esbuild/linux-arm64" "0.21.1" - "@esbuild/linux-ia32" "0.21.1" - "@esbuild/linux-loong64" "0.21.1" - "@esbuild/linux-mips64el" "0.21.1" - "@esbuild/linux-ppc64" "0.21.1" - "@esbuild/linux-riscv64" "0.21.1" - "@esbuild/linux-s390x" "0.21.1" - "@esbuild/linux-x64" "0.21.1" - "@esbuild/netbsd-x64" "0.21.1" - "@esbuild/openbsd-x64" "0.21.1" - "@esbuild/sunos-x64" "0.21.1" - "@esbuild/win32-arm64" "0.21.1" - "@esbuild/win32-ia32" "0.21.1" - "@esbuild/win32-x64" "0.21.1" - -escalade@^3.1.1: + "@esbuild/aix-ppc64" "0.21.5" + "@esbuild/android-arm" "0.21.5" + "@esbuild/android-arm64" "0.21.5" + "@esbuild/android-x64" "0.21.5" + "@esbuild/darwin-arm64" "0.21.5" + "@esbuild/darwin-x64" "0.21.5" + "@esbuild/freebsd-arm64" "0.21.5" + "@esbuild/freebsd-x64" "0.21.5" + "@esbuild/linux-arm" "0.21.5" + "@esbuild/linux-arm64" "0.21.5" + "@esbuild/linux-ia32" "0.21.5" + "@esbuild/linux-loong64" "0.21.5" + "@esbuild/linux-mips64el" "0.21.5" + "@esbuild/linux-ppc64" "0.21.5" + "@esbuild/linux-riscv64" "0.21.5" + "@esbuild/linux-s390x" "0.21.5" + "@esbuild/linux-x64" "0.21.5" + "@esbuild/netbsd-x64" "0.21.5" + "@esbuild/openbsd-x64" "0.21.5" + "@esbuild/sunos-x64" "0.21.5" + "@esbuild/win32-arm64" "0.21.5" + "@esbuild/win32-ia32" "0.21.5" + "@esbuild/win32-x64" "0.21.5" + +escalade@^3.1.1, escalade@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== @@ -2273,6 +2389,11 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -2304,6 +2425,15 @@ expect@^29.0.0, expect@^29.7.0: jest-message-util "^29.7.0" jest-util "^29.7.0" +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -2349,6 +2479,13 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" @@ -2356,10 +2493,10 @@ file-entry-cache@^8.0.0: dependencies: flat-cache "^4.0.0" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -2492,9 +2629,9 @@ get-symbol-description@^1.0.2: get-intrinsic "^1.2.4" get-tsconfig@^4.5.0: - version "4.7.3" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.3.tgz#0498163d98f7b58484dd4906999c0c9d5f103f83" - integrity sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg== + version "4.7.5" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.5.tgz#5e012498579e9a6947511ed0cd403272c7acbbaf" + integrity sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw== dependencies: resolve-pkg-maps "^1.0.0" @@ -2512,16 +2649,16 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@^10.3.7: - version "10.3.14" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.14.tgz#36501f871d373fe197fc5794588d0aa71e69ff68" - integrity sha512-4fkAqu93xe9Mk7le9v0y3VrPDqLKHarNi2s4Pv7f2yOvfhWfhc7hRPHC/JyqMqb8B/Dt/eGS4n7ykwf3fOsl8g== +glob@^10.3.14, glob@^10.3.7: + version "10.4.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.1.tgz#0cfb01ab6a6b438177bfe6a58e2576f6efe909c2" + integrity sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw== dependencies: foreground-child "^3.1.0" - jackspeak "^2.3.6" - minimatch "^9.0.1" - minipass "^7.0.4" - path-scurry "^1.11.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + path-scurry "^1.11.1" glob@^7.1.3, glob@^7.1.4: version "7.2.3" @@ -2582,6 +2719,11 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +"graphql@^15.0.0 || ^16.0.0": + version "16.8.1" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.1.tgz#1930a965bef1170603702acdb68aedd3f3cf6f07" + integrity sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw== + has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" @@ -2628,6 +2770,11 @@ hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: dependencies: function-bind "^1.1.2" +headers-polyfill@3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-3.2.5.tgz#6e67d392c9d113d37448fe45014e0afdd168faed" + integrity sha512-tUCGvt191vNSQgttSyJoibR+VO+I6+iCHIUdhzEMJKE+EAL8BwCN7fUOZlY4ofOelNHsK+gEjxB/B+9N3EWtdA== + html-encoding-sniffer@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" @@ -2669,7 +2816,14 @@ iconv-lite@0.6.3: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -ieee754@^1.2.1: +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -2713,11 +2867,32 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3: +inherits@2, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +inquirer@^8.2.0: + version "8.2.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" + integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^6.0.1" + internal-slot@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" @@ -2727,6 +2902,14 @@ internal-slot@^1.0.7: hasown "^2.0.0" side-channel "^1.0.4" +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-array-buffer@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" @@ -2762,6 +2945,11 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-buffer@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -2803,6 +2991,13 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -2810,11 +3005,21 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + is-negative-zero@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== +is-node-process@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-node-process/-/is-node-process-1.2.0.tgz#ea02a1b90ddb3934a19aea414e88edef7e11d134" + integrity sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw== + is-number-object@^1.0.4: version "1.0.7" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" @@ -2871,13 +3076,18 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.13: +is-typed-array@^1.1.13, is-typed-array@^1.1.3: version "1.1.13" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== dependencies: which-typed-array "^1.1.14" +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -2895,6 +3105,14 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isomorphic-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4" + integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA== + dependencies: + node-fetch "^2.6.1" + whatwg-fetch "^3.4.1" + istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" @@ -2948,10 +3166,10 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jackspeak@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" - integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== +jackspeak@^3.1.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.0.tgz#a75763ff36ad778ede6a156d8ee8b124de445b4a" + integrity sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: @@ -3329,6 +3547,11 @@ jest@29.7.0: import-local "^3.0.2" jest-cli "^29.7.0" +js-levenshtein@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -3469,31 +3692,6 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -lit-element@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/lit-element/-/lit-element-4.0.5.tgz#f20cd8a6231eaf5358f7a6877ca6ea7628fa2015" - integrity sha512-iTWskWZEtn9SyEf4aBG6rKT8GABZMrTWop1+jopsEOgEcugcXJGKuX5bEbkq9qfzY+XB4MAgCaSPwnNpdsNQ3Q== - dependencies: - "@lit-labs/ssr-dom-shim" "^1.2.0" - "@lit/reactive-element" "^2.0.4" - lit-html "^3.1.2" - -lit-html@^3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-3.1.3.tgz#ae2e9fee0258d0a1b5d7b86c87da51117e4f911b" - integrity sha512-FwIbqDD8O/8lM4vUZ4KvQZjPPNx7V1VhT7vmRB8RBAO0AU6wuTVdoXiu2CivVjEGdugvcbPNBLtPE1y0ifplHA== - dependencies: - "@types/trusted-types" "^2.0.2" - -lit@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/lit/-/lit-3.1.3.tgz#809ecdaccfea47e1e3b46649fae6c6e7b9802675" - integrity sha512-l4slfspEsnCcHVRTvaP7YnkTZEZggNFywLEIhQaGhYDczG+tu/vlgm/KaWIEjIp+ZyV20r2JnZctMb8LeLCG7Q== - dependencies: - "@lit/reactive-element" "^2.0.4" - lit-element "^4.0.4" - lit-html "^3.1.2" - locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -3518,6 +3716,19 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + long@^5.0.0: version "5.2.3" resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" @@ -3542,13 +3753,6 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - make-dir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" @@ -3579,11 +3783,11 @@ merge2@^1.3.0, merge2@^1.4.1: integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + version "4.0.7" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" + integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" mime-db@1.52.0: @@ -3610,7 +3814,7 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimatch@^9.0.1, minimatch@^9.0.4: +minimatch@^9.0.4: version "9.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== @@ -3622,10 +3826,10 @@ minimist@^1.2.0, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: - version "7.1.1" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.1.tgz#f7f85aff59aa22f110b20e27692465cf3bf89481" - integrity sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== ms@2.1.2: version "2.1.2" @@ -3637,6 +3841,36 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +msw@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/msw/-/msw-1.3.1.tgz#84a12bb17e76c25a7accaf921317044907ccd501" + integrity sha512-GhP5lHSTXNlZb9EaKgPRJ01YAnVXwzkvnTzRn4W8fxU2DXuJrRO+Nb6OHdYqB4fCkwSNpIJH9JkON5Y6rHqJMQ== + dependencies: + "@mswjs/cookies" "^0.2.2" + "@mswjs/interceptors" "^0.17.10" + "@open-draft/until" "^1.0.3" + "@types/cookie" "^0.4.1" + "@types/js-levenshtein" "^1.1.1" + chalk "^4.1.1" + chokidar "^3.4.2" + cookie "^0.4.2" + graphql "^15.0.0 || ^16.0.0" + headers-polyfill "3.2.5" + inquirer "^8.2.0" + is-node-process "^1.2.0" + js-levenshtein "^1.1.6" + node-fetch "^2.6.7" + outvariant "^1.4.0" + path-to-regexp "^6.2.0" + strict-event-emitter "^0.4.3" + type-fest "^2.19.0" + yargs "^17.3.1" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + mylas@^2.1.9: version "2.1.13" resolved "https://registry.yarnpkg.com/mylas/-/mylas-2.1.13.tgz#1e23b37d58fdcc76e15d8a5ed23f9ae9fc0cbdf4" @@ -3657,10 +3891,17 @@ node-addon-api@^2.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== +node-fetch@^2.6.1, node-fetch@^2.6.7: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + node-gyp-build@^4.2.0: - version "4.8.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.0.tgz#3fee9c1731df4581a3f9ead74664369ff00d26dd" - integrity sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og== + version "4.8.1" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz#976d3ad905e71b76086f4f0b0d3637fe79b6cda5" + integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== node-int64@^0.4.0: version "0.4.0" @@ -3685,9 +3926,9 @@ npm-run-path@^4.0.1: path-key "^3.0.0" nwsapi@^2.2.2: - version "2.2.9" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.9.tgz#7f3303218372db2e9f27c27766bcfc59ae7e61c6" - integrity sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg== + version "2.2.10" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.10.tgz#0b77a68e21a0b483db70b11fad055906e867cda8" + integrity sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ== object-inspect@^1.13.1: version "1.13.1" @@ -3744,7 +3985,7 @@ once@^1.3.0: dependencies: wrappy "1" -onetime@^5.1.2: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -3763,6 +4004,31 @@ optionator@^0.9.3: type-check "^0.4.0" word-wrap "^1.2.5" +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +outvariant@^1.2.1, outvariant@^1.4.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.4.2.tgz#f54f19240eeb7f15b28263d5147405752d8e2066" + integrity sha512-Ou3dJ6bA/UJ5GVHxah4LnqDwZRwAmWxrG3wtrHrbGnP4RnLCtA64A4F+ae7Y8ww660JaddSoArUR5HjipWSHAQ== + p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -3840,23 +4106,28 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.11.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.0.tgz#332d64e9726bf667fb348e5a1c71005c09ad741a" - integrity sha512-LNHTaVkzaYaLGlO+0u3rQTz7QrHTFOuKyba9JMTQutkmtNew8dw8wOD7mTU/5fCPZzCWpfW0XnQKzY61P0aTaw== +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +path-to-regexp@^6.2.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.2.tgz#324377a83e5049cbecadc5554d6a63a9a4866b36" + integrity sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw== + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.0, picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -3993,7 +4264,7 @@ react@^18.3.1: dependencies: loose-envify "^1.1.0" -readable-stream@^3.6.0: +readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -4070,18 +4341,31 @@ resolve@^1.10.1, resolve@^1.20.0, resolve@^1.22.4: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rimraf@^5.0.6: - version "5.0.6" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.6.tgz#f13b90af1794a2e8e1ecd052263bcf688742af88" - integrity sha512-X72SgyOf+1lFnGM6gYcmZ4+jMOwuT4E4SajKQzUIlI7EoR5eFHMhS/wf8Ll0mN+w2bxcIVldrJQ6xT7HFQywjg== + version "5.0.7" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.7.tgz#27bddf202e7d89cb2e0381656380d1734a854a74" + integrity sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg== dependencies: glob "^10.3.7" +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -4089,6 +4373,13 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +rxjs@^7.5.5: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + safe-array-concat@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" @@ -4113,7 +4404,7 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" -"safer-buffer@>= 2.1.2 < 3.0.0": +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -4131,11 +4422,14 @@ semver@^6.1.0, semver@^6.3.0, semver@^6.3.1: integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" + version "7.6.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + +set-cookie-parser@^2.4.6: + version "2.6.0" + resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz#131921e50f62ff1a66a461d7d62d7b21d5d15a51" + integrity sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ== set-function-length@^1.2.1: version "1.2.2" @@ -4181,7 +4475,7 @@ side-channel@^1.0.4: get-intrinsic "^1.2.4" object-inspect "^1.13.1" -signal-exit@^3.0.3, signal-exit@^3.0.7: +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -4226,6 +4520,18 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" +strict-event-emitter@^0.2.4: + version "0.2.8" + resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.2.8.tgz#b4e768927c67273c14c13d20e19d5e6c934b47ca" + integrity sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A== + dependencies: + events "^3.3.0" + +strict-event-emitter@^0.4.3: + version "0.4.6" + resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.4.6.tgz#ff347c8162b3e931e3ff5f02cfce6772c3b07eb3" + integrity sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg== + string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -4234,7 +4540,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -4243,14 +4549,14 @@ string-length@^4.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== +string-width@4.1.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3, string-width@^5.0.1, string-width@^5.1.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.1.0.tgz#ba846d1daa97c3c596155308063e075ed1c99aff" + integrity sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ== dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^5.2.0" string.prototype.trim@^1.2.9: version "1.2.9" @@ -4287,7 +4593,21 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -4379,6 +4699,18 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -4413,6 +4745,11 @@ tr46@^3.0.0: dependencies: punycode "^2.1.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + ts-api-utils@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" @@ -4433,9 +4770,9 @@ ts-jest@29.1.2: yargs-parser "^21.0.1" tsc-alias@^1.8.9: - version "1.8.9" - resolved "https://registry.yarnpkg.com/tsc-alias/-/tsc-alias-1.8.9.tgz#9688b8fe1ba7267d2982140d45f72a3d32825450" - integrity sha512-Bkxu+LlUp/VG2qkcXGmj9wBkJuJID0mEC9t+bZaEbl9kyk/QJX6uo8/+z8DxTqUoqKPcbSApO2Ep42bsIVm9DA== + version "1.8.10" + resolved "https://registry.yarnpkg.com/tsc-alias/-/tsc-alias-1.8.10.tgz#279f9bf0dd8bc10fb27820393d4881db5a303938" + integrity sha512-Ibv4KAWfFkFdKJxnWfVtdOmB0Zi1RJVxcbPGiCDsFpCQSsmpWyuzHG3rQyI5YkobWwxFPEyQfu1hdo4qLG2zPw== dependencies: chokidar "^3.5.3" commander "^9.0.0" @@ -4454,10 +4791,10 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@^2.1.0, tslib@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" @@ -4476,6 +4813,11 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +type-fest@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + typed-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" @@ -4545,13 +4887,13 @@ universalify@^0.2.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== +update-browserslist-db@^1.0.16: + version "1.0.16" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" + integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" + escalade "^3.1.2" + picocolors "^1.0.1" uri-js@^4.2.2: version "4.4.1" @@ -4578,6 +4920,17 @@ util-deprecate@^1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +util@^0.12.3: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + v8-to-istanbul@^9.0.1: version "9.2.0" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" @@ -4601,6 +4954,27 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +web-encoding@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864" + integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== + dependencies: + util "^0.12.3" + optionalDependencies: + "@zxing/text-encoding" "0.9.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + webidl-conversions@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" @@ -4613,6 +4987,11 @@ whatwg-encoding@^2.0.0: dependencies: iconv-lite "0.6.3" +whatwg-fetch@^3.4.1: + version "3.6.20" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" + integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== + whatwg-mimetype@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" @@ -4626,6 +5005,14 @@ whatwg-url@^11.0.0: tr46 "^3.0.0" webidl-conversions "^7.0.0" +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -4637,7 +5024,7 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-typed-array@^1.1.14, which-typed-array@^1.1.15: +which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.2: version "1.1.15" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== @@ -4660,7 +5047,25 @@ word-wrap@^1.2.5: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -4716,11 +5121,6 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"