From 90ee27f22300c20f262993c40d744a3b91460349 Mon Sep 17 00:00:00 2001 From: EresDev Date: Wed, 24 Apr 2024 00:34:47 +0500 Subject: [PATCH 001/174] feat: claim permit in gift cards --- .github/workflows/build.yml | 5 +- .gitignore | 3 +- functions/get-order.ts | 57 + functions/get-redeem-code.ts | 91 + functions/list-gift-cards.ts | 51 + functions/post-order.ts | 192 + functions/tsconfig.json | 9 + functions/validators.ts | 22 + package.json | 4 +- shared/helpers.ts | 102 + shared/types.ts | 155 + static/index.html | 24 +- static/scripts/rewards/constants.ts | 1 + .../gift-cards/activate/activate-action.ts | 19 + .../gift-cards/activate/activate-html.ts | 30 + .../rewards/gift-cards/claim/claim-action.ts | 80 + .../scripts/rewards/gift-cards/gift-card.ts | 81 + static/scripts/rewards/gift-cards/helpers.ts | 15 + .../rewards/gift-cards/list-gift-cards.ts | 80 + .../gift-cards/reveal/redeem-code-html.ts | 34 + .../gift-cards/reveal/reveal-action.ts | 59 + static/scripts/rewards/init.ts | 3 + static/scripts/rewards/web3/erc20-permit.ts | 13 +- static/styles/rewards/claim-table.css | 3 + static/styles/rewards/gift-cards.css | 162 + static/styles/rewards/pay.css | 2 + tsconfig.json | 2 +- wrangler.toml | 9 + yarn.lock | 5718 +++++++++++++++++ 29 files changed, 7005 insertions(+), 21 deletions(-) create mode 100644 functions/get-order.ts create mode 100644 functions/get-redeem-code.ts create mode 100644 functions/list-gift-cards.ts create mode 100644 functions/post-order.ts create mode 100644 functions/tsconfig.json create mode 100644 functions/validators.ts create mode 100644 shared/helpers.ts create mode 100644 shared/types.ts create mode 100644 static/scripts/rewards/gift-cards/activate/activate-action.ts create mode 100644 static/scripts/rewards/gift-cards/activate/activate-html.ts create mode 100644 static/scripts/rewards/gift-cards/claim/claim-action.ts create mode 100644 static/scripts/rewards/gift-cards/gift-card.ts create mode 100644 static/scripts/rewards/gift-cards/helpers.ts create mode 100644 static/scripts/rewards/gift-cards/list-gift-cards.ts create mode 100644 static/scripts/rewards/gift-cards/reveal/redeem-code-html.ts create mode 100644 static/scripts/rewards/gift-cards/reveal/reveal-action.ts create mode 100644 static/styles/rewards/gift-cards.css create mode 100644 wrangler.toml create mode 100644 yarn.lock diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 00d8dfb4..525d591e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -35,4 +35,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: static - path: static + path: | + static + functions + shared diff --git a/.gitignore b/.gitignore index 704a6abe..7f1b1d6f 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,5 @@ commit.txt static/dist cypress/screenshots -cypress/videos \ No newline at end of file +cypress/videos +.wrangler \ No newline at end of file diff --git a/functions/get-order.ts b/functions/get-order.ts new file mode 100644 index 00000000..90b487f1 --- /dev/null +++ b/functions/get-order.ts @@ -0,0 +1,57 @@ +import { Env, getAccessToken, getBaseUrl } from "../shared/helpers"; +import { AccessToken, NotOkReloadlyApiResponse, ReloadlyGetTransactionResponse } from "../shared/types"; +import { validateEnvVars, validateRequestMethod } from "./validators"; + +export const onRequest: PagesFunction = async (ctx) => { + try { + validateRequestMethod(ctx.request.method, "GET"); + validateEnvVars(ctx); + + const { searchParams } = new URL(ctx.request.url); + const orderId = searchParams.get("orderId"); + + if (!orderId) { + throw new Error(`Invalid query parameters: ${{ orderId }}`); + } + + const accessToken = await getAccessToken(ctx.env); + + const reloadlyTransaction = await getTransactionFromOrderId(orderId, accessToken); + + if (reloadlyTransaction.status == "SUCCESSFUL") { + return Response.json(reloadlyTransaction, { status: 200 }); + } else { + return Response.json({ message: "There is no successful transaction for given order ID." }, { status: 404 }); + } + } catch (error) { + console.error("There was an error while processing your request.", error); + return Response.json({ message: "There was an error while processing your request." }, { status: 500 }); + } +}; + +export const getTransactionFromOrderId = async (orderId: string, accessToken: AccessToken) => { + const url = `${getBaseUrl(accessToken.isSandbox)}/reports/transactions?size=1&page=1&customIdentifier=${orderId}`; + console.log(`Retrieving transaction from ${url}`); + const options = { + method: "GET", + headers: { + Accept: "application/com.reloadly.giftcards-v1+json", + Authorization: `Bearer ${accessToken.token}`, + }, + }; + + const response = await fetch(url, options); + const responseJson = await response.json(); + + if (response.status != 200) { + throw new Error( + `Error from Reloadly API: ${JSON.stringify({ + status: response.status, + message: (responseJson as NotOkReloadlyApiResponse).message, + })}` + ); + } + console.log("Response status", response.status); + console.log(`Response from ${url}`, responseJson); + return (responseJson as ReloadlyGetTransactionResponse).content[0]; +}; diff --git a/functions/get-redeem-code.ts b/functions/get-redeem-code.ts new file mode 100644 index 00000000..82365d11 --- /dev/null +++ b/functions/get-redeem-code.ts @@ -0,0 +1,91 @@ +import { Env, getAccessToken, getBaseUrl, getGiftCardOrderId, getMessageToSign } from "../shared/helpers"; +import { AccessToken, NotOkReloadlyApiResponse, ReloadlyRedeemCodeResponse } from "../shared/types"; +import { verifyMessage } from "ethers/lib/utils"; +import { getTransactionFromOrderId } from "./get-order"; +import { validateEnvVars, validateRequestMethod } from "./validators"; + +export const onRequest: PagesFunction = async (ctx) => { + try { + validateRequestMethod(ctx.request.method, "GET"); + validateEnvVars(ctx); + + const accessToken = await getAccessToken(ctx.env); + + const { searchParams } = new URL(ctx.request.url); + const transactionId = Number(searchParams.get("transactionId")); + const signedMessage = searchParams.get("signedMessage"); + const wallet = searchParams.get("wallet"); + const permitSig = searchParams.get("permitSig"); + + if (isNaN(transactionId) || !(transactionId && signedMessage && wallet && permitSig)) { + throw new Error( + `Invalid query parameters: ${{ + transactionId, + signedMessage, + wallet, + permitSig, + }}` + ); + } + + const errorResponse = Response.json({ message: "Given details are not valid to redeem code." }, { status: 403 }); + + if (verifyMessage(getMessageToSign(transactionId), signedMessage) != wallet) { + console.error( + `Signed message verification failed: ${JSON.stringify({ + signedMessage, + transactionId, + })}` + ); + return errorResponse; + } + + const orderId = getGiftCardOrderId(wallet, permitSig); + const order = await getTransactionFromOrderId(orderId, accessToken); + + if (order.transactionId != transactionId) { + console.error( + `Given transaction does not match with retrieved transactionId using generated orderId: ${JSON.stringify({ + transactionId, + orderId, + transactionIdFromOrder: order.transactionId, + })}` + ); + return errorResponse; + } + + const redeemCode = await getRedeemCode(transactionId, accessToken); + return Response.json(redeemCode, { status: 200 }); + } catch (error) { + console.error("There was an error while processing your request.", error); + return Response.json({ message: "There was an error while processing your request." }, { status: 500 }); + } +}; + +export const getRedeemCode = async (transactionId: number, accessToken: AccessToken) => { + const url = `${getBaseUrl(accessToken.isSandbox)}/orders/transactions/${transactionId}/cards`; + console.log(`Retrieving redeem codes from ${url}`); + const options = { + method: "GET", + headers: { + Accept: "application/com.reloadly.giftcards-v1+json", + Authorization: `Bearer ${accessToken.token}`, + }, + }; + + const response = await fetch(url, options); + const responseJson = await response.json(); + + if (response.status != 200) { + throw new Error( + `Error from Reloadly API: ${JSON.stringify({ + status: response.status, + message: (responseJson as NotOkReloadlyApiResponse).message, + })}` + ); + } + console.log("Response status", response.status); + console.log(`Response from ${url}`, responseJson); + + return responseJson as ReloadlyRedeemCodeResponse; +}; diff --git a/functions/list-gift-cards.ts b/functions/list-gift-cards.ts new file mode 100644 index 00000000..c6804c94 --- /dev/null +++ b/functions/list-gift-cards.ts @@ -0,0 +1,51 @@ +import { Env, getAccessToken, getBaseUrl } from "../shared/helpers"; +import { AccessToken, NotOkReloadlyApiResponse, ReloadlyListGiftCardResponse } from "../shared/types"; +import { validateEnvVars, validateRequestMethod } from "./validators"; + +export const onRequest: PagesFunction = async (ctx) => { + try { + validateRequestMethod(ctx.request.method, "GET"); + validateEnvVars(ctx); + + const accessToken = await getAccessToken(ctx.env); + + // TODO: load visa and mastercards only by default + const products = await getProducts("visa", accessToken); + + if (products.length) { + return Response.json(products, { status: 200 }); + } + return Response.json({ message: "There are no products available." }, { status: 404 }); + } catch (error) { + console.error("There was an error while processing your request.", error); + return Response.json({ message: "There was an error while processing your request." }, { status: 500 }); + } +}; + +const getProducts = async (productQuery: string, accessToken: AccessToken) => { + const url = `${getBaseUrl(accessToken.isSandbox)}/products?productName=${productQuery}`; + console.log(`Retrieving products from ${url}`); + const options = { + method: "GET", + headers: { + Accept: "application/com.reloadly.giftcards-v1+json", + Authorization: `Bearer ${accessToken.token}`, + }, + }; + + const response = await fetch(url, options); + const responseJson = await response.json(); + + if (response.status != 200) { + throw new Error( + `Error from Reloadly API: ${JSON.stringify({ + status: response.status, + message: (responseJson as NotOkReloadlyApiResponse).message, + })}` + ); + } + console.log("Response status", response.status); + console.log(`Response from ${url}`, responseJson); + + return (responseJson as ReloadlyListGiftCardResponse).content; +}; diff --git a/functions/post-order.ts b/functions/post-order.ts new file mode 100644 index 00000000..a24ed7ce --- /dev/null +++ b/functions/post-order.ts @@ -0,0 +1,192 @@ +import { JsonRpcProvider } from "@ethersproject/providers/lib/json-rpc-provider"; +import { Interface, formatEther } from "ethers/lib/utils"; +import { Env, getAccessToken, getBaseUrl, getGiftCardOrderId, isProductAvailableForAmount } from "../shared/helpers"; +import { AccessToken, NotOkReloadlyApiResponse, OrderRequestParams, ReloadlyOrderResponse, ReloadlyProduct } from "../shared/types"; +import { validateEnvVars, validateRequestMethod } from "./validators"; +import { TransactionReceipt, TransactionResponse } from "@ethersproject/providers"; +import { permit2Abi } from "../static/scripts/rewards/abis/permit2Abi"; +import { getTransactionFromOrderId } from "./get-order"; + +export const networkRpcs: Record = { + 1: ["https://gateway.tenderly.co/public/mainnet"], + 5: ["https://eth-goerli.public.blastapi.io"], + 100: ["https://rpc.gnosischain.com"], + 31337: ["http://127.0.0.1:8545"], +}; + +export const onRequest: PagesFunction = async (ctx) => { + try { + validateRequestMethod(ctx.request.method, "POST"); + validateEnvVars(ctx); + + const accessToken = await getAccessToken(ctx.env); + + const { productId, txHash, chainId } = (await ctx.request.json()) as OrderRequestParams; + + if (isNaN(productId) || isNaN(chainId) || !(productId && txHash && chainId)) { + throw new Error(`Invalid post parameters: ${JSON.stringify({ productId, txHash, chainId })}`); + } + + if (!networkRpcs[chainId]) { + throw new Error(`Unsupported chain: ${JSON.stringify({ chainId })}`); + } + + const provider = new JsonRpcProvider( + { + url: networkRpcs[chainId][0], + skipFetchSetup: true, + }, + chainId + ); + + const [txReceipt, tx, product]: [TransactionReceipt, TransactionResponse, ReloadlyProduct] = await Promise.all([ + provider.getTransactionReceipt(txHash), + provider.getTransaction(txHash), + getProductById(productId, accessToken), + ]); + + if (!txReceipt) { + throw new Error(`Given transaction has not been mined yet. Please wait for it to be mined.`); + } + + const iface = new Interface(permit2Abi); + + const txParsed = iface.parseTransaction({ data: tx.data }); + + console.log("Parsed transaction data: ", JSON.stringify(txParsed)); + + const rewardAmount = txParsed.args.transferDetails.requestedAmount; + + if (!isProductAvailableForAmount(product, rewardAmount)) { + return Response.json({ message: "Your reward amount is either too high or too low to buy this card." }, { status: 403 }); + } + + const errorResponse = Response.json({ message: "Transaction is not authorized to purchase gift card." }, { status: 403 }); + + if (txReceipt.to != ctx.env.ADDRESS_PERMIT2) { + console.error( + "Given transaction hash is not an interaction with ctx.env.ADDRESS_PERMIT2", + `txReceipt.to=${txReceipt.to}`, + `ctx.env.ADDRESS_PERMIT2=${ctx.env.ADDRESS_PERMIT2}` + ); + return errorResponse; + } + + if (txParsed.args.transferDetails.to != ctx.env.ADDRESS_GIFT_CARD_TREASURY) { + console.error( + "Given transaction hash is not a token transfer to ADDRESS_GIFT_CARD_TREASURY", + `txParsed.args.transferDetails.to=${txParsed.args.transferDetails.to}`, + `ctx.env.ADDRESS_GIFT_CARD_TREASURY=${ctx.env.ADDRESS_GIFT_CARD_TREASURY}` + ); + return errorResponse; + } + + if (txParsed.functionFragment.name != "permitTransferFrom") { + console.error( + "Given transaction hash is not call to contract function permitTransferFrom", + `txParsed.functionFragment.name=${txParsed.functionFragment.name}` + ); + return errorResponse; + } + + const amountDai = formatEther(txParsed.args.transferDetails.requestedAmount); + + const orderId = getGiftCardOrderId(txReceipt.from, txParsed.args.signature); + + const isDuplicate = await isDuplicateOrder(orderId, accessToken); + if (isDuplicate) { + return Response.json({ message: "The permit has already claimed a gift card." }, { status: 400 }); + } + + const order = await orderGiftCard(productId, amountDai, orderId, accessToken); + + if (order.status == "SUCCESSFUL") { + return Response.json(order, { status: 200 }); + } else { + throw new Error(`Order failed: ${JSON.stringify(order)}`); + } + } catch (error) { + console.error("There was an error while processing your request.", error); + return Response.json({ message: "There was an error while processing your request." }, { status: 500 }); + } +}; + +const getProductById = async (productId: number, accessToken: AccessToken) => { + const url = `${getBaseUrl(accessToken.isSandbox)}/products/${productId}`; + console.log(`Retrieving product from ${url}`); + const options = { + method: "GET", + headers: { + Accept: "application/com.reloadly.giftcards-v1+json", + Authorization: `Bearer ${accessToken.token}`, + }, + }; + + const response = await fetch(url, options); + const responseJson = await response.json(); + + if (response.status != 200) { + throw new Error( + `Error from Reloadly API: ${JSON.stringify({ + status: response.status, + message: (responseJson as NotOkReloadlyApiResponse).message, + })}` + ); + } + console.log("response.status", response.status); + console.log(`Response from ${url}`, responseJson); + + return responseJson as ReloadlyProduct; +}; + +const orderGiftCard = async (productId: number, amount: string, identifier: string, accessToken: AccessToken) => { + const url = `${getBaseUrl(accessToken.isSandbox)}/orders`; + console.log(`Placing order at url: ${url}`); + + const requestBody = JSON.stringify({ + productId: productId, + quantity: 1, + unitPrice: amount, + customIdentifier: identifier, + preOrder: false, + }); + + console.log(`Placing order at url: ${url}`); + console.log(`Request body: ${requestBody}`); + + const options = { + method: "POST", + headers: { + "Content-Type": "application/json", + Accept: "application/com.reloadly.giftcards-v1+json", + Authorization: `Bearer ${accessToken.token}`, + }, + body: requestBody, + }; + + const response = await fetch(url, options); + const responseJson = await response.json(); + + if (response.status != 200) { + throw new Error( + `Error from Reloadly API: ${JSON.stringify({ + status: response.status, + message: (responseJson as NotOkReloadlyApiResponse).message, + })}` + ); + } + + console.log("Response status", response.status); + console.log(`Response from ${url}`, responseJson); + + return responseJson as ReloadlyOrderResponse; +}; + +async function isDuplicateOrder(orderId: string, accessToken: AccessToken) { + try { + const transaction = await getTransactionFromOrderId(orderId, accessToken); + return !!transaction.transactionId; + } catch (error) { + return false; + } +} diff --git a/functions/tsconfig.json b/functions/tsconfig.json new file mode 100644 index 00000000..feaa2e53 --- /dev/null +++ b/functions/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "lib": ["esnext"], + "types": ["@cloudflare/workers-types"], + "moduleResolution": "Node" + } +} diff --git a/functions/validators.ts b/functions/validators.ts new file mode 100644 index 00000000..042f144c --- /dev/null +++ b/functions/validators.ts @@ -0,0 +1,22 @@ +export function validateRequestMethod(expectedMethod: string, receivedMethod: string) { + if (receivedMethod !== expectedMethod) { + console.error( + "Invalid request method.", + JSON.stringify({ + expectedMethod, + receivedMethod, + }) + ); + throw new Error("Invalid request method."); + } +} + +export function validateEnvVars(ctx) { + if (typeof ctx.env.USE_RELOADLY_SANDBOX != "boolean") { + throw new Error("USE_RELOADLY_SANDBOX env var must be set to boolean true or false."); + } + if (!(ctx.env.RELOADLY_API_CLIENT_ID && ctx.env.RELOADLY_API_CLIENT_SECRET && ctx.env.ADDRESS_PERMIT2 && ctx.env.ADDRESS_GIFT_CARD_TREASURY)) { + console.error("One or more environment variable is missing."); + throw new Error("Missing server configuratinos."); + } +} diff --git a/package.json b/package.json index 67095103..0316e570 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "npm-run-all": "^4.1.5" }, "devDependencies": { + "@cloudflare/workers-types": "^4.20240423.0", "@commitlint/cli": "^18.6.1", "@commitlint/config-conventional": "^18.6.2", "@cspell/dict-node": "^4.0.3", @@ -70,7 +71,8 @@ "npm-run-all": "^4.1.5", "prettier": "^3.2.5", "tsx": "^4.7.1", - "typescript": "^5.3.3" + "typescript": "^5.3.3", + "wrangler": "^3.51.2" }, "lint-staged": { "*.ts": [ diff --git a/shared/helpers.ts b/shared/helpers.ts new file mode 100644 index 00000000..1ce28c36 --- /dev/null +++ b/shared/helpers.ts @@ -0,0 +1,102 @@ +import { AccessToken, ReloadlyProduct } from "./types"; +import { BigNumber, BigNumberish, ethers } from "ethers"; +import { formatEther, parseEther } from "ethers/lib/utils"; + +export interface Env { + RELOADLY_API_CLIENT_ID: string; + RELOADLY_API_CLIENT_SECRET: string; + ADDRESS_PERMIT2: string; + ADDRESS_GIFT_CARD_TREASURY: string; + USE_RELOADLY_SANDBOX: boolean; +} + +export type ReloadlyAuthResponse = { + access_token: string; + scope: string; + expires_in: number; + token_type: string; +}; + +export function initEnv() { + // TODO: make sure env vars have values, and it is called everywhere needed +} + +export async function getAccessToken(env: Env): Promise { + const url = "https://auth.reloadly.com/oauth/token"; + const options = { + method: "POST", + headers: { "Content-Type": "application/json", Accept: "application/json" }, + body: JSON.stringify({ + client_id: env.RELOADLY_API_CLIENT_ID, + client_secret: env.RELOADLY_API_CLIENT_SECRET, + grant_type: "client_credentials", + audience: env.USE_RELOADLY_SANDBOX === false ? "https://giftcards.reloadly.com" : "https://giftcards-sandbox.reloadly.com", + }), + }; + + const res = await fetch(url, options); + if (res.status == 200) { + const successResponse = (await res.json()) as ReloadlyAuthResponse; + return { + token: successResponse.access_token, + isSandbox: env.USE_RELOADLY_SANDBOX !== false, + }; + } + throw `Getting access token failed: ${JSON.stringify(await res.json())}`; +} + +export function getBaseUrl(isSandbox: boolean): string { + if (isSandbox === false) { + return "https://giftcards.reloadly.com"; + } + return "https://giftcards-sandbox.reloadly.com"; +} + +export function isProductAvailableForAmount(product: ReloadlyProduct, rewardAmount: BigNumberish) { + if (product.senderCurrencyCode != "USD") { + throw new Error(`Failed to validate price because product's senderCurrencyCode is not USD: ${JSON.stringify({ rewardAmount, product })}`); + } + + const value = getProductValueAfterFee(product, rewardAmount); + + return ( + (product.denominationType == "FIXED" && product.fixedSenderDenominations.includes(value)) || + (product.denominationType == "RANGE" && value >= product.minSenderDenomination && value <= product.maxSenderDenomination) + ); +} + +export function getProductValueAfterFee(product: ReloadlyProduct, rewardAmount: BigNumberish) { + const rewardAmountEth = BigNumber.from(rewardAmount.toString()); + const productFeePercentageEth = parseEther(product.senderFeePercentage.toString()); + const senderFeeFixed = parseEther(product.senderFee.toString()); + const senderFeePercentage = rewardAmountEth.mul(productFeePercentageEth).div(100); + const totalFee = senderFeePercentage.add(senderFeeFixed); + const remainingValue = rewardAmountEth.sub(totalFee); + return Number(formatEther(remainingValue)); +} + +export function addProductFeesToPrice(product: ReloadlyProduct, price: number) { + const priceEth = parseEther(price.toString()); + const productFeePercentageEth = parseEther(product.senderFeePercentage.toString()); + + const senderFeeFixed = parseEther(product.senderFee.toString()); + const senderFeePercentage = priceEth.mul(productFeePercentageEth).div(100); + const totalFee = senderFeePercentage.add(senderFeeFixed); + + const priceWithFees = priceEth.add(totalFee); + return Number(formatEther(priceWithFees)); +} + +export function getGiftCardOrderId(rewardToAddress: string, signature: string) { + const checksumAddress = ethers.utils.getAddress(rewardToAddress); + const integrityString = checksumAddress + ":" + signature; + const integrityBytes = ethers.utils.toUtf8Bytes(integrityString); + return ethers.utils.keccak256(integrityBytes); +} + +export function getMessageToSign(transactionId: number) { + return JSON.stringify({ + from: "pay.ubq.fi", + transactionId: transactionId, + }); +} diff --git a/shared/types.ts b/shared/types.ts new file mode 100644 index 00000000..183982bf --- /dev/null +++ b/shared/types.ts @@ -0,0 +1,155 @@ +export type AccessToken = { + token: string; + isSandbox: boolean; +}; + +export type ReloadlyProduct = { + productId: number; + productName: string; + global: boolean; + supportsPreOrder: boolean; + senderFee: number; + senderFeePercentage: number; + discountPercentage: number; + denominationType: "FIXED" | "RANGE"; + recipientCurrencyCode: string; + minRecipientDenomination: number; + maxRecipientDenomination: number; + senderCurrencyCode: string; + minSenderDenomination: number; + maxSenderDenomination: number; + fixedRecipientDenominations: number[]; + fixedSenderDenominations: number[]; + fixedRecipientToSenderDenominationsMap: { string: number }; + metadata?: object; + logoUrls: string[]; + brand: { + brandId: number; + brandName: string; + }; + country: { + isoName: string; + name: string; + flagUrl: string; + }; + redeemInstruction: { + concise: string; + verbose: string; + }; +}; +export type ReloadlyListGiftCardResponse = { + content: ReloadlyProduct[]; + pageable: { + sort: { + sorted: boolean; + unsorted: boolean; + empty: boolean; + }; + pageNumber: number; + pageSize: number; + offset: number; + unpaged: boolean; + paged: boolean; + }; + totalElements: number; + totalPages: number; + last: boolean; + first: boolean; + sort: { + sorted: boolean; + unsorted: boolean; + empty: boolean; + }; + numberOfElements: number; + size: number; + number: number; + empty: boolean; +}; + +export type ReloadlyOrderedProduct = { + productId: number; + productName: string; + countryCode: string; + quantity: number; + unitPrice: number; + totalPrice: number; + currencyCode: string; + brand: { + brandId: number; + brandName: string; + }; +}; + +export type ReloadlyOrderResponse = { + transactionId: number; + amount: number; + discount: number; + currencyCode: string; + fee: number; + recipientEmail: string; + customIdentifier: string; + status: string; + product: ReloadlyOrderedProduct; + smsFee: number; + recipientPhone: number; + transactionCreatedTime: string; //"2022-02-28 13:46:00", + preOrdered: boolean; +}; + +export type ReloadlyTransaction = { + transactionId: number; + amount: number; + discount: number; + currencyCode: string; + fee: number; + recipientEmail: string; + customIdentifier: string; + status: string; + product: ReloadlyOrderedProduct; + smsFee: number; + recipientPhone: number; + transactionCreatedTime: string; //"2022-02-28 13:46:00", + preOrdered: boolean; +}; +export type ReloadlyGetTransactionResponse = { + content: ReloadlyTransaction[]; + pageable: { + sort: { sorted: boolean; unsorted: boolean; empty: boolean }; + pageNumber: number; + pageSize: number; + offset: number; + unpaged: boolean; + paged: boolean; + }; + totalElements: number; + totalPages: number; + last: boolean; + first: boolean; + sort: { sorted: boolean; unsorted: boolean; empty: boolean }; + numberOfElements: number; + size: number; + number: number; + empty: boolean; +}; + +export type RedeemCode = { + cardNumber: string; + pinCode: string; +}; +export type ReloadlyRedeemCodeResponse = RedeemCode[]; + +// TODO: rename this to FailedReloadlyApiResponse +export type NotOkReloadlyApiResponse = { + timeStamp: string; + message: string; + path: string; + errorCode: string; + infoLink?: string; + details: []; +}; + +export type OrderRequestParams = { + productId: number; + txHash: string; + chainId: number; +}; diff --git a/static/index.html b/static/index.html index c17698d7..8570d6a1 100644 --- a/static/index.html +++ b/static/index.html @@ -6,6 +6,7 @@ + @@ -55,7 +56,7 @@
- +
@@ -123,7 +124,7 @@ -
+
-
-
+ +
+
+
+
+
diff --git a/static/scripts/rewards/constants.ts b/static/scripts/rewards/constants.ts index f0e8422b..2505023e 100644 --- a/static/scripts/rewards/constants.ts +++ b/static/scripts/rewards/constants.ts @@ -54,3 +54,4 @@ export const networkRpcs: Record = { export const permit2Address = "0x000000000022D473030F116dDEE9F6B43aC78BA3"; const nftAddress = "0xAa1bfC0e51969415d64d6dE74f27CDa0587e645b"; +export const giftCardTreasuryAddress = "0x3B47E3e4758E133acf72684727Dc10550C40e4B9"; diff --git a/static/scripts/rewards/gift-cards/activate/activate-action.ts b/static/scripts/rewards/gift-cards/activate/activate-action.ts new file mode 100644 index 00000000..9a7283ca --- /dev/null +++ b/static/scripts/rewards/gift-cards/activate/activate-action.ts @@ -0,0 +1,19 @@ +export function attachActivateInfoAction() { + const activateButtons: HTMLCollectionOf = document.getElementsByClassName("activate-btn"); + + Array.from(activateButtons).forEach((activateButton: Element) => { + (activateButton as HTMLButtonElement).addEventListener("click", async () => { + const productId = Number(activateButton.parentElement?.parentElement?.parentElement?.getAttribute("data-product-id")); + + document.querySelector(`.redeem-info-wrapper[data-info-for="${productId}"]`)?.setAttribute("data-show", "true"); + }); + }); + + const closeButtons: HTMLCollectionOf = document.getElementsByClassName("close-btn"); + + Array.from(closeButtons).forEach((closeButton: Element) => { + (closeButton as HTMLButtonElement).addEventListener("click", async () => { + closeButton.parentElement?.parentElement?.setAttribute("data-show", "false"); + }); + }); +} diff --git a/static/scripts/rewards/gift-cards/activate/activate-html.ts b/static/scripts/rewards/gift-cards/activate/activate-html.ts new file mode 100644 index 00000000..9bfd76c9 --- /dev/null +++ b/static/scripts/rewards/gift-cards/activate/activate-html.ts @@ -0,0 +1,30 @@ +import { ReloadlyProduct } from "../../../../../shared/types"; + +const html = String.raw; + +export function getGiftCardActivateInfoHtml(giftcard: ReloadlyProduct) { + return html` +
+
+
+ + + + + +
+
+

${giftcard.redeemInstruction.concise}

+ ${giftcard.redeemInstruction.concise != giftcard.redeemInstruction.verbose ? `

${giftcard.redeemInstruction.verbose}

` : ``} +
+
+
+ `; +} diff --git a/static/scripts/rewards/gift-cards/claim/claim-action.ts b/static/scripts/rewards/gift-cards/claim/claim-action.ts new file mode 100644 index 00000000..b3bf7620 --- /dev/null +++ b/static/scripts/rewards/gift-cards/claim/claim-action.ts @@ -0,0 +1,80 @@ +import { ethers } from "ethers"; +import { permit2Abi } from "../../abis"; +import { AppState } from "../../app-state"; +import { giftCardTreasuryAddress, permit2Address } from "../../constants"; +import { toaster } from "../../toaster"; +import { isNonceClaimed, transferFromPermit, waitForTransaction } from "../../web3/erc20-permit"; +import { getApiBaseUrl } from "../helpers"; +import { isProductAvailableForAmount } from "../../../../../shared/helpers"; +import { OrderRequestParams, ReloadlyProduct } from "../../../../../shared/types"; + +export function attachClaimAction(className: string, giftcards: ReloadlyProduct[], app: AppState) { + const claimButtons: HTMLCollectionOf = document.getElementsByClassName(className); + Array.from(claimButtons).forEach((claimButton: Element) => { + (claimButton as HTMLButtonElement).addEventListener("click", async () => { + claimButton.setAttribute("data-loading", "true"); + const productId = Number(claimButton.parentElement?.parentElement?.parentElement?.getAttribute("data-product-id")); + + const product = giftcards.find((product: ReloadlyProduct) => product.productId == productId); + if (product) { + if (!isProductAvailableForAmount(product, app.reward.amount)) { + toaster.create("error", "Your reward amount is not equal to the price of available card."); + } else { + await claimGiftCard(productId, app); + } + } + claimButton.setAttribute("data-loading", "false"); + }); + }); +} + +async function claimGiftCard(productId: number, app: AppState) { + if (app.signer) { + if ((await app.signer.getAddress()) != app.reward.beneficiary) { + toaster.create("error", "The connected wallet is not the beneficiary of the reward."); + return; + } + const isClaimed = await isNonceClaimed(app); + if (isClaimed) { + toaster.create("error", "Reward has been claimed already."); + return; + } + + const permit2Contract = new ethers.Contract(permit2Address, permit2Abi, app.signer); + if (!permit2Contract) return; + + const reward = { + ...app.reward, + }; + reward.beneficiary = giftCardTreasuryAddress; + + const tx = await transferFromPermit(permit2Contract, reward); + if (!tx) return; + await waitForTransaction(tx, `Payment confirmed. Claiming card now...`); + + const url = `${getApiBaseUrl()}/post-order`; + + const orderParams: OrderRequestParams = { + chainId: app.signer.provider.network.chainId, + txHash: tx.hash, + productId, + }; + const response = await fetch(url, { + method: "POST", + headers: { + Accept: "application/json", + }, + body: JSON.stringify(orderParams), + }); + + if (response.status != 200) { + toaster.create("error", "Order failed. Try again later."); + return; + } + + toaster.create("success", "Gift card claimed successfully."); + window.location.reload(); + } else { + toaster.create("error", "Connect your wallet to proceed."); + } +} diff --git a/static/scripts/rewards/gift-cards/gift-card.ts b/static/scripts/rewards/gift-cards/gift-card.ts new file mode 100644 index 00000000..c07ad8a5 --- /dev/null +++ b/static/scripts/rewards/gift-cards/gift-card.ts @@ -0,0 +1,81 @@ +import { BigNumberish } from "ethers"; +import { ReloadlyProduct } from "../../../../shared/types"; +import { getProductValueAfterFee, isProductAvailableForAmount } from "../../../../shared/helpers"; +import { getFixedPricesAndValues } from "./helpers"; +import { formatEther } from "ethers/lib/utils"; + +const html = String.raw; + +export function getGiftCardHtml(giftcard: ReloadlyProduct, allowBuy: boolean, rewardAmount: BigNumberish) { + return html` +
+
+

${giftcard.productName.length > 16 ? giftcard.productName.substring(0, 16) + "..." : giftcard.productName}

+

+ ${giftcard.productName} +

+ +
+ + ${allowBuy + ? `` + : ``} +
+ +
+ ${isProductAvailableForAmount(giftcard, rewardAmount) + ? ` +
+
Price
+
Value
+
+
+
${Number(formatEther(rewardAmount)).toFixed(1)}${giftcard.senderCurrencyCode}
+
${getProductValueAfterFee(giftcard, rewardAmount).toFixed(1)}${giftcard.senderCurrencyCode}
+
+ ` + : `${ + giftcard.denominationType == "FIXED" + ? `
+
Price
+
Value
+
+ ${getFixedPricesAndValues(giftcard)}` + : `
+
Price
+
${giftcard.minSenderDenomination}-${giftcard.maxSenderDenomination}${giftcard.senderCurrencyCode}
+
+
+
Value
+
${giftcard.minRecipientDenomination}-${giftcard.maxRecipientDenomination}${giftcard.recipientCurrencyCode}
+
+
+
Fee
+
(${giftcard.senderFee}${giftcard.senderCurrencyCode}+${giftcard.senderFeePercentage}%fee)
+
+ ` + }`} +
+
+
+ `; +} diff --git a/static/scripts/rewards/gift-cards/helpers.ts b/static/scripts/rewards/gift-cards/helpers.ts new file mode 100644 index 00000000..d3978964 --- /dev/null +++ b/static/scripts/rewards/gift-cards/helpers.ts @@ -0,0 +1,15 @@ +import { addProductFeesToPrice } from "../../../../shared/helpers"; +import { ReloadlyProduct } from "../../../../shared/types"; + +export function getApiBaseUrl() { + return ""; +} + +export function getFixedPricesAndValues(giftcard: ReloadlyProduct) { + let html = ""; + giftcard.fixedSenderDenominations.forEach((priceWithoutFee, i) => { + const price = addProductFeesToPrice(giftcard, priceWithoutFee); + html += `
${price.toFixed(1)}${giftcard.senderCurrencyCode}
${giftcard.fixedRecipientDenominations[i].toFixed(1)}${giftcard.recipientCurrencyCode}
`; + }); + return html; +} diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts new file mode 100644 index 00000000..0da8ffc2 --- /dev/null +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -0,0 +1,80 @@ +import { getGiftCardOrderId } from "../../../../shared/helpers"; +import { ReloadlyProduct, ReloadlyTransaction } from "../../../../shared/types"; +import { AppState } from "../app-state"; +import { attachActivateInfoAction } from "./activate/activate-action"; +import { attachClaimAction } from "./claim/claim-action"; +import { attachRevealAction } from "./reveal/reveal-action"; +import { getApiBaseUrl } from "./helpers"; +import { getGiftCardActivateInfoHtml } from "./activate/activate-html"; +import { getGiftCardHtml } from "./gift-card"; +import { getRedeemCodeHtml } from "./reveal/redeem-code-html"; + +export async function initCollectGiftCard(app: AppState) { + const retrieveOrderUrl = `${getApiBaseUrl()}/get-order?orderId=${getGiftCardOrderId(app.reward.beneficiary, app.reward.signature)}`; + const listGiftCardsUrl = `${getApiBaseUrl()}/list-gift-cards`; + + const requestInit = { + method: "GET", + headers: { + Accept: "application/json", + }, + }; + + const [retrieveOrderResponse, retrieveGiftCardsResponse] = await Promise.all([fetch(retrieveOrderUrl, requestInit), fetch(listGiftCardsUrl, requestInit)]); + + const transaction = (await retrieveOrderResponse.json()) as ReloadlyTransaction; + const giftcards = (await retrieveGiftCardsResponse.json()) as ReloadlyProduct[]; + + const giftCardsSection = document.getElementById("gift-cards"); + if (!giftCardsSection) { + console.error("Missing gift cards section #gift-cards"); + return; + } + const activateInfoSection = document.getElementById("activate-info"); + if (!activateInfoSection) { + console.error("Missing gift cards activate info section #activate-info"); + return; + } + + if (retrieveOrderResponse.status == 200) { + const giftcard = giftcards.find((giftcard) => transaction.product.productId == giftcard.productId); + + let giftCardsHtml = `

Your gift card

`; + giftCardsHtml += `
`; + if (giftcard) { + giftCardsHtml += getGiftCardHtml(giftcard, false, app.reward.amount); + } + giftCardsHtml += getRedeemCodeHtml(transaction); + giftCardsHtml += `
`; + giftCardsSection.innerHTML = giftCardsHtml; + + let activateInfoHtml = ""; + if (giftcard) { + activateInfoHtml += getGiftCardActivateInfoHtml(giftcard); + } + + activateInfoSection.innerHTML = activateInfoHtml; + + attachRevealAction(transaction, app); + } else if (retrieveGiftCardsResponse.status == 200) { + let giftCardsHtml = `

Or claim in virtual visa/mastercard

`; + giftCardsHtml += `
`; + giftcards.forEach((giftcard: ReloadlyProduct) => { + giftCardsHtml += getGiftCardHtml(giftcard, true, app.reward.amount); + }); + giftCardsHtml += `
`; + giftCardsSection.innerHTML = giftCardsHtml; + + let activateInfoHtml = ""; + giftcards.forEach((giftcard: ReloadlyProduct) => { + activateInfoHtml += getGiftCardActivateInfoHtml(giftcard); + }); + activateInfoSection.innerHTML = activateInfoHtml; + + attachClaimAction("claim-gift-card-btn", giftcards, app); + } else { + giftCardsSection.innerText = "There was a problem in fetching gift cards. Try again later."; + } + + attachActivateInfoAction(); +} diff --git a/static/scripts/rewards/gift-cards/reveal/redeem-code-html.ts b/static/scripts/rewards/gift-cards/reveal/redeem-code-html.ts new file mode 100644 index 00000000..f9a39786 --- /dev/null +++ b/static/scripts/rewards/gift-cards/reveal/redeem-code-html.ts @@ -0,0 +1,34 @@ +import { ReloadlyTransaction } from "../../../../../shared/types"; + +const html = String.raw; + +export function getRedeemCodeHtml(transaction: ReloadlyTransaction) { + return html` +
+

Your redeem code

+

xxxxxxxxxxxx

+

xxxxxxxxxxxx

+

xxxxxxxxxxxx

+
+ +
+
+ `; +} diff --git a/static/scripts/rewards/gift-cards/reveal/reveal-action.ts b/static/scripts/rewards/gift-cards/reveal/reveal-action.ts new file mode 100644 index 00000000..882991d0 --- /dev/null +++ b/static/scripts/rewards/gift-cards/reveal/reveal-action.ts @@ -0,0 +1,59 @@ +import { getMessageToSign } from "../../../../../shared/helpers"; +import { RedeemCode, ReloadlyRedeemCodeResponse, ReloadlyTransaction } from "../../../../../shared/types"; +import { AppState } from "../../app-state"; +import { toaster } from "../../toaster"; +import { getApiBaseUrl } from "../helpers"; + +export function attachRevealAction(transaction: ReloadlyTransaction, app: AppState) { + const revealButton = document.getElementById("reveal-btn"); + const loaderAttribute = "data-loading-reveal"; + revealButton?.addEventListener("click", async () => { + revealButton.setAttribute(loaderAttribute, "true"); + const transactionId = document.getElementsByClassName("redeem-code")[0].getAttribute("data-transactionId"); + if (app?.signer && transactionId) { + try { + const signedMessage = await app.signer.signMessage(getMessageToSign(Number(transactionId))); + await revealRedeemCode(transaction.transactionId, signedMessage, app); + } catch (error) { + toaster.create("error", "User did not sign the message to reveal redeem code."); + revealButton.setAttribute(loaderAttribute, "false"); + } + } else { + toaster.create("error", "Connect your wallet to reveal the redeem code."); + } + revealButton.setAttribute(loaderAttribute, "false"); + }); +} + +async function revealRedeemCode(transactionId: number, signedMessage: string, app: AppState) { + const requestInit = { + method: "GET", + headers: { + Accept: "application/json", + }, + }; + + const response = await fetch( + `${getApiBaseUrl()}/get-redeem-code?transactionId=${transactionId}&signedMessage=${signedMessage}&wallet=${await app.signer?.getAddress()}&permitSig=${app.reward.signature}`, + requestInit + ); + + if (response.status != 200) { + toaster.create("error", `Redeem code can't be revealed to the connected wallet.`); + return; + } + + const responseJson = (await response.json()) as ReloadlyRedeemCodeResponse; + + const redeemCodeElements = document.getElementsByClassName("redeem-code"); + if (redeemCodeElements && redeemCodeElements.length) { + let codesHtml = "

Your redeem code

"; + responseJson.forEach((code) => { + const keys = Object.keys(code); + keys.forEach((key) => { + codesHtml += `

${key}: ${code[key as keyof RedeemCode]}

`; + }); + }); + redeemCodeElements[0].innerHTML = codesHtml; + } +} diff --git a/static/scripts/rewards/init.ts b/static/scripts/rewards/init.ts index bf9cf9bd..1aa3b7ad 100644 --- a/static/scripts/rewards/init.ts +++ b/static/scripts/rewards/init.ts @@ -1,4 +1,5 @@ import { app } from "./app-state"; +import { initCollectGiftCard } from "./gift-cards/list-gift-cards"; import { readClaimDataFromUrl } from "./render-transaction/read-claim-data-from-url"; import { grid } from "./the-grid"; @@ -19,3 +20,5 @@ function displayCommitHash() { function gridLoadedCallback() { document.body.classList.add("grid-loaded"); } + +initCollectGiftCard(app).catch(console.error); diff --git a/static/scripts/rewards/web3/erc20-permit.ts b/static/scripts/rewards/web3/erc20-permit.ts index 1a9a54c7..63b83723 100644 --- a/static/scripts/rewards/web3/erc20-permit.ts +++ b/static/scripts/rewards/web3/erc20-permit.ts @@ -56,8 +56,7 @@ async function checkPermitClaimability(app: AppState): Promise { return false; } -async function transferFromPermit(permit2Contract: Contract, app: AppState) { - const reward = app.reward; +export async function transferFromPermit(permit2Contract: Contract, reward: Permit) { try { const tx = await permit2Contract.permitTransferFrom( { @@ -93,10 +92,10 @@ async function transferFromPermit(permit2Contract: Contract, app: AppState) { } } -async function waitForTransaction(tx: TransactionResponse) { +export async function waitForTransaction(tx: TransactionResponse, successMessage: string) { try { const receipt = await tx.wait(); - toaster.create("success", `Claim Complete.`); + toaster.create("success", successMessage); buttonController.showViewClaim(); buttonController.hideLoader(); buttonController.hideMakeClaim(); @@ -124,13 +123,13 @@ export function claimErc20PermitHandlerWrapper(app: AppState) { const permit2Contract = new ethers.Contract(permit2Address, permit2Abi, app.signer); if (!permit2Contract) return; - const tx = await transferFromPermit(permit2Contract, app); + const tx = await transferFromPermit(permit2Contract, app.reward); if (!tx) return; // buttonController.showLoader(); // buttonController.hideMakeClaim(); - const receipt = await waitForTransaction(tx); + const receipt = await waitForTransaction(tx, `Claim Complete.`); if (!receipt) return; const isHashUpdated = await updatePermitTxHash(app, receipt.transactionHash); @@ -262,7 +261,7 @@ invalidateButton.addEventListener("click", async function invalidateButtonClickH }); //mimics https://github.com/Uniswap/permit2/blob/a7cd186948b44f9096a35035226d7d70b9e24eaf/src/SignatureTransfer.sol#L150 -async function isNonceClaimed(app: AppState): Promise { +export async function isNonceClaimed(app: AppState): Promise { const provider = app.provider; const permit2Contract = new ethers.Contract(permit2Address, permit2Abi, provider); diff --git a/static/styles/rewards/claim-table.css b/static/styles/rewards/claim-table.css index 1d5db0ad..7678df8c 100644 --- a/static/styles/rewards/claim-table.css +++ b/static/styles/rewards/claim-table.css @@ -254,6 +254,9 @@ table th { [data-make-claim="false"] #make-claim { display: none; } +[data-collect-gift-card="false"] #collect-gift-card { + display: none; +} [data-view-claim="false"] #view-claim { display: none; } diff --git a/static/styles/rewards/gift-cards.css b/static/styles/rewards/gift-cards.css new file mode 100644 index 00000000..8fb57385 --- /dev/null +++ b/static/styles/rewards/gift-cards.css @@ -0,0 +1,162 @@ +.heading-gift-card { + font-size: 16px; + text-align: center; + position: absolute; + margin-top: -30px; +} +#gift-cards { + padding-top: 44px; + display: flex; + flex-direction: column; + align-items: center; +} + +main:has(#gift-cards .product) { + height: auto; +} + +main:has(#gift-cards .product) div:has(table.receipt) { + padding-top: 50px; +} +.redeem-info-wrapper[data-show="false"] { + display: none; +} + +.products { + display: flex; + flex-direction: row; + overflow-x: auto; + max-width: 563px; + width: 100vw; + transform: rotateX(180deg); + /* Because of rotateX, some properties like padding-bottom, align-items work in reverse. */ + align-items: end; + padding-bottom: 12px; +} +.products .product { + transform: rotateX(180deg); +} + +.purchased { + flex-direction: column; + align-items: center; +} + +.product { + background-color: var(--background-color-default); + margin-right: 10px; + padding: 12px 6px; + text-align: center; + min-width: 168px; + width: 168px; + height: fit-content; +} +.redeem-code { + width: 160px; +} + +.product h3 { + color: #fff; +} + +.product div.buttons { + display: flex; + flex-direction: row; + justify-content: space-evenly; + margin: 10px 0; +} +.product div.buttons span { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 6px; +} + +.product div.buttons button { + background-color: #80808020; + border: none; + color: #fff; + cursor: pointer; +} +.product img { + box-sizing: border-box; + width: 100%; + height: auto; + border: 2px solid #80808020; + max-width: 168px; + max-height: 110px; +} + +.product .pricing { + display: flex; + flex-direction: column; +} +.product .pricing div { + display: flex; + flex-direction: row; + justify-content: space-between; +} +.redeem-info-wrapper { + position: absolute; + z-index: 1000; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: var(--background-color-default); +} +.redeem-info { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + max-width: 563px; + padding: 24px; + border-collapse: collapse; + border-color: gray; + overflow-y: auto; + z-index: 1; +} + +.close-btn { + position: absolute; + top: 0; + right: 0; + cursor: pointer; + color: #fff; +} + +.claim-gift-card-btn[data-loading="true"] > span.action { + display: none; +} +.claim-gift-card-btn[data-loading="true"] > span.loading { + display: flex; +} +.claim-gift-card-btn[data-loading="true"] > span.loading svg { + animation: rotate 1s linear infinite; +} +.claim-gift-card-btn[data-loading="false"] > span.action { + display: flex; +} +.claim-gift-card-btn[data-loading="false"] > span.loading { + display: none; +} + +#reveal-btn[data-loading-reveal="false"] .loading { + display: none; +} +#reveal-btn[data-loading-reveal="false"] .action { + display: block; +} + +#reveal-btn[data-loading-reveal="true"] .loading { + display: block; +} +#reveal-btn[data-loading-reveal="true"] .loading svg { + animation: rotate 1s linear infinite; +} + +#reveal-btn[data-loading-reveal="true"] .action { + display: none; +} diff --git a/static/styles/rewards/pay.css b/static/styles/rewards/pay.css index ec76f153..1d580dd4 100644 --- a/static/styles/rewards/pay.css +++ b/static/styles/rewards/pay.css @@ -38,6 +38,7 @@ main { flex-direction: column; justify-content: center; align-items: center; + color: #808080; } main { @@ -156,6 +157,7 @@ footer { /* display: none; */ opacity: 0; transition: opacity 1s; + padding-top: 80px; } #carousel > div { color: #808080; diff --git a/tsconfig.json b/tsconfig.json index 18ac9fe6..faf7a889 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,5 @@ { - "include": ["src", "static", "build", "scripts/typescript", "globals.d.ts", "cypress/**/*.ts", "cypress.config.ts"], + "include": ["src", "static", "functions", "build", "scripts/typescript", "globals.d.ts", "cypress/**/*.ts", "cypress.config.ts"], "compilerOptions": { /* Visit https://aka.ms/tsconfig to read more about this file */ /* Projects */ diff --git a/wrangler.toml b/wrangler.toml new file mode 100644 index 00000000..e63c6599 --- /dev/null +++ b/wrangler.toml @@ -0,0 +1,9 @@ +compatibility_flags = [ "nodejs_compat" ] +compatibility_date = "2024-04-05" + +[vars] +USE_RELOADLY_SANDBOX = true +RELOADLY_API_CLIENT_ID = "" +RELOADLY_API_CLIENT_SECRET = "" +ADDRESS_PERMIT2 = "0x000000000022D473030F116dDEE9F6B43aC78BA3" +ADDRESS_GIFT_CARD_TREASURY = "" diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..adfc4a75 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,5718 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@actions/core@^1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.10.1.tgz#61108e7ac40acae95ee36da074fa5850ca4ced8a" + integrity sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g== + dependencies: + "@actions/http-client" "^2.0.1" + uuid "^8.3.2" + +"@actions/github@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@actions/github/-/github-6.0.0.tgz#65883433f9d81521b782a64cc1fd45eef2191ea7" + integrity sha512-alScpSVnYmjNEXboZjarjukQEzgCRmjMv6Xj47fsdnqGS73bjJNDpiiXmp8jr0UZLdUB6d9jW63IcmddUP+l0g== + dependencies: + "@actions/http-client" "^2.2.0" + "@octokit/core" "^5.0.1" + "@octokit/plugin-paginate-rest" "^9.0.0" + "@octokit/plugin-rest-endpoint-methods" "^10.0.0" + +"@actions/http-client@^2.0.1", "@actions/http-client@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-2.2.1.tgz#ed3fe7a5a6d317ac1d39886b0bb999ded229bb38" + integrity sha512-KhC/cZsq7f8I4LfZSJKgCvEwfkE8o1538VoBeoGzokVLLnbFDEAdFD3UhoMklxo2un9NJVBdANOresx7vTHlHw== + dependencies: + tunnel "^0.0.6" + undici "^5.25.4" + +"@adraffy/ens-normalize@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069" + integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== + +"@babel/code-frame@^7.0.0": + 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== + dependencies: + "@babel/highlight" "^7.24.2" + picocolors "^1.0.0" + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/highlight@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" + integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@cloudflare/kv-asset-handler@0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.1.tgz#9b86167e58dbc419943c8d3ddcd8e2823f5db300" + integrity sha512-lKN2XCfKCmpKb86a1tl4GIwsJYDy9TGuwjhDELLmpKygQhw8X2xR4dusgpC5Tg7q1pB96Eb0rBo81kxSILQMwA== + dependencies: + mime "^3.0.0" + +"@cloudflare/workerd-darwin-64@1.20240405.0": + version "1.20240405.0" + resolved "https://registry.yarnpkg.com/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20240405.0.tgz#07637ec31e2b6272c8924c5d6b499ec022378fa5" + integrity sha512-ut8kwpHmlz9dNSjoov6v1b6jS50J46Mj9QcMA0t1Hne36InaQk/qqPSd12fN5p2GesZ9OOBJvBdDsTblVdyJ1w== + +"@cloudflare/workerd-darwin-arm64@1.20240405.0": + version "1.20240405.0" + resolved "https://registry.yarnpkg.com/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20240405.0.tgz#5fba9fbfdb6906f5c216ab1e9451a3360daa90fd" + integrity sha512-x3A3Ym+J2DH1uYnw0aedeKOTnUebEo312+Aladv7bFri97pjRJcqVbYhMtOHLkHjwYn7bpKSY2eL5iM+0XT29A== + +"@cloudflare/workerd-linux-64@1.20240405.0": + version "1.20240405.0" + resolved "https://registry.yarnpkg.com/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20240405.0.tgz#9f455b9484921b4ef0b30f2f13747abfc73bf86c" + integrity sha512-3tYpfjtxEQ0R30Pna7OF3Bz0CTx30hc0QNtH61KnkvXtaeYMkWutSKQKXIuVlPa/7v1MHp+8ViBXMflmS7HquA== + +"@cloudflare/workerd-linux-arm64@1.20240405.0": + version "1.20240405.0" + resolved "https://registry.yarnpkg.com/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20240405.0.tgz#50220db83d4e9f423bb59623a37b67fd4251680f" + integrity sha512-NpKZlvmdgcX/m4tP5zM91AfJpZrue2/GRA+Sl3szxAivu2uE5jDVf5SS9dzqzCVfPrdhylqH7yeL4U/cafFNOg== + +"@cloudflare/workerd-windows-64@1.20240405.0": + version "1.20240405.0" + resolved "https://registry.yarnpkg.com/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20240405.0.tgz#4cb542cf8003fcd230bcf3b767f0d697a6cd799d" + integrity sha512-REBeJMxvUCjwuEVzSSIBtzAyM69QjToab8qBst0S9vdih+9DObym4dw8CevdBQhDbFrHiyL9E6pAZpLPNHVgCw== + +"@cloudflare/workers-types@^4.20240423.0": + version "4.20240423.0" + resolved "https://registry.yarnpkg.com/@cloudflare/workers-types/-/workers-types-4.20240423.0.tgz#f09f18e338cd3e1ce0acbe02bb72d101cc38aa7f" + integrity sha512-ssuccb3j+URp6mP2p0PcQE9vmS3YeKBQnALHF9P3yQfUAFozuhTsDTbqmL+zPrJvUcG7SL2xVQkNDF9QJeKDZw== + +"@commitlint/cli@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-18.6.1.tgz#78bffdfa00d6f01425d53096954993d83f2b343d" + integrity sha512-5IDE0a+lWGdkOvKH892HHAZgbAjcj1mT5QrfA/SVbLJV/BbBMGyKN0W5mhgjekPJJwEQdVNvhl9PwUacY58Usw== + dependencies: + "@commitlint/format" "^18.6.1" + "@commitlint/lint" "^18.6.1" + "@commitlint/load" "^18.6.1" + "@commitlint/read" "^18.6.1" + "@commitlint/types" "^18.6.1" + execa "^5.0.0" + lodash.isfunction "^3.0.9" + resolve-from "5.0.0" + resolve-global "1.0.0" + yargs "^17.0.0" + +"@commitlint/config-conventional@^18.6.2": + version "18.6.3" + resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-18.6.3.tgz#1b2740dbe325d76e05924c46bc1504340b701ca1" + integrity sha512-8ZrRHqF6je+TRaFoJVwszwnOXb/VeYrPmTwPhf0WxpzpGTcYy1p0SPyZ2eRn/sRi/obnWAcobtDAq6+gJQQNhQ== + dependencies: + "@commitlint/types" "^18.6.1" + conventional-changelog-conventionalcommits "^7.0.2" + +"@commitlint/config-validator@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-18.6.1.tgz#e0d71a99c984a68586c7ae7afd3f52342022fae8" + integrity sha512-05uiToBVfPhepcQWE1ZQBR/Io3+tb3gEotZjnI4tTzzPk16NffN6YABgwFQCLmzZefbDcmwWqJWc2XT47q7Znw== + dependencies: + "@commitlint/types" "^18.6.1" + ajv "^8.11.0" + +"@commitlint/ensure@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-18.6.1.tgz#17141e083200ca94d8480dc23b0e8f8b1fd37b7f" + integrity sha512-BPm6+SspyxQ7ZTsZwXc7TRQL5kh5YWt3euKmEIBZnocMFkJevqs3fbLRb8+8I/cfbVcAo4mxRlpTPfz8zX7SnQ== + dependencies: + "@commitlint/types" "^18.6.1" + lodash.camelcase "^4.3.0" + lodash.kebabcase "^4.1.1" + lodash.snakecase "^4.1.1" + lodash.startcase "^4.4.0" + lodash.upperfirst "^4.3.1" + +"@commitlint/execute-rule@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-18.6.1.tgz#18175e043fe6fb5fceea7b8530316c644f93dfe6" + integrity sha512-7s37a+iWyJiGUeMFF6qBlyZciUkF8odSAnHijbD36YDctLhGKoYltdvuJ/AFfRm6cBLRtRk9cCVPdsEFtt/2rg== + +"@commitlint/format@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-18.6.1.tgz#5f2b8b3ae4d8d80bd9239178e97df63e5b8d280a" + integrity sha512-K8mNcfU/JEFCharj2xVjxGSF+My+FbUHoqR+4GqPGrHNqXOGNio47ziiR4HQUPKtiNs05o8/WyLBoIpMVOP7wg== + dependencies: + "@commitlint/types" "^18.6.1" + chalk "^4.1.0" + +"@commitlint/is-ignored@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-18.6.1.tgz#4ee08ba91ff3defb06e0ef19259a9c6734a8d06e" + integrity sha512-MOfJjkEJj/wOaPBw5jFjTtfnx72RGwqYIROABudOtJKW7isVjFe9j0t8xhceA02QebtYf4P/zea4HIwnXg8rvA== + dependencies: + "@commitlint/types" "^18.6.1" + semver "7.6.0" + +"@commitlint/lint@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-18.6.1.tgz#fe3834636c99ee14534a8eb3832831ac362e9fd8" + integrity sha512-8WwIFo3jAuU+h1PkYe5SfnIOzp+TtBHpFr4S8oJWhu44IWKuVx6GOPux3+9H1iHOan/rGBaiacicZkMZuluhfQ== + dependencies: + "@commitlint/is-ignored" "^18.6.1" + "@commitlint/parse" "^18.6.1" + "@commitlint/rules" "^18.6.1" + "@commitlint/types" "^18.6.1" + +"@commitlint/load@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-18.6.1.tgz#fb79ed7ee8b5897a9b5c274c1e24eda9162df816" + integrity sha512-p26x8734tSXUHoAw0ERIiHyW4RaI4Bj99D8YgUlVV9SedLf8hlWAfyIFhHRIhfPngLlCe0QYOdRKYFt8gy56TA== + dependencies: + "@commitlint/config-validator" "^18.6.1" + "@commitlint/execute-rule" "^18.6.1" + "@commitlint/resolve-extends" "^18.6.1" + "@commitlint/types" "^18.6.1" + chalk "^4.1.0" + cosmiconfig "^8.3.6" + cosmiconfig-typescript-loader "^5.0.0" + lodash.isplainobject "^4.0.6" + lodash.merge "^4.6.2" + lodash.uniq "^4.5.0" + resolve-from "^5.0.0" + +"@commitlint/message@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-18.6.1.tgz#107bd40923ad23d2de56c92a68b179ebfb7e314e" + integrity sha512-VKC10UTMLcpVjMIaHHsY1KwhuTQtdIKPkIdVEwWV+YuzKkzhlI3aNy6oo1eAN6b/D2LTtZkJe2enHmX0corYRw== + +"@commitlint/parse@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-18.6.1.tgz#2946b814125e907b9c4d63d3e71d0c1b54b30b62" + integrity sha512-eS/3GREtvVJqGZrwAGRwR9Gdno3YcZ6Xvuaa+vUF8j++wsmxrA2En3n0ccfVO2qVOLJC41ni7jSZhQiJpMPGOQ== + dependencies: + "@commitlint/types" "^18.6.1" + conventional-changelog-angular "^7.0.0" + conventional-commits-parser "^5.0.0" + +"@commitlint/read@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-18.6.1.tgz#8c138311ed9749427920c369f6276be136f2aa50" + integrity sha512-ia6ODaQFzXrVul07ffSgbZGFajpe8xhnDeLIprLeyfz3ivQU1dIoHp7yz0QIorZ6yuf4nlzg4ZUkluDrGN/J/w== + dependencies: + "@commitlint/top-level" "^18.6.1" + "@commitlint/types" "^18.6.1" + git-raw-commits "^2.0.11" + minimist "^1.2.6" + +"@commitlint/resolve-extends@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-18.6.1.tgz#f0572c682fc24dbabe2e0f42873261e0fa42c91a" + integrity sha512-ifRAQtHwK+Gj3Bxj/5chhc4L2LIc3s30lpsyW67yyjsETR6ctHAHRu1FSpt0KqahK5xESqoJ92v6XxoDRtjwEQ== + dependencies: + "@commitlint/config-validator" "^18.6.1" + "@commitlint/types" "^18.6.1" + import-fresh "^3.0.0" + lodash.mergewith "^4.6.2" + resolve-from "^5.0.0" + resolve-global "^1.0.0" + +"@commitlint/rules@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-18.6.1.tgz#da25aeffe6c0e1c7625e44f46089fb8860986caf" + integrity sha512-kguM6HxZDtz60v/zQYOe0voAtTdGybWXefA1iidjWYmyUUspO1zBPQEmJZ05/plIAqCVyNUTAiRPWIBKLCrGew== + dependencies: + "@commitlint/ensure" "^18.6.1" + "@commitlint/message" "^18.6.1" + "@commitlint/to-lines" "^18.6.1" + "@commitlint/types" "^18.6.1" + execa "^5.0.0" + +"@commitlint/to-lines@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-18.6.1.tgz#d28827a4a540c98eea1aae31dafd66f80b2f1b9e" + integrity sha512-Gl+orGBxYSNphx1+83GYeNy5N0dQsHBQ9PJMriaLQDB51UQHCVLBT/HBdOx5VaYksivSf5Os55TLePbRLlW50Q== + +"@commitlint/top-level@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-18.6.1.tgz#429fcb985e3beaba9b17e05c0ae61926c647baf0" + integrity sha512-HyiHQZUTf0+r0goTCDs/bbVv/LiiQ7AVtz6KIar+8ZrseB9+YJAIo8HQ2IC2QT1y3N1lbW6OqVEsTHjbT6hGSw== + dependencies: + find-up "^5.0.0" + +"@commitlint/types@^18.6.1": + version "18.6.1" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-18.6.1.tgz#7eb3ab2d799d9166fbb98b96b0744581e59a4ad4" + integrity sha512-gwRLBLra/Dozj2OywopeuHj2ac26gjGkz2cZ+86cTJOdtWfiRRr4+e77ZDAGc6MDWxaWheI+mAV5TLWWRwqrFg== + dependencies: + chalk "^4.1.0" + +"@cspell/cspell-bundled-dicts@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-8.7.0.tgz#dd8d671fc6b6900b0eec9180e24fa4e69f038829" + integrity sha512-B5YQI7Dd9m0JHTmHgs7PiyP4BWXzl8ixpK+HGOwhxzh7GyfFt1Eo/gxMxBDX/9SaewEzeb2OjRpRKEFtEsto3A== + dependencies: + "@cspell/dict-ada" "^4.0.2" + "@cspell/dict-aws" "^4.0.1" + "@cspell/dict-bash" "^4.1.3" + "@cspell/dict-companies" "^3.0.31" + "@cspell/dict-cpp" "^5.1.3" + "@cspell/dict-cryptocurrencies" "^5.0.0" + "@cspell/dict-csharp" "^4.0.2" + "@cspell/dict-css" "^4.0.12" + "@cspell/dict-dart" "^2.0.3" + "@cspell/dict-django" "^4.1.0" + "@cspell/dict-docker" "^1.1.7" + "@cspell/dict-dotnet" "^5.0.0" + "@cspell/dict-elixir" "^4.0.3" + "@cspell/dict-en-common-misspellings" "^2.0.0" + "@cspell/dict-en-gb" "1.1.33" + "@cspell/dict-en_us" "^4.3.17" + "@cspell/dict-filetypes" "^3.0.3" + "@cspell/dict-fonts" "^4.0.0" + "@cspell/dict-fsharp" "^1.0.1" + "@cspell/dict-fullstack" "^3.1.5" + "@cspell/dict-gaming-terms" "^1.0.5" + "@cspell/dict-git" "^3.0.0" + "@cspell/dict-golang" "^6.0.5" + "@cspell/dict-haskell" "^4.0.1" + "@cspell/dict-html" "^4.0.5" + "@cspell/dict-html-symbol-entities" "^4.0.0" + "@cspell/dict-java" "^5.0.6" + "@cspell/dict-julia" "^1.0.1" + "@cspell/dict-k8s" "^1.0.2" + "@cspell/dict-latex" "^4.0.0" + "@cspell/dict-lorem-ipsum" "^4.0.0" + "@cspell/dict-lua" "^4.0.3" + "@cspell/dict-makefile" "^1.0.0" + "@cspell/dict-monkeyc" "^1.0.6" + "@cspell/dict-node" "^4.0.3" + "@cspell/dict-npm" "^5.0.15" + "@cspell/dict-php" "^4.0.6" + "@cspell/dict-powershell" "^5.0.3" + "@cspell/dict-public-licenses" "^2.0.6" + "@cspell/dict-python" "^4.1.11" + "@cspell/dict-r" "^2.0.1" + "@cspell/dict-ruby" "^5.0.2" + "@cspell/dict-rust" "^4.0.2" + "@cspell/dict-scala" "^5.0.0" + "@cspell/dict-software-terms" "^3.3.18" + "@cspell/dict-sql" "^2.1.3" + "@cspell/dict-svelte" "^1.0.2" + "@cspell/dict-swift" "^2.0.1" + "@cspell/dict-terraform" "^1.0.0" + "@cspell/dict-typescript" "^3.1.2" + "@cspell/dict-vue" "^3.0.0" + +"@cspell/cspell-json-reporter@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@cspell/cspell-json-reporter/-/cspell-json-reporter-8.7.0.tgz#b51090a9e13e92605c6b47a7f53ffd7696a93741" + integrity sha512-LTQPEvXvCqnc+ok9WXpSISZyt4/nGse9fVEM430g0BpGzKpt3RMx49B8uasvvnanzCuikaW9+wFLmwgvraERhA== + dependencies: + "@cspell/cspell-types" "8.7.0" + +"@cspell/cspell-pipe@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@cspell/cspell-pipe/-/cspell-pipe-8.7.0.tgz#c257288880fdc2d5f1188a4c982bdce1ac46bfb0" + integrity sha512-ePqddIQ4arqPQgOkC146SkZxvZb9/jL7xIM5Igy2n3tiWTC5ijrX/mbHpPZ1VGcFck+1M0cJUuyhuJk+vMj3rg== + +"@cspell/cspell-resolver@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@cspell/cspell-resolver/-/cspell-resolver-8.7.0.tgz#4f067853f2a5fb65b766f9121f649a51d6b6b63e" + integrity sha512-grZwDFYqcBYQDaz4AkUtdyqc4UUH2J3/7yWVkBbYDPE+FQHa9ofFXzXxyjs56GJlPfi9ULpe5/Wz6uVLg8rQkQ== + dependencies: + global-directory "^4.0.1" + +"@cspell/cspell-service-bus@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@cspell/cspell-service-bus/-/cspell-service-bus-8.7.0.tgz#3f4f59072305b76e14da51e759ee6652eda37ed4" + integrity sha512-KW48iu0nTDzbedixc7iB7K7mlAZQ7QeMLuM/akxigOlvtOdVJrRa9Pfn44lwejts1ANb/IXil3GH8YylkVi76Q== + +"@cspell/cspell-types@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@cspell/cspell-types/-/cspell-types-8.7.0.tgz#3f6a2824d7059a45361ef6797ebbdd0ddd6a069f" + integrity sha512-Rb+LCE5I9JEb/LE8nSViVSF8z1CWv/z4mPBIG37VMa7aUx2gAQa6gJekNfpY9YZiMzx4Tv3gDujN80ytks4pGA== + +"@cspell/dict-ada@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-ada/-/dict-ada-4.0.2.tgz#8da2216660aeb831a0d9055399a364a01db5805a" + integrity sha512-0kENOWQeHjUlfyId/aCM/mKXtkEgV0Zu2RhUXCBr4hHo9F9vph+Uu8Ww2b0i5a4ZixoIkudGA+eJvyxrG1jUpA== + +"@cspell/dict-aws@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-aws/-/dict-aws-4.0.1.tgz#a0e758531ae81792b928a3f406618296291a658a" + integrity sha512-NXO+kTPQGqaaJKa4kO92NAXoqS+i99dQzf3/L1BxxWVSBS3/k1f3uhmqIh7Crb/n22W793lOm0D9x952BFga3Q== + +"@cspell/dict-bash@^4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-bash/-/dict-bash-4.1.3.tgz#25fba40825ac10083676ab2c777e471c3f71b36e" + integrity sha512-tOdI3QVJDbQSwPjUkOiQFhYcu2eedmX/PtEpVWg0aFps/r6AyjUQINtTgpqMYnYuq8O1QUIQqnpx21aovcgZCw== + +"@cspell/dict-companies@^3.0.31": + version "3.0.31" + resolved "https://registry.yarnpkg.com/@cspell/dict-companies/-/dict-companies-3.0.31.tgz#f0dacabc5308096c0f12db8a8b802ece604d6bf7" + integrity sha512-hKVpV/lcGKP4/DpEPS8P4osPvFH/YVLJaDn9cBIOH6/HSmL5LbFgJNKpMGaYRbhm2FEX56MKE3yn/MNeNYuesQ== + +"@cspell/dict-cpp@^5.1.3": + version "5.1.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-cpp/-/dict-cpp-5.1.3.tgz#c0c34ccdecc3ff954877a56dbbf07a7bf53b218e" + integrity sha512-sqnriXRAInZH9W75C+APBh6dtben9filPqVbIsiRMUXGg+s02ekz0z6LbS7kXeJ5mD2qXoMLBrv13qH2eIwutQ== + +"@cspell/dict-cryptocurrencies@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-5.0.0.tgz#19fbc7bdbec76ce64daf7d53a6d0f3cfff7d0038" + integrity sha512-Z4ARIw5+bvmShL+4ZrhDzGhnc9znaAGHOEMaB/GURdS/jdoreEDY34wdN0NtdLHDO5KO7GduZnZyqGdRoiSmYA== + +"@cspell/dict-csharp@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-csharp/-/dict-csharp-4.0.2.tgz#e55659dbe594e744d86b1baf0f3397fe57b1e283" + integrity sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g== + +"@cspell/dict-css@^4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@cspell/dict-css/-/dict-css-4.0.12.tgz#59abf3512ae729835c933c38f64a3d8a5f09ce3d" + integrity sha512-vGBgPM92MkHQF5/2jsWcnaahOZ+C6OE/fPvd5ScBP72oFY9tn5GLuomcyO0z8vWCr2e0nUSX1OGimPtcQAlvSw== + +"@cspell/dict-dart@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-dart/-/dict-dart-2.0.3.tgz#75e7ffe47d5889c2c831af35acdd92ebdbd4cf12" + integrity sha512-cLkwo1KT5CJY5N5RJVHks2genFkNCl/WLfj+0fFjqNR+tk3tBI1LY7ldr9piCtSFSm4x9pO1x6IV3kRUY1lLiw== + +"@cspell/dict-data-science@^1.0.11": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@cspell/dict-data-science/-/dict-data-science-1.0.11.tgz#4eabba75c21d27253c1114b4fbbade0ead739ffc" + integrity sha512-TaHAZRVe0Zlcc3C23StZqqbzC0NrodRwoSAc8dis+5qLeLLnOCtagYQeROQvDlcDg3X/VVEO9Whh4W/z4PAmYQ== + +"@cspell/dict-django@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-django/-/dict-django-4.1.0.tgz#2d4b765daf3c83e733ef3e06887ea34403a4de7a" + integrity sha512-bKJ4gPyrf+1c78Z0Oc4trEB9MuhcB+Yg+uTTWsvhY6O2ncFYbB/LbEZfqhfmmuK/XJJixXfI1laF2zicyf+l0w== + +"@cspell/dict-docker@^1.1.7": + version "1.1.7" + resolved "https://registry.yarnpkg.com/@cspell/dict-docker/-/dict-docker-1.1.7.tgz#bcf933283fbdfef19c71a642e7e8c38baf9014f2" + integrity sha512-XlXHAr822euV36GGsl2J1CkBIVg3fZ6879ZOg5dxTIssuhUOCiV2BuzKZmt6aIFmcdPmR14+9i9Xq+3zuxeX0A== + +"@cspell/dict-dotnet@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-dotnet/-/dict-dotnet-5.0.0.tgz#13690aafe14b240ad17a30225ac1ec29a5a6a510" + integrity sha512-EOwGd533v47aP5QYV8GlSSKkmM9Eq8P3G/eBzSpH3Nl2+IneDOYOBLEUraHuiCtnOkNsz0xtZHArYhAB2bHWAw== + +"@cspell/dict-elixir@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-elixir/-/dict-elixir-4.0.3.tgz#57c25843e46cf3463f97da72d9ef8e37c818296f" + integrity sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q== + +"@cspell/dict-en-common-misspellings@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.0.0.tgz#708f424d75dc65237a6fcb8d253bc1e7ab641380" + integrity sha512-NOg8dlv37/YqLkCfBs5OXeJm/Wcfb/CzeOmOZJ2ZXRuxwsNuolb4TREUce0yAXRqMhawahY5TSDRJJBgKjBOdw== + +"@cspell/dict-en-gb@1.1.33": + version "1.1.33" + resolved "https://registry.yarnpkg.com/@cspell/dict-en-gb/-/dict-en-gb-1.1.33.tgz#7f1fd90fc364a5cb77111b5438fc9fcf9cc6da0e" + integrity sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g== + +"@cspell/dict-en_us@^4.3.17": + version "4.3.19" + resolved "https://registry.yarnpkg.com/@cspell/dict-en_us/-/dict-en_us-4.3.19.tgz#ba79bed9cee82fdc9f76d03e85b8f07ea655c322" + integrity sha512-tHcXdkmm0t9LlRct1vgu3+h0KW/wlXCInkTiR4D/rl730q1zu2qVEgiy1saMiTUSNmdu7Hiy+Mhb+1braVqnZQ== + +"@cspell/dict-filetypes@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-filetypes/-/dict-filetypes-3.0.3.tgz#ab0723ca2f4d3d5674e9c9745efc9f144e49c905" + integrity sha512-J9UP+qwwBLfOQ8Qg9tAsKtSY/WWmjj21uj6zXTI9hRLD1eG1uUOLcfVovAmtmVqUWziPSKMr87F6SXI3xmJXgw== + +"@cspell/dict-fonts@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-fonts/-/dict-fonts-4.0.0.tgz#9bc8beb2a7b068b4fdb45cb994b36fd184316327" + integrity sha512-t9V4GeN/m517UZn63kZPUYP3OQg5f0OBLSd3Md5CU3eH1IFogSvTzHHnz4Wqqbv8NNRiBZ3HfdY/pqREZ6br3Q== + +"@cspell/dict-fsharp@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-fsharp/-/dict-fsharp-1.0.1.tgz#d62c699550a39174f182f23c8c1330a795ab5f53" + integrity sha512-23xyPcD+j+NnqOjRHgW3IU7Li912SX9wmeefcY0QxukbAxJ/vAN4rBpjSwwYZeQPAn3fxdfdNZs03fg+UM+4yQ== + +"@cspell/dict-fullstack@^3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@cspell/dict-fullstack/-/dict-fullstack-3.1.5.tgz#35d18678161f214575cc613dd95564e05422a19c" + integrity sha512-6ppvo1dkXUZ3fbYn/wwzERxCa76RtDDl5Afzv2lijLoijGGUw5yYdLBKJnx8PJBGNLh829X352ftE7BElG4leA== + +"@cspell/dict-gaming-terms@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.0.5.tgz#d6ca40eb34a4c99847fd58a7354cd2c651065156" + integrity sha512-C3riccZDD3d9caJQQs1+MPfrUrQ+0KHdlj9iUR1QD92FgTOF6UxoBpvHUUZ9YSezslcmpFQK4xQQ5FUGS7uWfw== + +"@cspell/dict-git@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-git/-/dict-git-3.0.0.tgz#c275af86041a2b59a7facce37525e2af05653b95" + integrity sha512-simGS/lIiXbEaqJu9E2VPoYW1OTC2xrwPPXNXFMa2uo/50av56qOuaxDrZ5eH1LidFXwoc8HROCHYeKoNrDLSw== + +"@cspell/dict-golang@^6.0.5": + version "6.0.5" + resolved "https://registry.yarnpkg.com/@cspell/dict-golang/-/dict-golang-6.0.5.tgz#4dd2e2fda419730a21fb77ade3b90241ad4a5bcc" + integrity sha512-w4mEqGz4/wV+BBljLxduFNkMrd3rstBNDXmoX5kD4UTzIb4Sy0QybWCtg2iVT+R0KWiRRA56QKOvBsgXiddksA== + +"@cspell/dict-haskell@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-haskell/-/dict-haskell-4.0.1.tgz#e9fca7c452411ff11926e23ffed2b50bb9b95e47" + integrity sha512-uRrl65mGrOmwT7NxspB4xKXFUenNC7IikmpRZW8Uzqbqcu7ZRCUfstuVH7T1rmjRgRkjcIjE4PC11luDou4wEQ== + +"@cspell/dict-html-symbol-entities@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.0.tgz#4d86ac18a4a11fdb61dfb6f5929acd768a52564f" + integrity sha512-HGRu+48ErJjoweR5IbcixxETRewrBb0uxQBd6xFGcxbEYCX8CnQFTAmKI5xNaIt2PKaZiJH3ijodGSqbKdsxhw== + +"@cspell/dict-html@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@cspell/dict-html/-/dict-html-4.0.5.tgz#03a5182148d80e6c25f71339dbb2b7c5b9894ef8" + integrity sha512-p0brEnRybzSSWi8sGbuVEf7jSTDmXPx7XhQUb5bgG6b54uj+Z0Qf0V2n8b/LWwIPJNd1GygaO9l8k3HTCy1h4w== + +"@cspell/dict-java@^5.0.6": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@cspell/dict-java/-/dict-java-5.0.6.tgz#2462d6fc15f79ec15eb88ecf875b6ad2a7bf7a6a" + integrity sha512-kdE4AHHHrixyZ5p6zyms1SLoYpaJarPxrz8Tveo6gddszBVVwIUZ+JkQE1bWNLK740GWzIXdkznpUfw1hP9nXw== + +"@cspell/dict-julia@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-julia/-/dict-julia-1.0.1.tgz#900001417f1c4ea689530adfcc034c848458a0aa" + integrity sha512-4JsCLCRhhLMLiaHpmR7zHFjj1qOauzDI5ZzCNQS31TUMfsOo26jAKDfo0jljFAKgw5M2fEG7sKr8IlPpQAYrmQ== + +"@cspell/dict-k8s@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-k8s/-/dict-k8s-1.0.2.tgz#b19e66f4ac8a4264c0f3981ac6e23e88a60f1c91" + integrity sha512-tLT7gZpNPnGa+IIFvK9SP1LrSpPpJ94a/DulzAPOb1Q2UBFwdpFd82UWhio0RNShduvKG/WiMZf/wGl98pn+VQ== + +"@cspell/dict-latex@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-latex/-/dict-latex-4.0.0.tgz#85054903db834ea867174795d162e2a8f0e9c51e" + integrity sha512-LPY4y6D5oI7D3d+5JMJHK/wxYTQa2lJMSNxps2JtuF8hbAnBQb3igoWEjEbIbRRH1XBM0X8dQqemnjQNCiAtxQ== + +"@cspell/dict-lorem-ipsum@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-4.0.0.tgz#2793a5dbfde474a546b0caecc40c38fdf076306e" + integrity sha512-1l3yjfNvMzZPibW8A7mQU4kTozwVZVw0AvFEdy+NcqtbxH+TvbSkNMqROOFWrkD2PjnKG0+Ea0tHI2Pi6Gchnw== + +"@cspell/dict-lua@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-lua/-/dict-lua-4.0.3.tgz#2d23c8f7e74b4e62000678d80e7d1ebb10b003e0" + integrity sha512-lDHKjsrrbqPaea13+G9s0rtXjMO06gPXPYRjRYawbNmo4E/e3XFfVzeci3OQDQNDmf2cPOwt9Ef5lu2lDmwfJg== + +"@cspell/dict-makefile@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-makefile/-/dict-makefile-1.0.0.tgz#5afb2910873ebbc01ab8d9c38661c4c93d0e5a40" + integrity sha512-3W9tHPcSbJa6s0bcqWo6VisEDTSN5zOtDbnPabF7rbyjRpNo0uHXHRJQF8gAbFzoTzBBhgkTmrfSiuyQm7vBUQ== + +"@cspell/dict-monkeyc@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@cspell/dict-monkeyc/-/dict-monkeyc-1.0.6.tgz#042d042fc34a20194c8de032130808f44b241375" + integrity sha512-oO8ZDu/FtZ55aq9Mb67HtaCnsLn59xvhO/t2mLLTHAp667hJFxpp7bCtr2zOrR1NELzFXmKln/2lw/PvxMSvrA== + +"@cspell/dict-node@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-node/-/dict-node-4.0.3.tgz#5ae0222d72871e82978049f8e11ea627ca42fca3" + integrity sha512-sFlUNI5kOogy49KtPg8SMQYirDGIAoKBO3+cDLIwD4MLdsWy1q0upc7pzGht3mrjuyMiPRUV14Bb0rkVLrxOhg== + +"@cspell/dict-npm@^5.0.15": + version "5.0.15" + resolved "https://registry.yarnpkg.com/@cspell/dict-npm/-/dict-npm-5.0.15.tgz#c1d1646011fd0eb8ee119b481818a92223c459d1" + integrity sha512-sX0X5YWNW54F4baW7b5JJB6705OCBIZtUqjOghlJNORS5No7QY1IX1zc5FxNNu4gsaCZITAmfMi4ityXEsEThA== + +"@cspell/dict-php@^4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@cspell/dict-php/-/dict-php-4.0.6.tgz#fcdee4d850f279b2757eb55c4f69a3a221ac1f7e" + integrity sha512-ySAXisf7twoVFZqBV2o/DKiCLIDTHNqfnj0EfH9OoOUR7HL3rb6zJkm0viLUFDO2G/8SyIi6YrN/6KX+Scjjjg== + +"@cspell/dict-powershell@^5.0.3": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-powershell/-/dict-powershell-5.0.3.tgz#7bceb4e7db39f87479a6d2af3a033ce26796ae49" + integrity sha512-lEdzrcyau6mgzu1ie98GjOEegwVHvoaWtzQnm1ie4DyZgMr+N6D0Iyj1lzvtmt0snvsDFa5F2bsYzf3IMKcpcA== + +"@cspell/dict-public-licenses@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.6.tgz#e6ac8e5cb3b0ef8503d67da14435ae86a875b6cc" + integrity sha512-bHqpSpJvLCUcWxj1ov/Ki8WjmESpYwRpQlqfdchekOTc93Huhvjm/RXVN1R4fVf4Hspyem1QVkCGqAmjJMj6sw== + +"@cspell/dict-python@^4.1.11": + version "4.1.11" + resolved "https://registry.yarnpkg.com/@cspell/dict-python/-/dict-python-4.1.11.tgz#4e339def01bf468b32d459c46ecb6894970b7eb8" + integrity sha512-XG+v3PumfzUW38huSbfT15Vqt3ihNb462ulfXifpQllPok5OWynhszCLCRQjQReV+dgz784ST4ggRxW452/kVg== + dependencies: + "@cspell/dict-data-science" "^1.0.11" + +"@cspell/dict-r@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-r/-/dict-r-2.0.1.tgz#73474fb7cce45deb9094ebf61083fbf5913f440a" + integrity sha512-KCmKaeYMLm2Ip79mlYPc8p+B2uzwBp4KMkzeLd5E6jUlCL93Y5Nvq68wV5fRLDRTf7N1LvofkVFWfDcednFOgA== + +"@cspell/dict-ruby@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-ruby/-/dict-ruby-5.0.2.tgz#cf1a71380c633dec0857143d3270cb503b10679a" + integrity sha512-cIh8KTjpldzFzKGgrqUX4bFyav5lC52hXDKo4LbRuMVncs3zg4hcSf4HtURY+f2AfEZzN6ZKzXafQpThq3dl2g== + +"@cspell/dict-rust@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-rust/-/dict-rust-4.0.2.tgz#e9111f0105ee6d836a1be8314f47347fd9f8fc3a" + integrity sha512-RhziKDrklzOntxAbY3AvNR58wnFGIo3YS8+dNeLY36GFuWOvXDHFStYw5Pod4f/VXbO/+1tXtywCC4zWfB2p1w== + +"@cspell/dict-scala@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-scala/-/dict-scala-5.0.0.tgz#b64365ad559110a36d44ccd90edf7151ea648022" + integrity sha512-ph0twaRoV+ylui022clEO1dZ35QbeEQaKTaV2sPOsdwIokABPIiK09oWwGK9qg7jRGQwVaRPEq0Vp+IG1GpqSQ== + +"@cspell/dict-software-terms@^3.3.18": + version "3.3.20" + resolved "https://registry.yarnpkg.com/@cspell/dict-software-terms/-/dict-software-terms-3.3.20.tgz#ced0152f99228d697ab177b095f242ea73edfad2" + integrity sha512-KmPwCxYWEu7SGyT/0m/n6i6R4ZgxbmN3XcerzA6Z629Wm5iZTVfJaMWqDK2RKAyBawS7OMfxGz0W/wYU4FhJlA== + +"@cspell/dict-sql@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-sql/-/dict-sql-2.1.3.tgz#8d9666a82e35b310d0be4064032c0d891fbd2702" + integrity sha512-SEyTNKJrjqD6PAzZ9WpdSu6P7wgdNtGV2RV8Kpuw1x6bV+YsSptuClYG+JSdRExBTE6LwIe1bTklejUp3ZP8TQ== + +"@cspell/dict-svelte@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-svelte/-/dict-svelte-1.0.2.tgz#0c866b08a7a6b33bbc1a3bdbe6a1b484ca15cdaa" + integrity sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q== + +"@cspell/dict-swift@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-swift/-/dict-swift-2.0.1.tgz#06ec86e52e9630c441d3c19605657457e33d7bb6" + integrity sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw== + +"@cspell/dict-terraform@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-terraform/-/dict-terraform-1.0.0.tgz#c7b073bb3a03683f64cc70ccaa55ce9742c46086" + integrity sha512-Ak+vy4HP/bOgzf06BAMC30+ZvL9mzv21xLM2XtfnBLTDJGdxlk/nK0U6QT8VfFLqJ0ZZSpyOxGsUebWDCTr/zQ== + +"@cspell/dict-typescript@^3.1.2": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-typescript/-/dict-typescript-3.1.4.tgz#65a7d4a00f17ad61300864e17ae3d2bcf2c2d57d" + integrity sha512-jUcPa0rsPca5ur1+G56DXnSc5hbbJkzvPHHvyQtkbPXBQd3CXPMNfrTVCgzex/7cY/7FONcpFCUwgwfni9Jqbw== + +"@cspell/dict-vue@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-vue/-/dict-vue-3.0.0.tgz#68ccb432ad93fcb0fd665352d075ae9a64ea9250" + integrity sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A== + +"@cspell/dynamic-import@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@cspell/dynamic-import/-/dynamic-import-8.7.0.tgz#5a758d63e080686459d4116a5e89c591038ad02a" + integrity sha512-xlEPdiHVDu+4xYkvwjL9MgklxOi9XB+Pr1H9s3Ww9WEq+q6BA3xOHxLIU/k8mhqFTMZGFZRCsdy/EwMu6SyRhQ== + dependencies: + import-meta-resolve "^4.0.0" + +"@cspell/strong-weak-map@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@cspell/strong-weak-map/-/strong-weak-map-8.7.0.tgz#f003680002c59f44aa63f223ae1056ffe5f51875" + integrity sha512-0bo0WwDr2lzGoCP7vbpWbDpPyuOrHKK+218txnUpx6Pn1EDBLfcDQsiZED5B6zlpwgbGi6y3vc0rWtJbjKvwzg== + +"@cspotcode/source-map-support@0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@ericcornelissen/bash-parser@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@ericcornelissen/bash-parser/-/bash-parser-0.5.2.tgz#5eb3bc52020d97fbaebc63b5168ca0aa0b2e8418" + integrity sha512-4pIMTa1nEFfMXitv7oaNEWOdM+zpOZavesa5GaiWTgda6Zk32CFGxjUp/iIaN0PwgUW1yTq/fztSjbpE8SLGZQ== + dependencies: + array-last "^1.1.1" + babylon "^6.9.1" + compose-function "^3.0.3" + deep-freeze "0.0.1" + filter-iterator "0.0.1" + filter-obj "^1.1.0" + has-own-property "^0.1.0" + identity-function "^1.0.0" + is-iterable "^1.1.0" + iterable-lookahead "^1.0.0" + lodash.curry "^4.1.1" + magic-string "^0.16.0" + map-obj "^2.0.0" + object-pairs "^0.1.0" + object-values "^1.0.0" + reverse-arguments "^1.0.0" + shell-quote-word "^1.0.1" + to-pascal-case "^1.0.0" + unescape-js "^1.0.5" + +"@esbuild-plugins/node-globals-polyfill@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz#0e4497a2b53c9e9485e149bc92ddb228438d6bcf" + integrity sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw== + +"@esbuild-plugins/node-modules-polyfill@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz#cefa3dc0bd1c16277a8338b52833420c94987327" + integrity sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA== + dependencies: + escape-string-regexp "^4.0.0" + rollup-plugin-node-polyfills "^0.2.1" + +"@esbuild/aix-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" + integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== + +"@esbuild/aix-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" + integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== + +"@esbuild/android-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd" + integrity sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA== + +"@esbuild/android-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" + integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== + +"@esbuild/android-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" + integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== + +"@esbuild/android-arm@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.19.tgz#5898f7832c2298bc7d0ab53701c57beb74d78b4d" + integrity sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A== + +"@esbuild/android-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" + integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== + +"@esbuild/android-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" + integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== + +"@esbuild/android-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.19.tgz#658368ef92067866d95fb268719f98f363d13ae1" + integrity sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww== + +"@esbuild/android-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" + integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== + +"@esbuild/android-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" + integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== + +"@esbuild/darwin-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz#584c34c5991b95d4d48d333300b1a4e2ff7be276" + integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg== + +"@esbuild/darwin-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" + integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== + +"@esbuild/darwin-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" + integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== + +"@esbuild/darwin-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb" + integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw== + +"@esbuild/darwin-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" + integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== + +"@esbuild/darwin-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" + integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== + +"@esbuild/freebsd-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz#cacd171665dd1d500f45c167d50c6b7e539d5fd2" + integrity sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ== + +"@esbuild/freebsd-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" + integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== + +"@esbuild/freebsd-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" + integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== + +"@esbuild/freebsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz#0769456eee2a08b8d925d7c00b79e861cb3162e4" + integrity sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ== + +"@esbuild/freebsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" + integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== + +"@esbuild/freebsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" + integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== + +"@esbuild/linux-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz#38e162ecb723862c6be1c27d6389f48960b68edb" + integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg== + +"@esbuild/linux-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" + integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== + +"@esbuild/linux-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" + integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== + +"@esbuild/linux-arm@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz#1a2cd399c50040184a805174a6d89097d9d1559a" + integrity sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA== + +"@esbuild/linux-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" + integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== + +"@esbuild/linux-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" + integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== + +"@esbuild/linux-ia32@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz#e28c25266b036ce1cabca3c30155222841dc035a" + integrity sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ== + +"@esbuild/linux-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" + integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== + +"@esbuild/linux-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" + integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== + +"@esbuild/linux-loong64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz#0f887b8bb3f90658d1a0117283e55dbd4c9dcf72" + integrity sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ== + +"@esbuild/linux-loong64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" + integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== + +"@esbuild/linux-loong64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" + integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== + +"@esbuild/linux-mips64el@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz#f5d2a0b8047ea9a5d9f592a178ea054053a70289" + integrity sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A== + +"@esbuild/linux-mips64el@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" + integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== + +"@esbuild/linux-mips64el@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" + integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== + +"@esbuild/linux-ppc64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz#876590e3acbd9fa7f57a2c7d86f83717dbbac8c7" + integrity sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg== + +"@esbuild/linux-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" + integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== + +"@esbuild/linux-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" + integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== + +"@esbuild/linux-riscv64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz#7f49373df463cd9f41dc34f9b2262d771688bf09" + integrity sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA== + +"@esbuild/linux-riscv64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" + integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== + +"@esbuild/linux-riscv64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" + integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== + +"@esbuild/linux-s390x@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz#e2afd1afcaf63afe2c7d9ceacd28ec57c77f8829" + integrity sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q== + +"@esbuild/linux-s390x@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" + integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== + +"@esbuild/linux-s390x@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" + integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== + +"@esbuild/linux-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4" + integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw== + +"@esbuild/linux-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" + integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== + +"@esbuild/linux-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" + integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== + +"@esbuild/netbsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz#c29fb2453c6b7ddef9a35e2c18b37bda1ae5c462" + integrity sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q== + +"@esbuild/netbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" + integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== + +"@esbuild/netbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" + integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== + +"@esbuild/openbsd-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz#95e75a391403cb10297280d524d66ce04c920691" + integrity sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g== + +"@esbuild/openbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" + integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== + +"@esbuild/openbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" + integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== + +"@esbuild/sunos-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz#722eaf057b83c2575937d3ffe5aeb16540da7273" + integrity sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg== + +"@esbuild/sunos-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" + integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== + +"@esbuild/sunos-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" + integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== + +"@esbuild/win32-arm64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz#9aa9dc074399288bdcdd283443e9aeb6b9552b6f" + integrity sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag== + +"@esbuild/win32-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" + integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== + +"@esbuild/win32-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" + integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== + +"@esbuild/win32-ia32@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz#95ad43c62ad62485e210f6299c7b2571e48d2b03" + integrity sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw== + +"@esbuild/win32-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" + integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== + +"@esbuild/win32-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" + integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== + +"@esbuild/win32-x64@0.17.19": + version "0.17.19" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz#8cfaf2ff603e9aabb910e9c0558c26cf32744061" + integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA== + +"@esbuild/win32-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" + integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== + +"@esbuild/win32-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" + integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + 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== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/contracts@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/solidity@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/units@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/wallet@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/json-wallets" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@fastify/busboy@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" + integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== + +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@noble/curves@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" + integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== + dependencies: + "@noble/hashes" "1.3.2" + +"@noble/hashes@1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" + integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.scandir@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-3.0.0.tgz#91c0a33e1aeaedcd4bab2bf31be5d1962a55d2a7" + integrity sha512-ktI9+PxfHYtKjF3cLTUAh2N+b8MijCRPNwKJNqTVdL0gB0QxLU2rIRaZ1t71oEa3YBDE6bukH1sR0+CDnpp/Mg== + dependencies: + "@nodelib/fs.stat" "3.0.0" + run-parallel "^1.2.0" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.stat@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-3.0.0.tgz#ef6c829f2b05f42595d88854ebd777d4335ff0a9" + integrity sha512-2tQOI38s19P9i7X/Drt0v8iMA+KMsgdhB/dyPER+e+2Y8L1Z7QvnuRdW/uLuf5YRFUYmnj4bMA6qCuZHFI1GDQ== + +"@nodelib/fs.walk@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-2.0.0.tgz#10499ac2210f6399770b465ba728adafc7d44bb1" + integrity sha512-54voNDBobGdMl3BUXSu7UaDh1P85PGHWlJ5e0XhPugo1JulOyCtp2I+5ri4wplGDJ8QGwPEQW7/x3yTLU7yF1A== + dependencies: + "@nodelib/fs.scandir" "3.0.0" + fastq "^1.15.0" + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@octokit/auth-token@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-4.0.0.tgz#40d203ea827b9f17f42a29c6afb93b7745ef80c7" + integrity sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA== + +"@octokit/core@^5.0.1", "@octokit/core@^5.0.2": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-5.2.0.tgz#ddbeaefc6b44a39834e1bb2e58a49a117672a7ea" + integrity sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg== + dependencies: + "@octokit/auth-token" "^4.0.0" + "@octokit/graphql" "^7.1.0" + "@octokit/request" "^8.3.1" + "@octokit/request-error" "^5.1.0" + "@octokit/types" "^13.0.0" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" + +"@octokit/endpoint@^9.0.1": + version "9.0.5" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.5.tgz#e6c0ee684e307614c02fc6ac12274c50da465c44" + integrity sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw== + dependencies: + "@octokit/types" "^13.1.0" + universal-user-agent "^6.0.0" + +"@octokit/graphql@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-7.1.0.tgz#9bc1c5de92f026648131f04101cab949eeffe4e0" + integrity sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ== + dependencies: + "@octokit/request" "^8.3.0" + "@octokit/types" "^13.0.0" + universal-user-agent "^6.0.0" + +"@octokit/openapi-types@^20.0.0": + version "20.0.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-20.0.0.tgz#9ec2daa0090eeb865ee147636e0c00f73790c6e5" + integrity sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA== + +"@octokit/openapi-types@^22.1.0": + version "22.1.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-22.1.0.tgz#6aa72f35fb29318064e4ab60972f40429857eb2e" + integrity sha512-pGUdSP+eEPfZiQHNkZI0U01HLipxncisdJQB4G//OAmfeO8sqTQ9KRa0KF03TUPCziNsoXUrTg4B2Q1EX++T0Q== + +"@octokit/openapi-webhooks-types@8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-webhooks-types/-/openapi-webhooks-types-8.2.0.tgz#fcba190aca76fe6f2d1175fbb975c5b469d773fd" + integrity sha512-qz6pDWvEMF4+BQQw82bqQxeyc5CpMMpIXfxkGhymmEfH43FF4ZWzR4FUSMGSUt/MYO4M2P08JZGwReC3k+g7iQ== + +"@octokit/plugin-paginate-rest@^9.0.0", "@octokit/plugin-paginate-rest@^9.1.5": + version "9.2.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.1.tgz#2e2a2f0f52c9a4b1da1a3aa17dabe3c459b9e401" + integrity sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw== + dependencies: + "@octokit/types" "^12.6.0" + +"@octokit/plugin-request-log@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz#98a3ca96e0b107380664708111864cb96551f958" + integrity sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA== + +"@octokit/plugin-rest-endpoint-methods@^10.0.0", "@octokit/plugin-rest-endpoint-methods@^10.2.0": + version "10.4.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz#41ba478a558b9f554793075b2e20cd2ef973be17" + integrity sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg== + dependencies: + "@octokit/types" "^12.6.0" + +"@octokit/request-error@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-5.1.0.tgz#ee4138538d08c81a60be3f320cd71063064a3b30" + integrity sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q== + dependencies: + "@octokit/types" "^13.1.0" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request-error@^6.0.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-6.1.1.tgz#bed1b5f52ce7fefb1077a92bf42124ff36f73f2c" + integrity sha512-1mw1gqT3fR/WFvnoVpY/zUM2o/XkMs/2AszUUG9I69xn0JFLv6PGkPhNk5lbfvROs79wiS0bqiJNxfCZcRJJdg== + dependencies: + "@octokit/types" "^13.0.0" + +"@octokit/request@^8.3.0", "@octokit/request@^8.3.1": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.4.0.tgz#7f4b7b1daa3d1f48c0977ad8fffa2c18adef8974" + integrity sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw== + dependencies: + "@octokit/endpoint" "^9.0.1" + "@octokit/request-error" "^5.1.0" + "@octokit/types" "^13.1.0" + universal-user-agent "^6.0.0" + +"@octokit/rest@^20.0.2": + version "20.1.0" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-20.1.0.tgz#78310528f4849a69b44b15ccd27f99c7e737bb7d" + integrity sha512-STVO3itHQLrp80lvcYB2UIKoeil5Ctsgd2s1AM+du3HqZIR35ZH7WE9HLwUOLXH0myA0y3AGNPo8gZtcgIbw0g== + dependencies: + "@octokit/core" "^5.0.2" + "@octokit/plugin-paginate-rest" "^9.1.5" + "@octokit/plugin-request-log" "^4.0.0" + "@octokit/plugin-rest-endpoint-methods" "^10.2.0" + +"@octokit/types@^12.6.0": + version "12.6.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.6.0.tgz#8100fb9eeedfe083aae66473bd97b15b62aedcb2" + integrity sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw== + dependencies: + "@octokit/openapi-types" "^20.0.0" + +"@octokit/types@^13.0.0", "@octokit/types@^13.1.0": + version "13.4.1" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.4.1.tgz#ad3574488cce6792e5d981a1bdf4b694e1ca349f" + integrity sha512-Y73oOAzRBAUzR/iRAbGULzpNkX8vaxKCqEtg6K74Ff3w9f5apFnWtE/2nade7dMWWW3bS5Kkd6DJS4HF04xreg== + dependencies: + "@octokit/openapi-types" "^22.1.0" + +"@octokit/webhooks-methods@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@octokit/webhooks-methods/-/webhooks-methods-5.1.0.tgz#13b6c08f89902c1ab0ddf31c6eeeec9c2772cfe6" + integrity sha512-yFZa3UH11VIxYnnoOYCVoJ3q4ChuSOk2IVBBQ0O3xtKX4x9bmKb/1t+Mxixv2iUhzMdOl1qeWJqEhouXXzB3rQ== + +"@octokit/webhooks@^13.1.0": + version "13.2.5" + resolved "https://registry.yarnpkg.com/@octokit/webhooks/-/webhooks-13.2.5.tgz#23a37dab63c5a010a39d15479a0d57109e38ccbd" + integrity sha512-bud7g8nKdWsTM00ng8AkDNzR//2M52Lnz0FriqIoGh1vb/zSr9dwccFINdVrEbJPgmIaFtoRn0lYazoO8IIK1Q== + dependencies: + "@octokit/openapi-webhooks-types" "8.2.0" + "@octokit/request-error" "^6.0.1" + "@octokit/webhooks-methods" "^5.0.0" + aggregate-error "^5.0.0" + +"@sinclair/typebox@^0.32.15", "@sinclair/typebox@^0.32.5": + version "0.32.23" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.32.23.tgz#18419f3a276da4e7f26300497c1537848727778b" + integrity sha512-NiMhEgFo5nDlg39HDEvETDdXmURfyd8ougIjynebGebZti/gZ4LxoCcbVS6jgfNF8Sf7ZvPVl/fV0YsJIW4ltg== + +"@snyk/github-codeowners@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@snyk/github-codeowners/-/github-codeowners-1.1.0.tgz#45b99732c3c38b5f5b47e43d2b0c9db67a6d2bcc" + integrity sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw== + dependencies: + commander "^4.1.1" + ignore "^5.1.8" + p-map "^4.0.0" + +"@supabase/auth-js@2.63.0": + version "2.63.0" + resolved "https://registry.yarnpkg.com/@supabase/auth-js/-/auth-js-2.63.0.tgz#41ff746a50a916208c1f2c6898deacf92c6d0b91" + integrity sha512-yIgcHnlgv24GxHtVGUhwGqAFDyJkPIC/xjx7HostN08A8yCy8HIfl4JEkTKyBqD1v1L05jNEJOUke4Lf4O1+Qg== + dependencies: + "@supabase/node-fetch" "^2.6.14" + +"@supabase/auth-js@2.63.1": + version "2.63.1" + resolved "https://registry.yarnpkg.com/@supabase/auth-js/-/auth-js-2.63.1.tgz#1d6178256d1502ae5c4707e4e18baa8fb119799e" + integrity sha512-iwdmIc/w5QN7aMfYThEgUt1l2i0KuohZ4XNk1adECg0LETQYEzmbVToKFKZLLZ+GyNtpsExSgVY/AUWOwubGXA== + dependencies: + "@supabase/node-fetch" "^2.6.14" + +"@supabase/functions-js@2.2.2": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@supabase/functions-js/-/functions-js-2.2.2.tgz#53a22d9f1fc770d96c9ad8c9dba5eda339b305f5" + integrity sha512-sJGq1nludmi7pY/fdtCpyY/pYonx7MfHdN408bqb736guWcVI1AChYVbI4kUM978EuOE4Ci6l7bUudfGg07QRw== + dependencies: + "@supabase/node-fetch" "^2.6.14" + +"@supabase/functions-js@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@supabase/functions-js/-/functions-js-2.3.0.tgz#1aeef35cfb5ea608e5ac23e8b1f0614ffe3008a4" + integrity sha512-GPXzSl4MXdc0P7q+TvE8XgaPdvGBeAJ0p6AN0tbKcezpkp32mpsDf58JXaWOJGyiWSVJn6z1W73eKxf6NZNaFA== + dependencies: + "@supabase/node-fetch" "^2.6.14" + +"@supabase/node-fetch@2.6.15", "@supabase/node-fetch@^2.6.14": + version "2.6.15" + resolved "https://registry.yarnpkg.com/@supabase/node-fetch/-/node-fetch-2.6.15.tgz#731271430e276983191930816303c44159e7226c" + integrity sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ== + dependencies: + whatwg-url "^5.0.0" + +"@supabase/postgrest-js@1.15.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@supabase/postgrest-js/-/postgrest-js-1.15.0.tgz#2218c8885a596835b85971f09ea87d1d8353c0c5" + integrity sha512-U4bwBOrhsXWqDjZiYNbVqMBtRGgIIYE0kE5ZNSwsIbeBWfr/UxOMrnkIQUBGIZRhpYW/tw1WnTdRl1AGNyaxcw== + dependencies: + "@supabase/node-fetch" "^2.6.14" + +"@supabase/postgrest-js@1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@supabase/postgrest-js/-/postgrest-js-1.15.2.tgz#c0a725706e3d534570d014d7b713cea12553ab98" + integrity sha512-9/7pUmXExvGuEK1yZhVYXPZnLEkDTwxgMQHXLrN5BwPZZm4iUCL1YEyep/Z2lIZah8d8M433mVAUEGsihUj5KQ== + dependencies: + "@supabase/node-fetch" "^2.6.14" + +"@supabase/realtime-js@2.9.3": + version "2.9.3" + resolved "https://registry.yarnpkg.com/@supabase/realtime-js/-/realtime-js-2.9.3.tgz#f822401aed70883dca5d538179b11089d6d1b6ed" + integrity sha512-lAp50s2n3FhGJFq+wTSXLNIDPw5Y0Wxrgt44eM5nLSA3jZNUUP3Oq2Ccd1CbZdVntPCWLZvJaU//pAd2NE+QnQ== + dependencies: + "@supabase/node-fetch" "^2.6.14" + "@types/phoenix" "^1.5.4" + "@types/ws" "^8.5.10" + ws "^8.14.2" + +"@supabase/realtime-js@2.9.4": + version "2.9.4" + resolved "https://registry.yarnpkg.com/@supabase/realtime-js/-/realtime-js-2.9.4.tgz#fcadfc167aad8e3798d7188f1c1506326b051bf0" + integrity sha512-wdq+2hZpgw0r2ldRs87d3U08Y8BrsO1bZxPNqbImpYshAEkusDz4vufR8KaqujKxqewmXS6YnUhuRVdvSEIKCA== + dependencies: + "@supabase/node-fetch" "^2.6.14" + "@types/phoenix" "^1.5.4" + "@types/ws" "^8.5.10" + ws "^8.14.2" + +"@supabase/storage-js@2.5.5": + version "2.5.5" + resolved "https://registry.yarnpkg.com/@supabase/storage-js/-/storage-js-2.5.5.tgz#2958e2a2cec8440e605bb53bd36649288c4dfa01" + integrity sha512-OpLoDRjFwClwc2cjTJZG8XviTiQH4Ik8sCiMK5v7et0MDu2QlXjCAW3ljxJB5+z/KazdMOTnySi+hysxWUPu3w== + dependencies: + "@supabase/node-fetch" "^2.6.14" + +"@supabase/supabase-js@2.42.0": + version "2.42.0" + resolved "https://registry.yarnpkg.com/@supabase/supabase-js/-/supabase-js-2.42.0.tgz#9e739cd96989acb0cbaab16da3717400b2ac92fa" + integrity sha512-1PDqJiA4iG45w3AAu6xkccJ3wPqlGJUoz9CPhScRLLTStxhewYhz0mjryTpXz1kgtNHdUAsirALreezn8UZMjA== + dependencies: + "@supabase/auth-js" "2.63.0" + "@supabase/functions-js" "2.2.2" + "@supabase/node-fetch" "2.6.15" + "@supabase/postgrest-js" "1.15.0" + "@supabase/realtime-js" "2.9.3" + "@supabase/storage-js" "2.5.5" + +"@supabase/supabase-js@^2.39.8": + version "2.42.5" + resolved "https://registry.yarnpkg.com/@supabase/supabase-js/-/supabase-js-2.42.5.tgz#e062259ab71e060a3eda09f2e77e4185d43a47ac" + integrity sha512-T/FlVmNHR/MDl8KhmNLb94dh+cTpqyvFlNI/Zd97dwS1yCm59xM+sTzmQLKnGNY5sPuwp40/w52bWrczdjOYtA== + dependencies: + "@supabase/auth-js" "2.63.1" + "@supabase/functions-js" "2.3.0" + "@supabase/node-fetch" "2.6.15" + "@supabase/postgrest-js" "1.15.2" + "@supabase/realtime-js" "2.9.4" + "@supabase/storage-js" "2.5.5" + +"@types/ethereum-protocol@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/ethereum-protocol/-/ethereum-protocol-1.0.5.tgz#6ad4c2c722d440d1f59e0d7e44a0fbb5fad2c41b" + integrity sha512-4wr+t2rYbwMmDrT447SGzE/43Z0EN++zyHCBoruIx32fzXQDxVa1rnQbYwPO8sLP2OugE/L8KaAIJC5kieUuBg== + dependencies: + bignumber.js "7.2.1" + +"@types/json-schema@^7.0.15": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/minimist@^1.2.0": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== + +"@types/node-forge@^1.3.0": + version "1.3.11" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" + integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== + dependencies: + "@types/node" "*" + +"@types/node@*", "@types/node@^20.11.19": + version "20.12.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384" + integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== + dependencies: + undici-types "~5.26.4" + +"@types/node@18.15.13": + version "18.15.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.13.tgz#f64277c341150c979e42b00e4ac289290c9df469" + integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== + +"@types/normalize-package-data@^2.4.0": + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== + +"@types/phoenix@^1.5.4": + version "1.6.4" + resolved "https://registry.yarnpkg.com/@types/phoenix/-/phoenix-1.6.4.tgz#cceac93a827555473ad38057d1df7d06eef1ed71" + integrity sha512-B34A7uot1Cv0XtaHRYDATltAdKx0BvVKNgYNqE4WjtPUa4VQJM7kxeXcVKaH+KS+kCmZ+6w+QaUdcljiheiBJA== + +"@types/semver@^7.5.8": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + +"@types/ws@^8.5.10": + version "8.5.10" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" + integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@^7.0.1": + version "7.7.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.1.tgz#50a9044e3e5fe76b22caf64fb7fc1f97614bdbfd" + integrity sha512-KwfdWXJBOviaBVhxO3p5TJiLpNuh2iyXyjmWN0f1nU87pwyvfS0EmjC6ukQVYVFJd/K1+0NWGPDXiyEyQorn0Q== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "7.7.1" + "@typescript-eslint/type-utils" "7.7.1" + "@typescript-eslint/utils" "7.7.1" + "@typescript-eslint/visitor-keys" "7.7.1" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/parser@^7.0.1": + version "7.7.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.7.1.tgz#f940e9f291cdca40c46cb75916217d3a42d6ceea" + integrity sha512-vmPzBOOtz48F6JAGVS/kZYk4EkXao6iGrD838sp1w3NQQC0W8ry/q641KU4PrG7AKNAf56NOcR8GOpH8l9FPCw== + dependencies: + "@typescript-eslint/scope-manager" "7.7.1" + "@typescript-eslint/types" "7.7.1" + "@typescript-eslint/typescript-estree" "7.7.1" + "@typescript-eslint/visitor-keys" "7.7.1" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@7.7.1": + version "7.7.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.7.1.tgz#07fe59686ca843f66e3e2b5c151522bc38effab2" + integrity sha512-PytBif2SF+9SpEUKynYn5g1RHFddJUcyynGpztX3l/ik7KmZEv19WCMhUBkHXPU9es/VWGD3/zg3wg90+Dh2rA== + dependencies: + "@typescript-eslint/types" "7.7.1" + "@typescript-eslint/visitor-keys" "7.7.1" + +"@typescript-eslint/type-utils@7.7.1": + version "7.7.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.7.1.tgz#2f8094edca3bebdaad009008929df645ed9c8743" + integrity sha512-ZksJLW3WF7o75zaBPScdW1Gbkwhd/lyeXGf1kQCxJaOeITscoSl0MjynVvCzuV5boUz/3fOI06Lz8La55mu29Q== + dependencies: + "@typescript-eslint/typescript-estree" "7.7.1" + "@typescript-eslint/utils" "7.7.1" + debug "^4.3.4" + ts-api-utils "^1.3.0" + +"@typescript-eslint/types@7.7.1": + version "7.7.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.7.1.tgz#f903a651fb004c75add08e4e9e207f169d4b98d7" + integrity sha512-AmPmnGW1ZLTpWa+/2omPrPfR7BcbUU4oha5VIbSbS1a1Tv966bklvLNXxp3mrbc+P2j4MNOTfDffNsk4o0c6/w== + +"@typescript-eslint/typescript-estree@7.7.1": + version "7.7.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.1.tgz#5cafde48fe390fe1c1b329b2ce0ba8a73c1e87b2" + integrity sha512-CXe0JHCXru8Fa36dteXqmH2YxngKJjkQLjxzoj6LYwzZ7qZvgsLSc+eqItCrqIop8Vl2UKoAi0StVWu97FQZIQ== + dependencies: + "@typescript-eslint/types" "7.7.1" + "@typescript-eslint/visitor-keys" "7.7.1" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/utils@7.7.1": + version "7.7.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.7.1.tgz#5d161f2b4a55e1bc38b634bebb921e4bd4e4a16e" + integrity sha512-QUvBxPEaBXf41ZBbaidKICgVL8Hin0p6prQDu6bbetWo39BKbWJxRsErOzMNT1rXvTll+J7ChrbmMCXM9rsvOQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.15" + "@types/semver" "^7.5.8" + "@typescript-eslint/scope-manager" "7.7.1" + "@typescript-eslint/types" "7.7.1" + "@typescript-eslint/typescript-estree" "7.7.1" + semver "^7.6.0" + +"@typescript-eslint/visitor-keys@7.7.1": + version "7.7.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.1.tgz#da2294796220bb0f3b4add5ecbb1b9c3f4f65798" + integrity sha512-gBL3Eq25uADw1LQ9kVpf3hRM+DWzs0uZknHYK3hq4jcTPqVCClHGDnB6UUUV2SFeBeA4KWHWbbLqmbGcZ4FYbw== + dependencies: + "@typescript-eslint/types" "7.7.1" + eslint-visitor-keys "^3.4.3" + +"@ubiquibot/permit-generation@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@ubiquibot/permit-generation/-/permit-generation-1.2.2.tgz#3493b4701e1d9deccd4e4d5c9aef4e3f7b76e4d8" + integrity sha512-782Pd5Ub7T5bjfsPGGhE1LVFWhhyAl20ZX1EgCltGzouHgXdha5NKWYh4aG1DIfx7EVJ/6lUAE2yb1PyqAlb5Q== + dependencies: + "@actions/core" "^1.10.1" + "@actions/github" "^6.0.0" + "@octokit/rest" "^20.0.2" + "@octokit/webhooks" "^13.1.0" + "@sinclair/typebox" "^0.32.5" + "@supabase/supabase-js" "2.42.0" + "@uniswap/permit2-sdk" "^1.2.0" + dotenv "^16.4.4" + ethers "6.11.1" + libsodium-wrappers "^0.7.13" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@uniswap/permit2-sdk@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@uniswap/permit2-sdk/-/permit2-sdk-1.2.0.tgz#ed86440a87a6c318169c8e6f161fc263ad040891" + integrity sha512-Ietv3FxN7+RCXcPSED/i/8b0a2GUZrMdyX05k3FsSztvYKyPFAMS/hBXojF0NZqYB1bHecqYc7Ej+7tV/rdYXg== + dependencies: + ethers "^5.3.1" + tiny-invariant "^1.3.1" + +JSONStream@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.2.0: + version "8.3.2" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== + +acorn@^8.8.0, acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + +aes-js@4.0.0-beta.5: + version "4.0.0-beta.5" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873" + integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +aggregate-error@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-5.0.0.tgz#ffe15045d7521c51c9d618e3d7f37c13f29b3fd3" + integrity sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw== + dependencies: + clean-stack "^5.2.0" + indent-string "^5.0.0" + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.11.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-escapes@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-6.2.1.tgz#76c54ce9b081dad39acec4b5d53377913825fb0f" + integrity sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.0.0, ansi-styles@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +arity-n@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" + integrity sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ== + +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + +array-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== + +array-last@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/array-last/-/array-last-1.3.0.tgz#7aa77073fec565ddab2493f5f88185f404a9d336" + integrity sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg== + dependencies: + is-number "^4.0.0" + +array-timsort@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-timsort/-/array-timsort-1.0.3.tgz#3c9e4199e54fb2b9c3fe5976396a21614ef0d926" + integrity sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + +as-table@^1.0.36: + version "1.0.55" + resolved "https://registry.yarnpkg.com/as-table/-/as-table-1.0.55.tgz#dc984da3937745de902cea1d45843c01bdbbec4f" + integrity sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ== + dependencies: + printable-characters "^1.0.42" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +axios@^1.6.7: + version "1.6.8" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" + integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +babylon@^6.9.1: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + +before-after-hook@^2.2.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" + integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== + +bignumber.js@7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" + integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +blake3-wasm@^2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/blake3-wasm/-/blake3-wasm-2.1.5.tgz#b22dbb84bc9419ed0159caa76af4b1b132e6ba52" + integrity sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g== + +bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + 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== + dependencies: + fill-range "^7.0.1" + +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +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" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +callsites@^3.0.0, callsites@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +capnp-ts@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/capnp-ts/-/capnp-ts-0.7.0.tgz#16fd8e76b667d002af8fcf4bf92bf15d1a7b54a9" + integrity sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g== + dependencies: + debug "^4.3.1" + tslib "^2.2.0" + +chalk-template@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/chalk-template/-/chalk-template-1.1.0.tgz#ffc55db6dd745e9394b85327c8ac8466edb7a7b1" + integrity sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg== + dependencies: + chalk "^5.2.0" + +chalk@5.3.0, chalk@^5.2.0, chalk@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + +chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.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== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +clean-stack@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-5.2.0.tgz#c7a0c91939c7caace30a3bf254e8a8ac276d1189" + integrity sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ== + dependencies: + escape-string-regexp "5.0.0" + +clear-module@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/clear-module/-/clear-module-4.1.2.tgz#5a58a5c9f8dccf363545ad7284cad3c887352a80" + integrity sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw== + dependencies: + parent-module "^2.0.0" + resolve-from "^5.0.0" + +cli-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" + integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== + dependencies: + restore-cursor "^4.0.0" + +cli-truncate@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" + integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== + dependencies: + slice-ansi "^5.0.0" + string-width "^7.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + 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== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^2.0.20: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" + integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== + +commander@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.0.0.tgz#b929db6df8546080adfd004ab215ed48cf6f2592" + integrity sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA== + +commander@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +comment-json@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/comment-json/-/comment-json-4.2.3.tgz#50b487ebbf43abe44431f575ebda07d30d015365" + integrity sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw== + dependencies: + array-timsort "^1.0.3" + core-util-is "^1.0.3" + esprima "^4.0.1" + has-own-prop "^2.0.0" + repeat-string "^1.6.1" + +compare-func@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" + integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== + dependencies: + array-ify "^1.0.0" + dot-prop "^5.1.0" + +compose-function@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" + integrity sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg== + dependencies: + arity-n "^1.0.4" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +configstore@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-6.0.0.tgz#49eca2ebc80983f77e09394a1a56e0aca8235566" + integrity sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA== + dependencies: + dot-prop "^6.0.1" + graceful-fs "^4.2.6" + unique-string "^3.0.0" + write-file-atomic "^3.0.3" + xdg-basedir "^5.0.1" + +conventional-changelog-angular@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz#5eec8edbff15aa9b1680a8dcfbd53e2d7eb2ba7a" + integrity sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ== + dependencies: + compare-func "^2.0.0" + +conventional-changelog-conventionalcommits@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz#aa5da0f1b2543094889e8cf7616ebe1a8f5c70d5" + integrity sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w== + dependencies: + compare-func "^2.0.0" + +conventional-commits-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz#57f3594b81ad54d40c1b4280f04554df28627d9a" + integrity sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA== + dependencies: + JSONStream "^1.3.5" + is-text-path "^2.0.0" + meow "^12.0.1" + split2 "^4.0.0" + +cookie@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +core-util-is@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig-typescript-loader@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz#0d3becfe022a871f7275ceb2397d692e06045dc8" + integrity sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA== + dependencies: + jiti "^1.19.1" + +cosmiconfig@^8.3.6: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" + integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== + dependencies: + type-fest "^1.0.1" + +cspell-config-lib@8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/cspell-config-lib/-/cspell-config-lib-8.7.0.tgz#84bb9312ca923e5e3493fe49cdb4049dda01c9a4" + integrity sha512-depsd01GbLBo71/tfRrL5iECWQLS4CjCxA9C01dVkFAJqVB0s+K9KLKjTlq5aHOhcvo9Z3dHV+bGQCf5/Q7bfw== + dependencies: + "@cspell/cspell-types" "8.7.0" + comment-json "^4.2.3" + yaml "^2.4.1" + +cspell-dictionary@8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/cspell-dictionary/-/cspell-dictionary-8.7.0.tgz#b18a315046e0e09971ef35787c67e7e422eb2318" + integrity sha512-S6IpZSzIMxlOO/33NgCOuP0TPH2mZbw8d5CP44z5jajflloq8l74MeJLkeDzYfCRcm0Rtk0A5drBeMg+Ai34OA== + dependencies: + "@cspell/cspell-pipe" "8.7.0" + "@cspell/cspell-types" "8.7.0" + cspell-trie-lib "8.7.0" + fast-equals "^5.0.1" + gensequence "^7.0.0" + +cspell-gitignore@8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/cspell-gitignore/-/cspell-gitignore-8.7.0.tgz#6eb3e0c5ec2c909b090e278808d5d1b1dee3b2c3" + integrity sha512-yvUZ86qyopUpDgn+YXP1qTpUe/lp65ZFvpMtw21lWHTFlg1OWKntr349EQU/5ben/K6koxk1FiElCBV7Lr4uFg== + dependencies: + cspell-glob "8.7.0" + find-up-simple "^1.0.0" + +cspell-glob@8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/cspell-glob/-/cspell-glob-8.7.0.tgz#3face24a29634c4492cbfe4553e05571de808b82" + integrity sha512-AMdfx0gvROA/aIL8t8b5Y5NtMgscGZELFj6WhCSZiQSuWRxXUKiLGGLUFjx2y0hgXN9LUYOo6aBjvhnxI/v71g== + dependencies: + micromatch "^4.0.5" + +cspell-grammar@8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/cspell-grammar/-/cspell-grammar-8.7.0.tgz#c634324ae19e9f17e1130cc9c364f67ac6e6b8ec" + integrity sha512-SGcXc7322wU2WNRi7vtpToWDXTqZHhxqvR+aIXHT2kkxlMSWp3Rvfpshd0ckgY54nZtgw7R/JtKND2jeACRpwQ== + dependencies: + "@cspell/cspell-pipe" "8.7.0" + "@cspell/cspell-types" "8.7.0" + +cspell-io@8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/cspell-io/-/cspell-io-8.7.0.tgz#443c85a6a3a7c51840d5265d95eface6ea18944e" + integrity sha512-o7OltyyvVkRG1gQrIqGpN5pUkHNnv6rvihb7Qu6cJ8jITinLGuWJuEQpgt0eF5yIr624jDbFwSzAxsFox8riQg== + dependencies: + "@cspell/cspell-service-bus" "8.7.0" + +cspell-lib@8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/cspell-lib/-/cspell-lib-8.7.0.tgz#7affbbebed9229a58034149d179eb255ea50233e" + integrity sha512-qDSHZGekwiDmouYRECTQokE+hgAuPqREm+Hb+G3DoIo3ZK5H47TtEUo8fNCw22XsKefcF8X28LiyoZwiYHVpSg== + dependencies: + "@cspell/cspell-bundled-dicts" "8.7.0" + "@cspell/cspell-pipe" "8.7.0" + "@cspell/cspell-resolver" "8.7.0" + "@cspell/cspell-types" "8.7.0" + "@cspell/dynamic-import" "8.7.0" + "@cspell/strong-weak-map" "8.7.0" + clear-module "^4.1.2" + comment-json "^4.2.3" + configstore "^6.0.0" + cspell-config-lib "8.7.0" + cspell-dictionary "8.7.0" + cspell-glob "8.7.0" + cspell-grammar "8.7.0" + cspell-io "8.7.0" + cspell-trie-lib "8.7.0" + fast-equals "^5.0.1" + gensequence "^7.0.0" + import-fresh "^3.3.0" + resolve-from "^5.0.0" + vscode-languageserver-textdocument "^1.0.11" + vscode-uri "^3.0.8" + +cspell-trie-lib@8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/cspell-trie-lib/-/cspell-trie-lib-8.7.0.tgz#792382fae9773e260e01d2f31e9dba03af73c858" + integrity sha512-W3Nh2cO7gMV91r+hLqyTMgKlvRl4W5diKs5YiyOxjZumRkMBy42IzcNYtgIIacOxghklv96F5Bd1Vx/zY6ylGA== + dependencies: + "@cspell/cspell-pipe" "8.7.0" + "@cspell/cspell-types" "8.7.0" + gensequence "^7.0.0" + +cspell@^8.3.2: + version "8.7.0" + resolved "https://registry.yarnpkg.com/cspell/-/cspell-8.7.0.tgz#41797a9f3ab07a83bcf463499b690ab0985eb0ff" + integrity sha512-77nRPgLl240C6FK8RKVKo34lP15Lzp/6bk+SKYJFwUKKXlcgWXDis+Lw4JolA741/JgHtuxmhW1C8P7dCKjJ3w== + dependencies: + "@cspell/cspell-json-reporter" "8.7.0" + "@cspell/cspell-pipe" "8.7.0" + "@cspell/cspell-types" "8.7.0" + "@cspell/dynamic-import" "8.7.0" + chalk "^5.3.0" + chalk-template "^1.1.0" + commander "^12.0.0" + cspell-gitignore "8.7.0" + cspell-glob "8.7.0" + cspell-io "8.7.0" + cspell-lib "8.7.0" + fast-glob "^3.3.2" + fast-json-stable-stringify "^2.1.0" + file-entry-cache "^8.0.0" + get-stdin "^9.0.0" + semver "^7.6.0" + strip-ansi "^7.1.0" + vscode-uri "^3.0.8" + +dargs@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" + integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== + +data-uri-to-buffer@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz#d296973d5a4897a5dbe31716d118211921f04770" + integrity sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA== + +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +debug@4.3.4, debug@^4, 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== + dependencies: + ms "2.1.2" + +decamelize-keys@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +deep-freeze@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/deep-freeze/-/deep-freeze-0.0.1.tgz#3a0b0005de18672819dfd38cd31f91179c893e84" + integrity sha512-Z+z8HiAvsGwmjqlphnHW5oz6yWlOwu6EQfFTjmeTWlDeda3FS2yv3jhq35TX/ewmsnqB+RX2IdsIOyjJCQN5tg== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +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" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +deprecation@^2.0.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dot-prop@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== + dependencies: + is-obj "^2.0.0" + +dotenv@^16.4.4: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + +easy-table@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/easy-table/-/easy-table-1.2.0.tgz#ba9225d7138fee307bfd4f0b5bc3c04bdc7c54eb" + integrity sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww== + dependencies: + ansi-regex "^5.0.1" + optionalDependencies: + wcwidth "^1.0.1" + +elliptic@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.3.0.tgz#76998b9268409eb3dae3de989254d456e70cfe23" + integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +esbuild@0.17.19: + version "0.17.19" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.19.tgz#087a727e98299f0462a3d0bcdd9cd7ff100bd955" + integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw== + optionalDependencies: + "@esbuild/android-arm" "0.17.19" + "@esbuild/android-arm64" "0.17.19" + "@esbuild/android-x64" "0.17.19" + "@esbuild/darwin-arm64" "0.17.19" + "@esbuild/darwin-x64" "0.17.19" + "@esbuild/freebsd-arm64" "0.17.19" + "@esbuild/freebsd-x64" "0.17.19" + "@esbuild/linux-arm" "0.17.19" + "@esbuild/linux-arm64" "0.17.19" + "@esbuild/linux-ia32" "0.17.19" + "@esbuild/linux-loong64" "0.17.19" + "@esbuild/linux-mips64el" "0.17.19" + "@esbuild/linux-ppc64" "0.17.19" + "@esbuild/linux-riscv64" "0.17.19" + "@esbuild/linux-s390x" "0.17.19" + "@esbuild/linux-x64" "0.17.19" + "@esbuild/netbsd-x64" "0.17.19" + "@esbuild/openbsd-x64" "0.17.19" + "@esbuild/sunos-x64" "0.17.19" + "@esbuild/win32-arm64" "0.17.19" + "@esbuild/win32-ia32" "0.17.19" + "@esbuild/win32-x64" "0.17.19" + +esbuild@^0.20.0: + version "0.20.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" + integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== + optionalDependencies: + "@esbuild/aix-ppc64" "0.20.2" + "@esbuild/android-arm" "0.20.2" + "@esbuild/android-arm64" "0.20.2" + "@esbuild/android-x64" "0.20.2" + "@esbuild/darwin-arm64" "0.20.2" + "@esbuild/darwin-x64" "0.20.2" + "@esbuild/freebsd-arm64" "0.20.2" + "@esbuild/freebsd-x64" "0.20.2" + "@esbuild/linux-arm" "0.20.2" + "@esbuild/linux-arm64" "0.20.2" + "@esbuild/linux-ia32" "0.20.2" + "@esbuild/linux-loong64" "0.20.2" + "@esbuild/linux-mips64el" "0.20.2" + "@esbuild/linux-ppc64" "0.20.2" + "@esbuild/linux-riscv64" "0.20.2" + "@esbuild/linux-s390x" "0.20.2" + "@esbuild/linux-x64" "0.20.2" + "@esbuild/netbsd-x64" "0.20.2" + "@esbuild/openbsd-x64" "0.20.2" + "@esbuild/sunos-x64" "0.20.2" + "@esbuild/win32-arm64" "0.20.2" + "@esbuild/win32-ia32" "0.20.2" + "@esbuild/win32-x64" "0.20.2" + +esbuild@~0.19.10: + version "0.19.12" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" + integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== + optionalDependencies: + "@esbuild/aix-ppc64" "0.19.12" + "@esbuild/android-arm" "0.19.12" + "@esbuild/android-arm64" "0.19.12" + "@esbuild/android-x64" "0.19.12" + "@esbuild/darwin-arm64" "0.19.12" + "@esbuild/darwin-x64" "0.19.12" + "@esbuild/freebsd-arm64" "0.19.12" + "@esbuild/freebsd-x64" "0.19.12" + "@esbuild/linux-arm" "0.19.12" + "@esbuild/linux-arm64" "0.19.12" + "@esbuild/linux-ia32" "0.19.12" + "@esbuild/linux-loong64" "0.19.12" + "@esbuild/linux-mips64el" "0.19.12" + "@esbuild/linux-ppc64" "0.19.12" + "@esbuild/linux-riscv64" "0.19.12" + "@esbuild/linux-s390x" "0.19.12" + "@esbuild/linux-x64" "0.19.12" + "@esbuild/netbsd-x64" "0.19.12" + "@esbuild/openbsd-x64" "0.19.12" + "@esbuild/sunos-x64" "0.19.12" + "@esbuild/win32-arm64" "0.19.12" + "@esbuild/win32-ia32" "0.19.12" + "@esbuild/win32-x64" "0.19.12" + +escalade@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +escape-string-regexp@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-plugin-sonarjs@^0.24.0: + version "0.24.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.24.0.tgz#b594ccb9b1d6123edd3c3fe3a45b4392e14932d7" + integrity sha512-87zp50mbbNrSTuoEOebdRQBPa0mdejA5UEjyuScyIw8hEpEjfWP89Qhkq5xVZfVyVSRQKZc9alVm7yRKQvvUmg== + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.56.0: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" + integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +ethers@6.11.1: + version "6.11.1" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.11.1.tgz#96aae00b627c2e35f9b0a4d65c7ab658259ee6af" + integrity sha512-mxTAE6wqJQAbp5QAe/+o+rXOID7Nw91OZXvgpjDa1r4fAbq2Nu314oEZSbjoRLacuCzs7kUC3clEvkCQowffGg== + dependencies: + "@adraffy/ens-normalize" "1.10.1" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@types/node" "18.15.13" + aes-js "4.0.0-beta.5" + tslib "2.4.0" + ws "8.5.0" + +ethers@^5.3.1, ethers@^5.7.2: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.2" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.7.0" + +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +execa@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit-hook@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-2.2.1.tgz#007b2d92c6428eda2b76e7016a34351586934593" + integrity sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw== + +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" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-equals@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-5.0.1.tgz#a4eefe3c5d1c0d021aeed0bc10ba5e0c12ee405d" + integrity sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ== + +fast-glob@3.3.2, fast-glob@^3.2.9, fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.15.0, fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +file-entry-cache@8.0.0, 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" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +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== + dependencies: + to-regex-range "^5.0.1" + +filter-iterator@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/filter-iterator/-/filter-iterator-0.0.1.tgz#0a2ecf07d6c06f96bdeb6846f8e88b57b8da1f37" + integrity sha512-v4lhL7Qa8XpbW3LN46CEnmhGk3eHZwxfNl5at20aEkreesht4YKb/Ba3BUIbnPhAC/r3dmu7ABaGk6MAvh2alA== + +filter-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" + integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== + +find-up-simple@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/find-up-simple/-/find-up-simple-1.0.0.tgz#21d035fde9fdbd56c8f4d2f63f32fd93a1cfc368" + integrity sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw== + +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +follow-redirects@^1.15.6: + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensequence@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/gensequence/-/gensequence-7.0.0.tgz#bb6aedec8ff665e3a6c42f92823121e3a6ea7718" + integrity sha512-47Frx13aZh01afHJTB3zTtKIlFI6vWY+MYCN9Qpew6i52rfKjnhCF/l1YlC8UmEMvvntZZ6z4PiCcmyuedR2aQ== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-east-asian-width@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz#5e6ebd9baee6fb8b7b6bd505221065f0cd91f64e" + integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-source@^2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/get-source/-/get-source-2.0.12.tgz#0b47d57ea1e53ce0d3a69f4f3d277eb8047da944" + integrity sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w== + dependencies: + data-uri-to-buffer "^2.0.0" + source-map "^0.6.1" + +get-stdin@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" + integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + +get-tsconfig@^4.7.2: + version "4.7.3" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.3.tgz#0498163d98f7b58484dd4906999c0c9d5f103f83" + integrity sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg== + dependencies: + resolve-pkg-maps "^1.0.0" + +git-raw-commits@^2.0.11: + version "2.0.11" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" + integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== + dependencies: + dargs "^7.0.0" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +global-directory@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" + integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== + dependencies: + ini "4.1.1" + +global-dirs@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg== + dependencies: + ini "^1.3.4" + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.2, graceful-fs@^4.2.6: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + +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" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-own-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-own-prop/-/has-own-prop-2.0.0.tgz#f0f95d58f65804f5d218db32563bb85b8e0417af" + integrity sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ== + +has-own-property@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-own-property/-/has-own-property-0.1.0.tgz#992b0f5bb3a25416f8d4d0cde53f497b9d7b1ea5" + integrity sha512-14qdBKoonU99XDhWcFKZTShK+QV47qU97u8zzoVo9cL5TZ3BmBHXogItSt9qJjR0KUMFRhcCW8uGIGl8nkl7Aw== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hosted-git-info@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== + +husky@^9.0.11: + version "9.0.11" + resolved "https://registry.yarnpkg.com/husky/-/husky-9.0.11.tgz#fc91df4c756050de41b3e478b2158b87c1e79af9" + integrity sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw== + +identity-function@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/identity-function/-/identity-function-1.0.0.tgz#bea1159f0985239be3ca348edf40ce2f0dd2c21d" + integrity sha512-kNrgUK0qI+9qLTBidsH85HjDLpZfrrS0ElquKKe/fJFdB3D7VeKdXXEvOPDUHSHOzdZKCAAaQIWWyp0l2yq6pw== + +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== + +ignore@^5.1.8, ignore@^5.2.0, ignore@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + +import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-meta-resolve@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz#0b1195915689f60ab00f830af0f15cc841e8919e" + integrity sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indent-string@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" + integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +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== + +ini@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" + integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== + +ini@^1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + +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" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +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" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0, is-core-module@^2.5.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-fullwidth-code-point@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" + integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== + dependencies: + get-east-asian-width "^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" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-iterable@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-iterable/-/is-iterable-1.1.1.tgz#71f9aa6f113e1d968ebe1d41cff4c8fb23a817bc" + integrity sha512-EdOZCr0NsGE00Pot+x1ZFx9MJK3C6wy91geZpXwvwexDLJvA4nzYyZf7r+EIwSeVsOLDdBz7ATg9NqKTzuNYuQ== + +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-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" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-text-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-2.0.0.tgz#b2484e2b720a633feb2e85b67dc193ff72c75636" + integrity sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw== + dependencies: + text-extensions "^2.0.0" + +is-typed-array@^1.1.13: + 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-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +iterable-lookahead@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/iterable-lookahead/-/iterable-lookahead-1.0.0.tgz#896dfcb78680bdb50036e97edb034c8b68a9737f" + integrity sha512-hJnEP2Xk4+44DDwJqUQGdXal5VbyeWLaPyDl2AQc242Zr7iqz4DgpQOrEzglWVMGHMDCkguLHEKxd1+rOsmgSQ== + +jiti@1.21.0, jiti@^1.19.1: + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== + +js-sha3@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@4.1.0, js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + +keyv@^4.5.3, keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +knip@^5.0.1: + version "5.10.0" + resolved "https://registry.yarnpkg.com/knip/-/knip-5.10.0.tgz#309ab88f18ed8dd95b8e8988c45c72f31926f391" + integrity sha512-cC8wbMoJ1DJEI39tSTA0ToinTHr7rYpoSec+lpQ+CIuvplsRoQdnMd8Uqi62ycqJFoVfrKldLtGo+LlYITitow== + dependencies: + "@ericcornelissen/bash-parser" "0.5.2" + "@nodelib/fs.walk" "2.0.0" + "@snyk/github-codeowners" "1.1.0" + easy-table "1.2.0" + fast-glob "3.3.2" + file-entry-cache "8.0.0" + jiti "1.21.0" + js-yaml "4.1.0" + minimist "1.2.8" + picocolors "1.0.0" + picomatch "^4.0.1" + pretty-ms "9.0.0" + resolve "1.22.8" + smol-toml "1.1.4" + strip-json-comments "5.0.1" + summary "2.1.0" + zod "^3.22.4" + zod-validation-error "^3.0.3" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +libsodium-wrappers@^0.7.13: + version "0.7.13" + resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.13.tgz#83299e06ee1466057ba0e64e532777d2929b90d3" + integrity sha512-kasvDsEi/r1fMzKouIDv7B8I6vNmknXwGiYodErGuESoFTohGSKZplFtVxZqHaoQ217AynyIFgnOVRitpHs0Qw== + dependencies: + libsodium "^0.7.13" + +libsodium@^0.7.13: + version "0.7.13" + resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.13.tgz#230712ec0b7447c57b39489c48a4af01985fb393" + integrity sha512-mK8ju0fnrKXXfleL53vtp9xiPq5hKM0zbDQtcxQIsSmxNgSxqCj6R7Hl9PkrNe2j29T4yoDaF7DJLK9/i5iWUw== + +lilconfig@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.0.0.tgz#f8067feb033b5b74dab4602a5f5029420be749bc" + integrity sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lint-staged@^15.2.2: + version "15.2.2" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.2.tgz#ad7cbb5b3ab70e043fa05bff82a09ed286bc4c5f" + integrity sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw== + dependencies: + chalk "5.3.0" + commander "11.1.0" + debug "4.3.4" + execa "8.0.1" + lilconfig "3.0.0" + listr2 "8.0.1" + micromatch "4.0.5" + pidtree "0.6.0" + string-argv "0.3.2" + yaml "2.3.4" + +listr2@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.0.1.tgz#4d3f50ae6cec3c62bdf0e94f5c2c9edebd4b9c34" + integrity sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA== + dependencies: + cli-truncate "^4.0.0" + colorette "^2.0.20" + eventemitter3 "^5.0.1" + log-update "^6.0.0" + rfdc "^1.3.0" + wrap-ansi "^9.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +lodash.curry@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" + integrity sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA== + +lodash.isfunction@^3.0.9: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" + integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.kebabcase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" + integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.mergewith@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" + integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== + +lodash.snakecase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== + +lodash.startcase@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" + integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash.upperfirst@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" + integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== + +lodash@^4.17.15: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-update@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.0.0.tgz#0ddeb7ac6ad658c944c1de902993fce7c33f5e59" + integrity sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw== + dependencies: + ansi-escapes "^6.2.0" + cli-cursor "^4.0.0" + slice-ansi "^7.0.0" + strip-ansi "^7.1.0" + wrap-ansi "^9.0.0" + +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" + +magic-string@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.16.0.tgz#970ebb0da7193301285fb1aa650f39bdd81eb45a" + integrity sha512-c4BEos3y6G2qO0B9X7K0FVLOPT9uGrjYwYRLFmDqyl5YMboUviyecnXWp94fJTSMwPw2/sf+CEYt5AGpmklkkQ== + dependencies: + vlq "^0.2.1" + +magic-string@^0.25.3: + version "0.25.9" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== + +map-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" + integrity sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ== + +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + +meow@^12.0.1: + version "12.1.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-12.1.1.tgz#e558dddbab12477b69b2e9a2728c327f191bace6" + integrity sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw== + +meow@^8.0.0: + version "8.1.2" + resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" + integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@4.0.5, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +miniflare@3.20240405.2: + version "3.20240405.2" + resolved "https://registry.yarnpkg.com/miniflare/-/miniflare-3.20240405.2.tgz#40f6c9059a9d9c3069215d4bd66d63d4302b4a8b" + integrity sha512-n/V5m9GVMN37U5gWdrNXKx2d1icLXtcIKcxWtLslH4RTaebZJdSRmp12UHyuQsKlaSpTkNqyzLVtCEgt2bhRSA== + dependencies: + "@cspotcode/source-map-support" "0.8.1" + acorn "^8.8.0" + acorn-walk "^8.2.0" + capnp-ts "^0.7.0" + exit-hook "^2.2.1" + glob-to-regexp "^0.4.1" + stoppable "^1.1.0" + undici "^5.28.2" + workerd "1.20240405.0" + ws "^8.11.0" + youch "^3.2.2" + zod "^3.20.6" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +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== + dependencies: + brace-expansion "^2.0.1" + +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@1.2.8, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mustache@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== + +nanoid@^3.3.3: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +nodemon@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.0.tgz#ff7394f2450eb6a5e96fe4180acd5176b29799c9" + integrity sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA== + dependencies: + chokidar "^3.5.2" + debug "^4" + ignore-by-default "^1.0.1" + minimatch "^3.1.2" + pstree.remy "^1.1.8" + semver "^7.5.3" + simple-update-notifier "^2.0.0" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.5" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-package-data@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== + dependencies: + hosted-git-info "^4.0.1" + is-core-module "^2.5.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-all@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" + integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== + dependencies: + ansi-styles "^3.2.1" + chalk "^2.4.1" + cross-spawn "^6.0.5" + memorystream "^0.3.1" + minimatch "^3.0.4" + pidtree "^0.3.0" + read-pkg "^3.0.0" + shell-quote "^1.6.1" + string.prototype.padend "^3.0.0" + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + dependencies: + path-key "^4.0.0" + +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-pairs@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-pairs/-/object-pairs-0.1.0.tgz#8276eed81d60b8549d69c5f73a682ab9da4ff32f" + integrity sha512-3ECr6K831I4xX/Mduxr9UC+HPOz/d6WKKYj9p4cmC8Lg8p7g8gitzsxNX5IWlSIgFWN/a4JgrJaoAMKn20oKwA== + +object-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/object-values/-/object-values-1.0.0.tgz#72af839630119e5b98c3b02bb8c27e3237158105" + integrity sha512-+8hwcz/JnQ9EpLIXzN0Rs7DLsBpJNT/xYehtB/jU93tHYr5BFEO8E+JGQNOSqE7opVzz5cGksKFHt7uUJVLSjQ== + +object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +once@^1.3.0, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +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== + dependencies: + mimic-fn "^2.1.0" + +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parent-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-2.0.0.tgz#fa71f88ff1a50c27e15d8ff74e0e3a9523bf8708" + integrity sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg== + dependencies: + callsites "^3.1.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-ms@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-4.0.0.tgz#c0c058edd47c2a590151a718990533fd62803df4" + integrity sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +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@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +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, 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== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +picomatch@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + +pidtree@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== + +pidtree@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" + integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier@^3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" + integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== + +pretty-ms@9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-9.0.0.tgz#53c57f81171c53be7ce3fd20bdd4265422bc5929" + integrity sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng== + dependencies: + parse-ms "^4.0.0" + +printable-characters@^1.0.42: + version "1.0.42" + resolved "https://registry.yarnpkg.com/printable-characters/-/printable-characters-1.0.42.tgz#3f18e977a9bd8eb37fcc4ff5659d7be90868b3d8" + integrity sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ== + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +pstree.remy@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" + integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +readable-stream@3, readable-stream@^3.0.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + dependencies: + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-from@5.0.0, resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-global@1.0.0, resolve-global@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255" + integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== + dependencies: + global-dirs "^0.1.1" + +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + +resolve.exports@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + +resolve@1.22.8, resolve@^1.10.0, resolve@^1.22.8: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" + integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== + 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== + +reverse-arguments@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/reverse-arguments/-/reverse-arguments-1.0.0.tgz#c28095a3a921ac715d61834ddece9027992667cd" + integrity sha512-/x8uIPdTafBqakK0TmPNJzgkLP+3H+yxpUJhCQHsLBg1rYEVNR2D8BRYNWQhVBjyOd7oo1dZRVzIkwMY2oqfYQ== + +rfdc@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f" + integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rollup-plugin-inject@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz#e4233855bfba6c0c12a312fd6649dff9a13ee9f4" + integrity sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w== + dependencies: + estree-walker "^0.6.1" + magic-string "^0.25.3" + rollup-pluginutils "^2.8.1" + +rollup-plugin-node-polyfills@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz#53092a2744837164d5b8a28812ba5f3ff61109fd" + integrity sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA== + dependencies: + rollup-plugin-inject "^3.0.0" + +rollup-pluginutils@^2.8.1: + version "2.8.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" + integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== + dependencies: + estree-walker "^0.6.1" + +run-parallel@^1.1.9, run-parallel@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +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" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" + +safe-stable-stringify@^2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + +scrypt-js@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +selfsigned@^2.0.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== + dependencies: + "@types/node-forge" "^1.3.0" + node-forge "^1" + +"semver@2 || 3 || 4 || 5", semver@^5.5.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@7.6.0, semver@^7.3.4, semver@^7.5.3, 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" + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote-word@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/shell-quote-word/-/shell-quote-word-1.0.1.tgz#e2bdfd22d599fd68886491677e38f560f9d469c9" + integrity sha512-lT297f1WLAdq0A4O+AknIFRP6kkiI3s8C913eJ0XqBxJbZPGWUNkRQk2u8zk4bEAjUJ5i+fSLwB6z1HzeT+DEg== + +shell-quote@^1.6.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +side-channel@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +signal-exit@^3.0.2, signal-exit@^3.0.3: + 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== + +signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +simple-update-notifier@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" + integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== + dependencies: + semver "^7.5.3" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +slice-ansi@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" + integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^5.0.0" + +smol-toml@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/smol-toml/-/smol-toml-1.1.4.tgz#08c23b105f56f17e57b0a77c7edcb10b75a62c5c" + integrity sha512-Y0OT8HezWsTNeEOSVxDnKOW/AyNXHQ4BwJNbAXlLTF5wWsBvrcHhIkE5Rf8kQMLmgf7nDX3PVOlgC6/Aiggu3Q== + +source-map@0.6.1, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.17" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c" + integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg== + +split2@^3.0.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== + dependencies: + readable-stream "^3.0.0" + +split2@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + +stacktracey@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/stacktracey/-/stacktracey-2.1.8.tgz#bf9916020738ce3700d1323b32bd2c91ea71199d" + integrity sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw== + dependencies: + as-table "^1.0.36" + get-source "^2.0.12" + +stoppable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/stoppable/-/stoppable-1.1.0.tgz#32da568e83ea488b08e4d7ea2c3bcc9d75015d5b" + integrity sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw== + +string-argv@0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + 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== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.1.0.tgz#d994252935224729ea3719c49f7206dc9c46550a" + integrity sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw== + dependencies: + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" + +string.fromcodepoint@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string.fromcodepoint/-/string.fromcodepoint-0.2.1.tgz#8d978333c0bc92538f50f383e4888f3e5619d653" + integrity sha512-n69H31OnxSGSZyZbgBlvYIXlrMhJQ0dQAX1js1QDhpaUH6zmU3QYlj07bCwCNlPOu3oRXIubGPl2gDGnHsiCqg== + +string.prototype.padend@^3.0.0: + version "3.1.6" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz#ba79cf8992609a91c872daa47c6bb144ee7f62a5" + integrity sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.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== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-5.0.1.tgz#0d8b7d01b23848ed7dbdf4baaaa31a8250d8cfa0" + integrity sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +summary@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/summary/-/summary-2.1.0.tgz#be8a49a0aa34eb6ceea56042cae88f8add4b0885" + integrity sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw== + +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +text-extensions@^2.0.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-2.4.0.tgz#a1cfcc50cf34da41bfd047cc744f804d1680ea34" + integrity sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +through2@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== + dependencies: + readable-stream "3" + +"through@>=2.2.7 <3": + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tiny-invariant@^1.3.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" + integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== + +to-no-case@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/to-no-case/-/to-no-case-1.0.2.tgz#c722907164ef6b178132c8e69930212d1b4aa16a" + integrity sha512-Z3g735FxuZY8rodxV4gH7LxClE4H0hTIyHNIHdk+vpQxjLm0cwnKXq/OFVZ76SOQmto7txVcwSCwkU5kqp+FKg== + +to-pascal-case@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-pascal-case/-/to-pascal-case-1.0.0.tgz#0bbdc8df448886ba01535e543327048d0aa1ce78" + integrity sha512-QGMWHqM6xPrcQW57S23c5/3BbYb0Tbe9p+ur98ckRnGDwD4wbbtDiYI38CfmMKNB5Iv0REjs5SNDntTwvDxzZA== + dependencies: + to-space-case "^1.0.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-space-case@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-space-case/-/to-space-case-1.0.0.tgz#b052daafb1b2b29dc770cea0163e5ec0ebc9fc17" + integrity sha512-rLdvwXZ39VOn1IxGL3V6ZstoTbwLRckQmn/U8ZDLuWwIXNpuZDhQ3AiRUlhTbOXFVE9C+dR51wM0CBDhk31VcA== + dependencies: + to-no-case "^1.0.0" + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + dependencies: + nopt "~1.0.10" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== + +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" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + +ts-json-schema-generator@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/ts-json-schema-generator/-/ts-json-schema-generator-1.5.1.tgz#7759c421240be86d393a884ad186f926b22332db" + integrity sha512-apX5qG2+NA66j7b4AJm8q/DpdTeOsjfh7A3LpKsUiil0FepkNwtN28zYgjrsiiya2/OPhsr/PSjX5FUYg79rCg== + dependencies: + "@types/json-schema" "^7.0.15" + commander "^12.0.0" + glob "^8.0.3" + json5 "^2.2.3" + normalize-path "^3.0.0" + safe-stable-stringify "^2.4.3" + typescript "~5.4.2" + +tslib@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tslib@^2.2.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tsx@^4.7.1: + version "4.7.2" + resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.7.2.tgz#a108b1a6e16876cd4c9a4b4ba263f2a07f9cf562" + integrity sha512-BCNd4kz6fz12fyrgCTEdZHGJ9fWTGeUzXmQysh0RVocDY3h4frk05ZNCXSy4kIenF7y/QnrdiVpTsyNRn6vlAw== + dependencies: + esbuild "~0.19.10" + get-tsconfig "^4.7.2" + optionalDependencies: + fsevents "~2.3.3" + +tunnel@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" + integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-fest@^1.0.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + +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" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typescript@^5.3.3, typescript@~5.4.2: + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undefsafe@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" + integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +undici@^5.25.4, undici@^5.28.2: + version "5.28.4" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" + integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== + dependencies: + "@fastify/busboy" "^2.0.0" + +unescape-js@^1.0.5: + version "1.1.4" + resolved "https://registry.yarnpkg.com/unescape-js/-/unescape-js-1.1.4.tgz#4bc6389c499cb055a98364a0b3094e1c3d5da395" + integrity sha512-42SD8NOQEhdYntEiUQdYq/1V/YHwr1HLwlHuTJB5InVVdOSbgI6xu8jK5q65yIzuFCfczzyDF/7hbGzVbyCw0g== + dependencies: + string.fromcodepoint "^0.2.1" + +unique-string@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-3.0.0.tgz#84a1c377aff5fd7a8bc6b55d8244b2bd90d75b9a" + integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== + dependencies: + crypto-random-string "^4.0.0" + +universal-user-agent@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" + integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vlq@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" + integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== + +vscode-languageserver-textdocument@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz#0822a000e7d4dc083312580d7575fe9e3ba2e2bf" + integrity sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA== + +vscode-uri@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.8.tgz#1770938d3e72588659a172d0fd4642780083ff9f" + integrity sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw== + +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" + +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== + +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" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.14, which-typed-array@^1.1.15: + 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== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +workerd@1.20240405.0: + version "1.20240405.0" + resolved "https://registry.yarnpkg.com/workerd/-/workerd-1.20240405.0.tgz#c5cb6563b0a9b16dc981f5138f4b71fa2f976683" + integrity sha512-AWrOSBh4Ll7sBWHuh0aywm8hDkKqsZmcwnDB0PVGszWZM5mndNBI5iJ/8haXVpdoyqkJQEVdhET9JDi4yU8tRg== + optionalDependencies: + "@cloudflare/workerd-darwin-64" "1.20240405.0" + "@cloudflare/workerd-darwin-arm64" "1.20240405.0" + "@cloudflare/workerd-linux-64" "1.20240405.0" + "@cloudflare/workerd-linux-arm64" "1.20240405.0" + "@cloudflare/workerd-windows-64" "1.20240405.0" + +wrangler@^3.51.2: + version "3.51.2" + resolved "https://registry.yarnpkg.com/wrangler/-/wrangler-3.51.2.tgz#bd4d37c8f989565b2d42cd15f4ec3d2561475bdf" + integrity sha512-8TRUwzPHj6+uPDzY0hBJ9/YwniEF9pqMGe5qbqLP/XsHTCWxIFib5go374zyCkmuVh23AwV7NuTA6gUtSqZ8pQ== + dependencies: + "@cloudflare/kv-asset-handler" "0.3.1" + "@esbuild-plugins/node-globals-polyfill" "^0.2.3" + "@esbuild-plugins/node-modules-polyfill" "^0.2.2" + blake3-wasm "^2.1.5" + chokidar "^3.5.3" + esbuild "0.17.19" + miniflare "3.20240405.2" + nanoid "^3.3.3" + path-to-regexp "^6.2.0" + resolve "^1.22.8" + resolve.exports "^2.0.2" + selfsigned "^2.0.1" + source-map "0.6.1" + ts-json-schema-generator "^1.5.0" + xxhash-wasm "^1.0.1" + optionalDependencies: + fsevents "~2.3.2" + +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@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" + integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== + dependencies: + ansi-styles "^6.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +ws@8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== + +ws@^8.11.0, ws@^8.14.2: + version "8.16.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" + integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== + +xdg-basedir@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" + integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== + +xxhash-wasm@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz#ecc0f813219b727af4d5f3958ca6becee2f2f1ff" + integrity sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +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== + +yaml@2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" + integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== + +yaml@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" + integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg== + +yargs-parser@^20.2.3: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.0.0: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +youch@^3.2.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/youch/-/youch-3.3.3.tgz#50cfdf5bc395ce664a5073e31b712ff4a859d928" + integrity sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA== + dependencies: + cookie "^0.5.0" + mustache "^4.2.0" + stacktracey "^2.1.8" + +zod-validation-error@^3.0.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/zod-validation-error/-/zod-validation-error-3.2.0.tgz#df2ef6a8531d959324990599fb58206ca9479093" + integrity sha512-cYlPR6zuyrgmu2wRTdumEAJGuwI7eHVHGT+VyneAQxmRAKtGRL1/7pjz4wfLhz4J05f5qoSZc3rGacswgyTjjw== + +zod@^3.20.6, zod@^3.22.4: + version "3.23.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.4.tgz#c63805b2f39e10d4ab3d55eb3c8cdb472c79dfb1" + integrity sha512-/AtWOKbBgjzEYYQRNfoGKHObgfAZag6qUJX1VbHo2PRBgS+wfWagEY2mizjfyAPcGesrJOcx/wcl0L9WnVrHFw== From 5426f7706c3aedda57202b848f983816f4f60f98 Mon Sep 17 00:00:00 2001 From: EresDev Date: Mon, 13 May 2024 15:20:21 +0500 Subject: [PATCH 002/174] refactor: move addresses to constants from env --- functions/post-order.ts | 16 +++++++--------- functions/validators.ts | 4 ++-- shared/constants.ts | 2 ++ shared/helpers.ts | 4 +--- static/scripts/rewards/constants.ts | 2 -- .../rewards/gift-cards/claim/claim-action.ts | 3 ++- wrangler.toml | 4 +--- 7 files changed, 15 insertions(+), 20 deletions(-) create mode 100644 shared/constants.ts diff --git a/functions/post-order.ts b/functions/post-order.ts index a24ed7ce..5374b0a5 100644 --- a/functions/post-order.ts +++ b/functions/post-order.ts @@ -6,12 +6,14 @@ import { validateEnvVars, validateRequestMethod } from "./validators"; import { TransactionReceipt, TransactionResponse } from "@ethersproject/providers"; import { permit2Abi } from "../static/scripts/rewards/abis/permit2Abi"; import { getTransactionFromOrderId } from "./get-order"; +import { giftCardTreasuryAddress, permit2Address } from "../shared/constants"; export const networkRpcs: Record = { 1: ["https://gateway.tenderly.co/public/mainnet"], 5: ["https://eth-goerli.public.blastapi.io"], 100: ["https://rpc.gnosischain.com"], 31337: ["http://127.0.0.1:8545"], + 31338: ["https://rpc.tenderly.co/fork/07e0d1c0-c5f5-4690-81ce-0676d0c8dbcd"], }; export const onRequest: PagesFunction = async (ctx) => { @@ -63,20 +65,16 @@ export const onRequest: PagesFunction = async (ctx) => { const errorResponse = Response.json({ message: "Transaction is not authorized to purchase gift card." }, { status: 403 }); - if (txReceipt.to != ctx.env.ADDRESS_PERMIT2) { - console.error( - "Given transaction hash is not an interaction with ctx.env.ADDRESS_PERMIT2", - `txReceipt.to=${txReceipt.to}`, - `ctx.env.ADDRESS_PERMIT2=${ctx.env.ADDRESS_PERMIT2}` - ); + if (txReceipt.to.toLowerCase() != permit2Address.toLowerCase()) { + console.error("Given transaction hash is not an interaction with permit2Address", `txReceipt.to=${txReceipt.to}`, `permit2Address=${permit2Address}`); return errorResponse; } - if (txParsed.args.transferDetails.to != ctx.env.ADDRESS_GIFT_CARD_TREASURY) { + if (txParsed.args.transferDetails.to.toLowerCase() != giftCardTreasuryAddress.toLowerCase()) { console.error( - "Given transaction hash is not a token transfer to ADDRESS_GIFT_CARD_TREASURY", + "Given transaction hash is not a token transfer to giftCardTreasuryAddress", `txParsed.args.transferDetails.to=${txParsed.args.transferDetails.to}`, - `ctx.env.ADDRESS_GIFT_CARD_TREASURY=${ctx.env.ADDRESS_GIFT_CARD_TREASURY}` + `giftCardTreasuryAddress=${giftCardTreasuryAddress}` ); return errorResponse; } diff --git a/functions/validators.ts b/functions/validators.ts index 042f144c..e7fa93fa 100644 --- a/functions/validators.ts +++ b/functions/validators.ts @@ -15,8 +15,8 @@ export function validateEnvVars(ctx) { if (typeof ctx.env.USE_RELOADLY_SANDBOX != "boolean") { throw new Error("USE_RELOADLY_SANDBOX env var must be set to boolean true or false."); } - if (!(ctx.env.RELOADLY_API_CLIENT_ID && ctx.env.RELOADLY_API_CLIENT_SECRET && ctx.env.ADDRESS_PERMIT2 && ctx.env.ADDRESS_GIFT_CARD_TREASURY)) { + if (!(ctx.env.RELOADLY_API_CLIENT_ID && ctx.env.RELOADLY_API_CLIENT_SECRET)) { console.error("One or more environment variable is missing."); - throw new Error("Missing server configuratinos."); + throw new Error("Missing server configurations."); } } diff --git a/shared/constants.ts b/shared/constants.ts new file mode 100644 index 00000000..40b01d7f --- /dev/null +++ b/shared/constants.ts @@ -0,0 +1,2 @@ +export const permit2Address = "0x000000000022D473030F116dDEE9F6B43aC78BA3"; +export const giftCardTreasuryAddress = "0x3B47E3e4758E133acf72684727Dc10550C40e4B9"; diff --git a/shared/helpers.ts b/shared/helpers.ts index 1ce28c36..cf63d5fd 100644 --- a/shared/helpers.ts +++ b/shared/helpers.ts @@ -3,11 +3,9 @@ import { BigNumber, BigNumberish, ethers } from "ethers"; import { formatEther, parseEther } from "ethers/lib/utils"; export interface Env { + USE_RELOADLY_SANDBOX: boolean; RELOADLY_API_CLIENT_ID: string; RELOADLY_API_CLIENT_SECRET: string; - ADDRESS_PERMIT2: string; - ADDRESS_GIFT_CARD_TREASURY: string; - USE_RELOADLY_SANDBOX: boolean; } export type ReloadlyAuthResponse = { diff --git a/static/scripts/rewards/constants.ts b/static/scripts/rewards/constants.ts index 2505023e..6c772a56 100644 --- a/static/scripts/rewards/constants.ts +++ b/static/scripts/rewards/constants.ts @@ -52,6 +52,4 @@ export const networkRpcs: Record = { [NetworkIds.Anvil]: ["http://127.0.0.1:8545"], }; -export const permit2Address = "0x000000000022D473030F116dDEE9F6B43aC78BA3"; const nftAddress = "0xAa1bfC0e51969415d64d6dE74f27CDa0587e645b"; -export const giftCardTreasuryAddress = "0x3B47E3e4758E133acf72684727Dc10550C40e4B9"; diff --git a/static/scripts/rewards/gift-cards/claim/claim-action.ts b/static/scripts/rewards/gift-cards/claim/claim-action.ts index b3bf7620..230f0338 100644 --- a/static/scripts/rewards/gift-cards/claim/claim-action.ts +++ b/static/scripts/rewards/gift-cards/claim/claim-action.ts @@ -1,7 +1,8 @@ import { ethers } from "ethers"; import { permit2Abi } from "../../abis"; import { AppState } from "../../app-state"; -import { giftCardTreasuryAddress, permit2Address } from "../../constants"; +import { permit2Address } from "../../../../../shared/constants"; +import { giftCardTreasuryAddress } from "../../../../../shared/constants"; import { toaster } from "../../toaster"; import { isNonceClaimed, transferFromPermit, waitForTransaction } from "../../web3/erc20-permit"; import { getApiBaseUrl } from "../helpers"; diff --git a/wrangler.toml b/wrangler.toml index e63c6599..bfa42f37 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -4,6 +4,4 @@ compatibility_date = "2024-04-05" [vars] USE_RELOADLY_SANDBOX = true RELOADLY_API_CLIENT_ID = "" -RELOADLY_API_CLIENT_SECRET = "" -ADDRESS_PERMIT2 = "0x000000000022D473030F116dDEE9F6B43aC78BA3" -ADDRESS_GIFT_CARD_TREASURY = "" +RELOADLY_API_CLIENT_SECRET = "" \ No newline at end of file From e0a787b6bdb56368a6181ef164c97c695c5614d8 Mon Sep 17 00:00:00 2001 From: EresDev Date: Tue, 14 May 2024 00:12:32 +0500 Subject: [PATCH 003/174] fix: compares owner address case insensitive --- static/scripts/rewards/gift-cards/claim/claim-action.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/scripts/rewards/gift-cards/claim/claim-action.ts b/static/scripts/rewards/gift-cards/claim/claim-action.ts index 230f0338..4cfc0e8e 100644 --- a/static/scripts/rewards/gift-cards/claim/claim-action.ts +++ b/static/scripts/rewards/gift-cards/claim/claim-action.ts @@ -31,7 +31,7 @@ export function attachClaimAction(className: string, giftcards: ReloadlyProduct[ async function claimGiftCard(productId: number, app: AppState) { if (app.signer) { - if ((await app.signer.getAddress()) != app.reward.beneficiary) { + if ((await app.signer.getAddress()).toLowerCase() != app.reward.beneficiary.toLowerCase()) { toaster.create("error", "The connected wallet is not the beneficiary of the reward."); return; } From 7a61714edd1e5e8d0f02f83f09d7fe324dae2ec7 Mon Sep 17 00:00:00 2001 From: EresDev Date: Tue, 14 May 2024 00:38:10 +0500 Subject: [PATCH 004/174] fix: deduct fee from reward amount --- functions/post-order.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/functions/post-order.ts b/functions/post-order.ts index 5374b0a5..32cbce0f 100644 --- a/functions/post-order.ts +++ b/functions/post-order.ts @@ -1,6 +1,6 @@ import { JsonRpcProvider } from "@ethersproject/providers/lib/json-rpc-provider"; -import { Interface, formatEther } from "ethers/lib/utils"; -import { Env, getAccessToken, getBaseUrl, getGiftCardOrderId, isProductAvailableForAmount } from "../shared/helpers"; +import { Interface } from "ethers/lib/utils"; +import { Env, getAccessToken, getBaseUrl, getGiftCardOrderId, getProductValueAfterFee, isProductAvailableForAmount } from "../shared/helpers"; import { AccessToken, NotOkReloadlyApiResponse, OrderRequestParams, ReloadlyOrderResponse, ReloadlyProduct } from "../shared/types"; import { validateEnvVars, validateRequestMethod } from "./validators"; import { TransactionReceipt, TransactionResponse } from "@ethersproject/providers"; @@ -87,7 +87,8 @@ export const onRequest: PagesFunction = async (ctx) => { return errorResponse; } - const amountDai = formatEther(txParsed.args.transferDetails.requestedAmount); + const amountDai = txParsed.args.transferDetails.requestedAmount; + const gitCardValue = getProductValueAfterFee(product, amountDai); const orderId = getGiftCardOrderId(txReceipt.from, txParsed.args.signature); @@ -96,7 +97,7 @@ export const onRequest: PagesFunction = async (ctx) => { return Response.json({ message: "The permit has already claimed a gift card." }, { status: 400 }); } - const order = await orderGiftCard(productId, amountDai, orderId, accessToken); + const order = await orderGiftCard(productId, gitCardValue, orderId, accessToken); if (order.status == "SUCCESSFUL") { return Response.json(order, { status: 200 }); @@ -137,14 +138,14 @@ const getProductById = async (productId: number, accessToken: AccessToken) => { return responseJson as ReloadlyProduct; }; -const orderGiftCard = async (productId: number, amount: string, identifier: string, accessToken: AccessToken) => { +const orderGiftCard = async (productId: number, cardValue: number, identifier: string, accessToken: AccessToken) => { const url = `${getBaseUrl(accessToken.isSandbox)}/orders`; console.log(`Placing order at url: ${url}`); const requestBody = JSON.stringify({ productId: productId, quantity: 1, - unitPrice: amount, + unitPrice: cardValue, customIdentifier: identifier, preOrder: false, }); From abf145fb2885300922716313f84e17d29780edb9 Mon Sep 17 00:00:00 2001 From: EresDev Date: Tue, 14 May 2024 00:59:37 +0500 Subject: [PATCH 005/174] fix: show unavailable range cards price correctly --- static/scripts/rewards/gift-cards/gift-card.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/static/scripts/rewards/gift-cards/gift-card.ts b/static/scripts/rewards/gift-cards/gift-card.ts index c07ad8a5..5219f108 100644 --- a/static/scripts/rewards/gift-cards/gift-card.ts +++ b/static/scripts/rewards/gift-cards/gift-card.ts @@ -1,6 +1,6 @@ import { BigNumberish } from "ethers"; import { ReloadlyProduct } from "../../../../shared/types"; -import { getProductValueAfterFee, isProductAvailableForAmount } from "../../../../shared/helpers"; +import { addProductFeesToPrice, getProductValueAfterFee, isProductAvailableForAmount } from "../../../../shared/helpers"; import { getFixedPricesAndValues } from "./helpers"; import { formatEther } from "ethers/lib/utils"; @@ -60,17 +60,15 @@ export function getGiftCardHtml(giftcard: ReloadlyProduct, allowBuy: boolean, re
Value
${getFixedPricesAndValues(giftcard)}` - : `
-
Price
-
${giftcard.minSenderDenomination}-${giftcard.maxSenderDenomination}${giftcard.senderCurrencyCode}
-
+ : `
Value
${giftcard.minRecipientDenomination}-${giftcard.maxRecipientDenomination}${giftcard.recipientCurrencyCode}
+
-
Fee
-
(${giftcard.senderFee}${giftcard.senderCurrencyCode}+${giftcard.senderFeePercentage}%fee)
+
Price
+
${addProductFeesToPrice(giftcard, giftcard.minSenderDenomination)}-${addProductFeesToPrice(giftcard, giftcard.maxSenderDenomination)}${giftcard.senderCurrencyCode}
` }`} From 2aada64a2f9fa2da9d8471be73ea78308cef4a3b Mon Sep 17 00:00:00 2001 From: EresDev Date: Tue, 14 May 2024 01:02:50 +0500 Subject: [PATCH 006/174] refactor: rename func to clear its effect --- shared/helpers.ts | 4 ++-- static/scripts/rewards/gift-cards/gift-card.ts | 4 ++-- static/scripts/rewards/gift-cards/helpers.ts | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/shared/helpers.ts b/shared/helpers.ts index cf63d5fd..8b7262d6 100644 --- a/shared/helpers.ts +++ b/shared/helpers.ts @@ -73,8 +73,8 @@ export function getProductValueAfterFee(product: ReloadlyProduct, rewardAmount: return Number(formatEther(remainingValue)); } -export function addProductFeesToPrice(product: ReloadlyProduct, price: number) { - const priceEth = parseEther(price.toString()); +export function addProductFeesToValue(product: ReloadlyProduct, value: number) { + const priceEth = parseEther(value.toString()); const productFeePercentageEth = parseEther(product.senderFeePercentage.toString()); const senderFeeFixed = parseEther(product.senderFee.toString()); diff --git a/static/scripts/rewards/gift-cards/gift-card.ts b/static/scripts/rewards/gift-cards/gift-card.ts index 5219f108..6408bb33 100644 --- a/static/scripts/rewards/gift-cards/gift-card.ts +++ b/static/scripts/rewards/gift-cards/gift-card.ts @@ -1,6 +1,6 @@ import { BigNumberish } from "ethers"; import { ReloadlyProduct } from "../../../../shared/types"; -import { addProductFeesToPrice, getProductValueAfterFee, isProductAvailableForAmount } from "../../../../shared/helpers"; +import { addProductFeesToValue, getProductValueAfterFee, isProductAvailableForAmount } from "../../../../shared/helpers"; import { getFixedPricesAndValues } from "./helpers"; import { formatEther } from "ethers/lib/utils"; @@ -68,7 +68,7 @@ export function getGiftCardHtml(giftcard: ReloadlyProduct, allowBuy: boolean, re
Price
-
${addProductFeesToPrice(giftcard, giftcard.minSenderDenomination)}-${addProductFeesToPrice(giftcard, giftcard.maxSenderDenomination)}${giftcard.senderCurrencyCode}
+
${addProductFeesToValue(giftcard, giftcard.minSenderDenomination)}-${addProductFeesToValue(giftcard, giftcard.maxSenderDenomination)}${giftcard.senderCurrencyCode}
` }`} diff --git a/static/scripts/rewards/gift-cards/helpers.ts b/static/scripts/rewards/gift-cards/helpers.ts index d3978964..1f4e3037 100644 --- a/static/scripts/rewards/gift-cards/helpers.ts +++ b/static/scripts/rewards/gift-cards/helpers.ts @@ -1,4 +1,4 @@ -import { addProductFeesToPrice } from "../../../../shared/helpers"; +import { addProductFeesToValue } from "../../../../shared/helpers"; import { ReloadlyProduct } from "../../../../shared/types"; export function getApiBaseUrl() { @@ -8,7 +8,7 @@ export function getApiBaseUrl() { export function getFixedPricesAndValues(giftcard: ReloadlyProduct) { let html = ""; giftcard.fixedSenderDenominations.forEach((priceWithoutFee, i) => { - const price = addProductFeesToPrice(giftcard, priceWithoutFee); + const price = addProductFeesToValue(giftcard, priceWithoutFee); html += `
${price.toFixed(1)}${giftcard.senderCurrencyCode}
${giftcard.fixedRecipientDenominations[i].toFixed(1)}${giftcard.recipientCurrencyCode}
`; }); return html; From 52c0979e3362716ca629b066204628cd5f589baf Mon Sep 17 00:00:00 2001 From: EresDev Date: Thu, 16 May 2024 14:41:41 +0500 Subject: [PATCH 007/174] fix: use correct pricing for gift card --- functions/helpers.ts | 1 + functions/post-order.ts | 57 +++++-- shared/helpers.ts | 157 +++++++++++++++--- shared/types.ts | 13 +- .../scripts/rewards/gift-cards/gift-card.ts | 95 ++++++----- static/scripts/rewards/gift-cards/helpers.ts | 12 -- .../rewards/gift-cards/list-gift-cards.ts | 1 + static/scripts/rewards/web3/erc20-permit.ts | 2 +- static/styles/rewards/gift-cards.css | 3 + 9 files changed, 257 insertions(+), 84 deletions(-) create mode 100644 functions/helpers.ts diff --git a/functions/helpers.ts b/functions/helpers.ts new file mode 100644 index 00000000..a6e20e9a --- /dev/null +++ b/functions/helpers.ts @@ -0,0 +1 @@ +export const ACCEPT_HEADAER_VALUE = "application/com.reloadly.giftcards-v1+json"; diff --git a/functions/post-order.ts b/functions/post-order.ts index 32cbce0f..bb37fc40 100644 --- a/functions/post-order.ts +++ b/functions/post-order.ts @@ -1,12 +1,13 @@ +import { TransactionReceipt, TransactionResponse } from "@ethersproject/providers"; import { JsonRpcProvider } from "@ethersproject/providers/lib/json-rpc-provider"; import { Interface } from "ethers/lib/utils"; -import { Env, getAccessToken, getBaseUrl, getGiftCardOrderId, getProductValueAfterFee, isProductAvailableForAmount } from "../shared/helpers"; -import { AccessToken, NotOkReloadlyApiResponse, OrderRequestParams, ReloadlyOrderResponse, ReloadlyProduct } from "../shared/types"; -import { validateEnvVars, validateRequestMethod } from "./validators"; -import { TransactionReceipt, TransactionResponse } from "@ethersproject/providers"; +import { giftCardTreasuryAddress, permit2Address } from "../shared/constants"; +import { Env, getAccessToken, getBaseUrl, getGiftCardOrderId, isProductAvailableForAmount, getProductValue } from "../shared/helpers"; +import { AccessToken, ExchangeRate, NotOkReloadlyApiResponse, OrderRequestParams, ReloadlyOrderResponse, ReloadlyProduct } from "../shared/types"; import { permit2Abi } from "../static/scripts/rewards/abis/permit2Abi"; import { getTransactionFromOrderId } from "./get-order"; -import { giftCardTreasuryAddress, permit2Address } from "../shared/constants"; +import { validateEnvVars, validateRequestMethod } from "./validators"; +import { ACCEPT_HEADAER_VALUE } from "./helpers"; export const networkRpcs: Record = { 1: ["https://gateway.tenderly.co/public/mainnet"], @@ -87,8 +88,14 @@ export const onRequest: PagesFunction = async (ctx) => { return errorResponse; } - const amountDai = txParsed.args.transferDetails.requestedAmount; - const gitCardValue = getProductValueAfterFee(product, amountDai); + const amountDaiWei = txParsed.args.transferDetails.requestedAmount; + + let exchangeRate = 1; + if (product.recipientCurrencyCode != "USD") { + const exchangeRateResponse = await getExchangeRate(1, product.recipientCurrencyCode, accessToken); + exchangeRate = exchangeRateResponse.senderAmount; + } + const productValue = getProductValue(product, amountDaiWei, exchangeRate); const orderId = getGiftCardOrderId(txReceipt.from, txParsed.args.signature); @@ -97,7 +104,7 @@ export const onRequest: PagesFunction = async (ctx) => { return Response.json({ message: "The permit has already claimed a gift card." }, { status: 400 }); } - const order = await orderGiftCard(productId, gitCardValue, orderId, accessToken); + const order = await orderGiftCard(productId, productValue, orderId, accessToken); if (order.status == "SUCCESSFUL") { return Response.json(order, { status: 200 }); @@ -116,7 +123,7 @@ const getProductById = async (productId: number, accessToken: AccessToken) => { const options = { method: "GET", headers: { - Accept: "application/com.reloadly.giftcards-v1+json", + Accept: ACCEPT_HEADAER_VALUE, Authorization: `Bearer ${accessToken.token}`, }, }; @@ -145,7 +152,7 @@ const orderGiftCard = async (productId: number, cardValue: number, identifier: s const requestBody = JSON.stringify({ productId: productId, quantity: 1, - unitPrice: cardValue, + unitPrice: cardValue.toFixed(2), customIdentifier: identifier, preOrder: false, }); @@ -157,7 +164,7 @@ const orderGiftCard = async (productId: number, cardValue: number, identifier: s method: "POST", headers: { "Content-Type": "application/json", - Accept: "application/com.reloadly.giftcards-v1+json", + Accept: ACCEPT_HEADAER_VALUE, Authorization: `Bearer ${accessToken.token}`, }, body: requestBody, @@ -189,3 +196,31 @@ async function isDuplicateOrder(orderId: string, accessToken: AccessToken) { return false; } } + +async function getExchangeRate(usdAmount: number, fromCurrency: string, accessToken: AccessToken) { + const url = `${getBaseUrl(accessToken.isSandbox)}/fx-rate?currencyCode=${fromCurrency}&amount=${usdAmount}`; + console.log(`Retrieving products from ${url}`); + const options = { + method: "GET", + headers: { + Accept: ACCEPT_HEADAER_VALUE, + Authorization: `Bearer ${accessToken.token}`, + }, + }; + + const response = await fetch(url, options); + const responseJson = await response.json(); + + if (response.status != 200) { + throw new Error( + `Error from Reloadly API: ${JSON.stringify({ + status: response.status, + message: (responseJson as NotOkReloadlyApiResponse).message, + })}` + ); + } + console.log("Response status", response.status); + console.log(`Response from ${url}`, responseJson); + + return responseJson as ExchangeRate; +} diff --git a/shared/helpers.ts b/shared/helpers.ts index 8b7262d6..8c620d07 100644 --- a/shared/helpers.ts +++ b/shared/helpers.ts @@ -1,4 +1,4 @@ -import { AccessToken, ReloadlyProduct } from "./types"; +import { AccessToken, PriceToValueMap, ReloadlyProduct } from "./types"; import { BigNumber, BigNumberish, ethers } from "ethers"; import { formatEther, parseEther } from "ethers/lib/utils"; @@ -55,34 +55,147 @@ export function isProductAvailableForAmount(product: ReloadlyProduct, rewardAmou throw new Error(`Failed to validate price because product's senderCurrencyCode is not USD: ${JSON.stringify({ rewardAmount, product })}`); } - const value = getProductValueAfterFee(product, rewardAmount); + if (product.denominationType == "RANGE") { + return isRangePriceProductAvailable(product, rewardAmount); + } else if (product.denominationType == "FIXED") { + return isFixedPriceProductAvailable(product, rewardAmount); + } +} + +// For use in range price only +// Because reward = price is fixed +// But we can select aa value within the range +export function getValueAfterFeeAndDiscount(product: ReloadlyProduct, rewardAmount: BigNumberish) { + const rewardAmountWei = BigNumber.from(rewardAmount.toString()); + const productFeePercentageWei = parseEther(product.senderFeePercentage.toString()); + const senderFeeFixedWei = parseEther(product.senderFee.toString()); + const senderFeePercentageWei = rewardAmountWei.mul(productFeePercentageWei).div(100); + const totalFeeWei = senderFeePercentageWei.add(senderFeeFixedWei); + + const discountPercentageWei = parseEther(product.discountPercentage.toString()); + const discountWei = rewardAmountWei.mul(discountPercentageWei).div(100); + + const value = rewardAmountWei.add(discountWei).sub(totalFeeWei); + return Number(formatEther(value)); +} + +export function getEstimatedExchangeRate(product: ReloadlyProduct) { + let exchangeRate = 1; + if (product.recipientCurrencyCode != "USD") { + if (product.denominationType == "FIXED") { + const key = Object.keys(product.fixedRecipientToSenderDenominationsMap)[0]; + exchangeRate = product.fixedRecipientToSenderDenominationsMap[key] / Number(key); + } else { + exchangeRate = product.minSenderDenomination / product.minRecipientDenomination; + } + } + return exchangeRate; +} +export function getRangePriceToValueMap(product: ReloadlyProduct) { + // product.minRecipientDenomination, product.maxRecipientDenomination + // are the range of values the gift card is availble in + + // product.minSenderDenomination, product.maxSenderDenomination + // are the equivalent of available values range in our account currency USD + // they do no include any fees, and we must add fees/discounts + + // price = amount that is deducted from our reloadly USD acacount when a gift card is claimed + // value = amount the gift card holds, it can be any currency + + // price = value + percent discount of value - senderFee - percentFee of value + // value = price - percent discount of value + senderFee + percentFee of value + + const priceToValueMap: PriceToValueMap = {}; + + [product.minRecipientDenomination, product.maxRecipientDenomination].forEach((value) => { + const totalPrice = getTotalPriceOfValue(Number(value), product); + priceToValueMap[totalPrice.toFixed(2).toString()] = Number(value); + }); - return ( - (product.denominationType == "FIXED" && product.fixedSenderDenominations.includes(value)) || - (product.denominationType == "RANGE" && value >= product.minSenderDenomination && value <= product.maxSenderDenomination) - ); + return priceToValueMap; } -export function getProductValueAfterFee(product: ReloadlyProduct, rewardAmount: BigNumberish) { - const rewardAmountEth = BigNumber.from(rewardAmount.toString()); - const productFeePercentageEth = parseEther(product.senderFeePercentage.toString()); - const senderFeeFixed = parseEther(product.senderFee.toString()); - const senderFeePercentage = rewardAmountEth.mul(productFeePercentageEth).div(100); - const totalFee = senderFeePercentage.add(senderFeeFixed); - const remainingValue = rewardAmountEth.sub(totalFee); - return Number(formatEther(remainingValue)); +export function getTotalPriceOfValue(value: number, product: ReloadlyProduct) { + const exchangeRate = getEstimatedExchangeRate(product); + console.log(product.productId); + console.log(exchangeRate, value); + const usdValue = parseEther((exchangeRate * value).toString()); + + // multiply by extra 100 to support minimum upto 0.01% + // because we are using BigNumbers + const feePercentage = BigNumber.from((product.senderFeePercentage * 100).toString()); + const fee = usdValue.mul(feePercentage).div(100 * 100); + const totalFee = fee.add(parseEther(product.senderFee.toString())); + const discountPercent = BigNumber.from(Math.trunc(product.discountPercentage * 100).toString()); + const discount = usdValue.mul(discountPercent).div(100 * 100); + + return Number(formatEther(usdValue.add(totalFee).sub(discount))); +} + +export function getUsdValueForRangePrice(product: ReloadlyProduct, price: BigNumberish) { + // price = value + senderFee + feePercent - discountPercent + const priceWei = BigNumber.from(price.toString()); + const priceAfterFee = priceWei.sub(parseEther(product.senderFee.toString())); + + const feeDiscountPercentDiff = product.senderFeePercentage - product.discountPercentage; + // multiply by extra 100 to support minimum upto 0.01% + // because we are using BigNumbers + const feeDiscountPercentDiffWei = parseEther(Math.trunc(feeDiscountPercentDiff * 100).toString()); + const hundredPercent = parseEther((100 * 100).toString()); + const priceWithAddedPercentFromFees = hundredPercent.add(feeDiscountPercentDiffWei); + const usdValue = hundredPercent.mul(priceAfterFee).div(priceWithAddedPercentFromFees); + return Number(formatEther(usdValue)); +} + +export function isRangePriceProductAvailable(product: ReloadlyProduct, rewardAmount: BigNumberish) { + const value = Number(getProductValue(product, rewardAmount).toFixed(2)); + return value >= product.minRecipientDenomination && value <= product.maxRecipientDenomination; } -export function addProductFeesToValue(product: ReloadlyProduct, value: number) { - const priceEth = parseEther(value.toString()); - const productFeePercentageEth = parseEther(product.senderFeePercentage.toString()); +export function getFixedPriceToValueMap(product: ReloadlyProduct) { + const valueToPriceMap = product.fixedRecipientToSenderDenominationsMap; - const senderFeeFixed = parseEther(product.senderFee.toString()); - const senderFeePercentage = priceEth.mul(productFeePercentageEth).div(100); - const totalFee = senderFeePercentage.add(senderFeeFixed); + const priceToValueMap: PriceToValueMap = {}; + Object.keys(valueToPriceMap).forEach((value) => { + const totalPrice = getTotalPriceOfValue(Number(value), product); + priceToValueMap[totalPrice.toFixed(2).toString()] = Number(value); + }); - const priceWithFees = priceEth.add(totalFee); - return Number(formatEther(priceWithFees)); + return priceToValueMap; +} + +export function isFixedPriceProductAvailable(product: ReloadlyProduct, rewardAmount: BigNumberish) { + const priceToValueMap = getFixedPriceToValueMap(product); + const priceAsKey = Number(formatEther(rewardAmount)).toFixed(2).toString(); + return !!priceToValueMap[priceAsKey]; +} + +export function getProductValue(product: ReloadlyProduct, reward: BigNumberish, exchangeRate?: number) { + let productValue; + const amountDaiEth = Number(formatEther(reward)).toFixed(2); + if (product.denominationType == "FIXED") { + const priceToValueMap = getFixedPriceToValueMap(product); + productValue = priceToValueMap[amountDaiEth]; + } else if (product.denominationType == "RANGE") { + const usdValue = getUsdValueForRangePrice(product, reward); + if (!exchangeRate) { + exchangeRate = getEstimatedExchangeRate(product); + } + productValue = usdValue / exchangeRate; + console.log("usdValue", usdValue); + console.log("productValue", productValue); + } else { + throw new Error( + `Unknown denomination type of gift card: ${JSON.stringify({ + denominationType: product.denominationType, + })}` + ); + } + + if (!productValue) { + throw new Error(`Product is not available for the reward amount: ${JSON.stringify({ product, reward: reward })}`); + } + return productValue; } export function getGiftCardOrderId(rewardToAddress: string, signature: string) { diff --git a/shared/types.ts b/shared/types.ts index 183982bf..96badb0c 100644 --- a/shared/types.ts +++ b/shared/types.ts @@ -20,7 +20,7 @@ export type ReloadlyProduct = { maxSenderDenomination: number; fixedRecipientDenominations: number[]; fixedSenderDenominations: number[]; - fixedRecipientToSenderDenominationsMap: { string: number }; + fixedRecipientToSenderDenominationsMap: ValueToPriceMap; metadata?: object; logoUrls: string[]; brand: { @@ -37,6 +37,7 @@ export type ReloadlyProduct = { verbose: string; }; }; + export type ReloadlyListGiftCardResponse = { content: ReloadlyProduct[]; pageable: { @@ -153,3 +154,13 @@ export type OrderRequestParams = { txHash: string; chainId: number; }; + +export type ExchangeRate = { + senderCurrency: string; + senderAmount: number; + recipientCurrency: string; + recipientAmount: number; +}; + +export type PriceToValueMap = { [key: string]: number }; +export type ValueToPriceMap = { [key: string]: number }; diff --git a/static/scripts/rewards/gift-cards/gift-card.ts b/static/scripts/rewards/gift-cards/gift-card.ts index 6408bb33..f6f8907a 100644 --- a/static/scripts/rewards/gift-cards/gift-card.ts +++ b/static/scripts/rewards/gift-cards/gift-card.ts @@ -1,18 +1,17 @@ import { BigNumberish } from "ethers"; import { ReloadlyProduct } from "../../../../shared/types"; -import { addProductFeesToValue, getProductValueAfterFee, isProductAvailableForAmount } from "../../../../shared/helpers"; -import { getFixedPricesAndValues } from "./helpers"; +import { getFixedPriceToValueMap, getProductValue, getRangePriceToValueMap, isRangePriceProductAvailable } from "../../../../shared/helpers"; import { formatEther } from "ethers/lib/utils"; const html = String.raw; -export function getGiftCardHtml(giftcard: ReloadlyProduct, allowBuy: boolean, rewardAmount: BigNumberish) { +export function getGiftCardHtml(giftCard: ReloadlyProduct, allowBuy: boolean, rewardAmount: BigNumberish) { return html` -
+
-

${giftcard.productName.length > 16 ? giftcard.productName.substring(0, 16) + "..." : giftcard.productName}

+

${giftCard.productName.length > 16 ? giftCard.productName.substring(0, 16) + "..." : giftCard.productName}

- ${giftcard.productName} + ${giftCard.productName}

@@ -41,39 +40,61 @@ export function getGiftCardHtml(giftcard: ReloadlyProduct, allowBuy: boolean, re : ``}
-
- ${isProductAvailableForAmount(giftcard, rewardAmount) - ? ` -
-
Price
-
Value
-
-
-
${Number(formatEther(rewardAmount)).toFixed(1)}${giftcard.senderCurrencyCode}
-
${getProductValueAfterFee(giftcard, rewardAmount).toFixed(1)}${giftcard.senderCurrencyCode}
-
- ` - : `${ - giftcard.denominationType == "FIXED" - ? `
-
Price
-
Value
-
- ${getFixedPricesAndValues(giftcard)}` - : ` -
-
Value
-
${giftcard.minRecipientDenomination}-${giftcard.maxRecipientDenomination}${giftcard.recipientCurrencyCode}
-
- -
-
Price
-
${addProductFeesToValue(giftcard, giftcard.minSenderDenomination)}-${addProductFeesToValue(giftcard, giftcard.maxSenderDenomination)}${giftcard.senderCurrencyCode}
-
- ` - }`} +
+ ${giftCard.denominationType == "FIXED" ? getFixedPricesHtml(giftCard, rewardAmount) : getRangePricesHtml(giftCard, rewardAmount)}
`; } + +function getFixedPricesHtml(giftCard: ReloadlyProduct, rewardAmount: BigNumberish) { + let _html = html`
+
Price
+
Value
+
`; + + const priceToValueMap = getFixedPriceToValueMap(giftCard); + const priceAsKey = Number(formatEther(rewardAmount)).toFixed(2).toString(); + + Object.keys(priceToValueMap).forEach((price) => { + const _class = price == priceAsKey ? ` class="available"` : ``; + _html += html` +
${price}${giftCard.senderCurrencyCode}
+
${priceToValueMap[price]}${giftCard.recipientCurrencyCode}
+
`; + }); + return _html; +} + +function getRangePricesHtml(giftCard: ReloadlyProduct, rewardAmount: BigNumberish) { + let _html = ``; + const productValue = getProductValue(giftCard, rewardAmount); + const isAvailable = isRangePriceProductAvailable(giftCard, rewardAmount); + if (isAvailable) { + _html += html`
+
Price
+
Value
+
+
+
${formatEther(rewardAmount)}${giftCard.senderCurrencyCode}
+
${productValue.toFixed(2)}${giftCard.recipientCurrencyCode}

Availble in range

`; + } + + const priceToValueMap = getRangePriceToValueMap(giftCard); + const prices = Object.keys(priceToValueMap); + + _html += html` +
+
Value
+
${giftCard.minRecipientDenomination.toFixed(2)}-${giftCard.maxRecipientDenomination}${giftCard.recipientCurrencyCode}
+
+
+
Price
+
${prices[0]}-${prices[1]}${giftCard.senderCurrencyCode}
+
+ `; + + return _html; +} diff --git a/static/scripts/rewards/gift-cards/helpers.ts b/static/scripts/rewards/gift-cards/helpers.ts index 1f4e3037..af48e3f7 100644 --- a/static/scripts/rewards/gift-cards/helpers.ts +++ b/static/scripts/rewards/gift-cards/helpers.ts @@ -1,15 +1,3 @@ -import { addProductFeesToValue } from "../../../../shared/helpers"; -import { ReloadlyProduct } from "../../../../shared/types"; - export function getApiBaseUrl() { return ""; } - -export function getFixedPricesAndValues(giftcard: ReloadlyProduct) { - let html = ""; - giftcard.fixedSenderDenominations.forEach((priceWithoutFee, i) => { - const price = addProductFeesToValue(giftcard, priceWithoutFee); - html += `
${price.toFixed(1)}${giftcard.senderCurrencyCode}
${giftcard.fixedRecipientDenominations[i].toFixed(1)}${giftcard.recipientCurrencyCode}
`; - }); - return html; -} diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index 0da8ffc2..55148696 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -63,6 +63,7 @@ export async function initCollectGiftCard(app: AppState) { giftCardsHtml += getGiftCardHtml(giftcard, true, app.reward.amount); }); giftCardsHtml += `
`; + giftCardsHtml += `

*The value of a claimed card can be slightly different due to exchange rate.

`; giftCardsSection.innerHTML = giftCardsHtml; let activateInfoHtml = ""; diff --git a/static/scripts/rewards/web3/erc20-permit.ts b/static/scripts/rewards/web3/erc20-permit.ts index 63b83723..6c3ccaaf 100644 --- a/static/scripts/rewards/web3/erc20-permit.ts +++ b/static/scripts/rewards/web3/erc20-permit.ts @@ -3,7 +3,7 @@ import { Permit } from "@ubiquibot/permit-generation/types"; import { BigNumber, BigNumberish, Contract, ethers } from "ethers"; import { erc20Abi, permit2Abi } from "../abis"; import { app, AppState } from "../app-state"; -import { permit2Address } from "../constants"; +import { permit2Address } from "../../../../shared/constants"; import { supabase } from "../render-transaction/read-claim-data-from-url"; import { buttonController, errorToast, getMakeClaimButton, MetaMaskError, toaster } from "../toaster"; diff --git a/static/styles/rewards/gift-cards.css b/static/styles/rewards/gift-cards.css index 8fb57385..202a9fe4 100644 --- a/static/styles/rewards/gift-cards.css +++ b/static/styles/rewards/gift-cards.css @@ -92,6 +92,9 @@ main:has(#gift-cards .product) div:has(table.receipt) { display: flex; flex-direction: column; } +.product .pricing .available { + color: #fff; +} .product .pricing div { display: flex; flex-direction: row; From f1d58c3f166ef2deecfb3c8c760860df8a0b2b4b Mon Sep 17 00:00:00 2001 From: EresDev Date: Thu, 16 May 2024 20:48:54 +0500 Subject: [PATCH 008/174] refactor: move pricing & duplicatre code to proper files/vars --- functions/get-order.ts | 7 +- functions/get-redeem-code.ts | 8 +- functions/helpers.ts | 50 ++++- functions/list-gift-cards.ts | 7 +- functions/post-order.ts | 15 +- functions/types.ts | 4 + shared/helpers.ts | 200 +----------------- shared/pricing.ts | 148 +++++++++++++ shared/types.ts | 5 - .../rewards/gift-cards/claim/claim-action.ts | 2 +- .../scripts/rewards/gift-cards/gift-card.ts | 2 +- 11 files changed, 225 insertions(+), 223 deletions(-) create mode 100644 functions/types.ts create mode 100644 shared/pricing.ts diff --git a/functions/get-order.ts b/functions/get-order.ts index 90b487f1..4dc2a0a4 100644 --- a/functions/get-order.ts +++ b/functions/get-order.ts @@ -1,6 +1,7 @@ -import { Env, getAccessToken, getBaseUrl } from "../shared/helpers"; -import { AccessToken, NotOkReloadlyApiResponse, ReloadlyGetTransactionResponse } from "../shared/types"; +import { Env, getAccessToken, getBaseUrl, commonHeaders } from "./helpers"; +import { NotOkReloadlyApiResponse, ReloadlyGetTransactionResponse } from "../shared/types"; import { validateEnvVars, validateRequestMethod } from "./validators"; +import { AccessToken } from "./types"; export const onRequest: PagesFunction = async (ctx) => { try { @@ -35,7 +36,7 @@ export const getTransactionFromOrderId = async (orderId: string, accessToken: Ac const options = { method: "GET", headers: { - Accept: "application/com.reloadly.giftcards-v1+json", + ...commonHeaders, Authorization: `Bearer ${accessToken.token}`, }, }; diff --git a/functions/get-redeem-code.ts b/functions/get-redeem-code.ts index 82365d11..5beaaffe 100644 --- a/functions/get-redeem-code.ts +++ b/functions/get-redeem-code.ts @@ -1,8 +1,10 @@ -import { Env, getAccessToken, getBaseUrl, getGiftCardOrderId, getMessageToSign } from "../shared/helpers"; -import { AccessToken, NotOkReloadlyApiResponse, ReloadlyRedeemCodeResponse } from "../shared/types"; +import { getGiftCardOrderId, getMessageToSign } from "../shared/helpers"; +import { NotOkReloadlyApiResponse, ReloadlyRedeemCodeResponse } from "../shared/types"; import { verifyMessage } from "ethers/lib/utils"; import { getTransactionFromOrderId } from "./get-order"; import { validateEnvVars, validateRequestMethod } from "./validators"; +import { Env, getAccessToken, getBaseUrl, commonHeaders } from "./helpers"; +import { AccessToken } from "./types"; export const onRequest: PagesFunction = async (ctx) => { try { @@ -68,7 +70,7 @@ export const getRedeemCode = async (transactionId: number, accessToken: AccessTo const options = { method: "GET", headers: { - Accept: "application/com.reloadly.giftcards-v1+json", + ...commonHeaders, Authorization: `Bearer ${accessToken.token}`, }, }; diff --git a/functions/helpers.ts b/functions/helpers.ts index a6e20e9a..6d2e1a45 100644 --- a/functions/helpers.ts +++ b/functions/helpers.ts @@ -1 +1,49 @@ -export const ACCEPT_HEADAER_VALUE = "application/com.reloadly.giftcards-v1+json"; +import { AccessToken } from "./types"; + +export const commonHeaders = { + "Content-Type": "application/json", + Accept: "application/com.reloadly.giftcards-v1+json", +}; +export interface Env { + USE_RELOADLY_SANDBOX: boolean; + RELOADLY_API_CLIENT_ID: string; + RELOADLY_API_CLIENT_SECRET: string; +} + +export type ReloadlyAuthResponse = { + access_token: string; + scope: string; + expires_in: number; + token_type: string; +}; + +export async function getAccessToken(env: Env): Promise { + const url = "https://auth.reloadly.com/oauth/token"; + const options = { + method: "POST", + headers: { "Content-Type": "application/json", Accept: "application/json" }, + body: JSON.stringify({ + client_id: env.RELOADLY_API_CLIENT_ID, + client_secret: env.RELOADLY_API_CLIENT_SECRET, + grant_type: "client_credentials", + audience: env.USE_RELOADLY_SANDBOX === false ? "https://giftcards.reloadly.com" : "https://giftcards-sandbox.reloadly.com", + }), + }; + + const res = await fetch(url, options); + if (res.status == 200) { + const successResponse = (await res.json()) as ReloadlyAuthResponse; + return { + token: successResponse.access_token, + isSandbox: env.USE_RELOADLY_SANDBOX !== false, + }; + } + throw `Getting access token failed: ${JSON.stringify(await res.json())}`; +} + +export function getBaseUrl(isSandbox: boolean): string { + if (isSandbox === false) { + return "https://giftcards.reloadly.com"; + } + return "https://giftcards-sandbox.reloadly.com"; +} diff --git a/functions/list-gift-cards.ts b/functions/list-gift-cards.ts index c6804c94..6d7e7edf 100644 --- a/functions/list-gift-cards.ts +++ b/functions/list-gift-cards.ts @@ -1,5 +1,6 @@ -import { Env, getAccessToken, getBaseUrl } from "../shared/helpers"; -import { AccessToken, NotOkReloadlyApiResponse, ReloadlyListGiftCardResponse } from "../shared/types"; +import { NotOkReloadlyApiResponse, ReloadlyListGiftCardResponse } from "../shared/types"; +import { Env, getAccessToken, getBaseUrl, commonHeaders } from "./helpers"; +import { AccessToken } from "./types"; import { validateEnvVars, validateRequestMethod } from "./validators"; export const onRequest: PagesFunction = async (ctx) => { @@ -28,7 +29,7 @@ const getProducts = async (productQuery: string, accessToken: AccessToken) => { const options = { method: "GET", headers: { - Accept: "application/com.reloadly.giftcards-v1+json", + ...commonHeaders, Authorization: `Bearer ${accessToken.token}`, }, }; diff --git a/functions/post-order.ts b/functions/post-order.ts index bb37fc40..58d94d5f 100644 --- a/functions/post-order.ts +++ b/functions/post-order.ts @@ -2,12 +2,14 @@ import { TransactionReceipt, TransactionResponse } from "@ethersproject/provider import { JsonRpcProvider } from "@ethersproject/providers/lib/json-rpc-provider"; import { Interface } from "ethers/lib/utils"; import { giftCardTreasuryAddress, permit2Address } from "../shared/constants"; -import { Env, getAccessToken, getBaseUrl, getGiftCardOrderId, isProductAvailableForAmount, getProductValue } from "../shared/helpers"; -import { AccessToken, ExchangeRate, NotOkReloadlyApiResponse, OrderRequestParams, ReloadlyOrderResponse, ReloadlyProduct } from "../shared/types"; +import { getGiftCardOrderId } from "../shared/helpers"; +import { ExchangeRate, NotOkReloadlyApiResponse, OrderRequestParams, ReloadlyOrderResponse, ReloadlyProduct } from "../shared/types"; import { permit2Abi } from "../static/scripts/rewards/abis/permit2Abi"; import { getTransactionFromOrderId } from "./get-order"; import { validateEnvVars, validateRequestMethod } from "./validators"; -import { ACCEPT_HEADAER_VALUE } from "./helpers"; +import { Env, commonHeaders, getAccessToken, getBaseUrl } from "./helpers"; +import { AccessToken } from "./types"; +import { getProductValue, isProductAvailableForAmount } from "../shared/pricing"; export const networkRpcs: Record = { 1: ["https://gateway.tenderly.co/public/mainnet"], @@ -123,7 +125,7 @@ const getProductById = async (productId: number, accessToken: AccessToken) => { const options = { method: "GET", headers: { - Accept: ACCEPT_HEADAER_VALUE, + ...commonHeaders, Authorization: `Bearer ${accessToken.token}`, }, }; @@ -163,8 +165,7 @@ const orderGiftCard = async (productId: number, cardValue: number, identifier: s const options = { method: "POST", headers: { - "Content-Type": "application/json", - Accept: ACCEPT_HEADAER_VALUE, + ...commonHeaders, Authorization: `Bearer ${accessToken.token}`, }, body: requestBody, @@ -203,7 +204,7 @@ async function getExchangeRate(usdAmount: number, fromCurrency: string, accessTo const options = { method: "GET", headers: { - Accept: ACCEPT_HEADAER_VALUE, + ...commonHeaders, Authorization: `Bearer ${accessToken.token}`, }, }; diff --git a/functions/types.ts b/functions/types.ts new file mode 100644 index 00000000..0dff4b0a --- /dev/null +++ b/functions/types.ts @@ -0,0 +1,4 @@ +export type AccessToken = { + token: string; + isSandbox: boolean; +}; diff --git a/shared/helpers.ts b/shared/helpers.ts index 8c620d07..c22b2c50 100644 --- a/shared/helpers.ts +++ b/shared/helpers.ts @@ -1,202 +1,4 @@ -import { AccessToken, PriceToValueMap, ReloadlyProduct } from "./types"; -import { BigNumber, BigNumberish, ethers } from "ethers"; -import { formatEther, parseEther } from "ethers/lib/utils"; - -export interface Env { - USE_RELOADLY_SANDBOX: boolean; - RELOADLY_API_CLIENT_ID: string; - RELOADLY_API_CLIENT_SECRET: string; -} - -export type ReloadlyAuthResponse = { - access_token: string; - scope: string; - expires_in: number; - token_type: string; -}; - -export function initEnv() { - // TODO: make sure env vars have values, and it is called everywhere needed -} - -export async function getAccessToken(env: Env): Promise { - const url = "https://auth.reloadly.com/oauth/token"; - const options = { - method: "POST", - headers: { "Content-Type": "application/json", Accept: "application/json" }, - body: JSON.stringify({ - client_id: env.RELOADLY_API_CLIENT_ID, - client_secret: env.RELOADLY_API_CLIENT_SECRET, - grant_type: "client_credentials", - audience: env.USE_RELOADLY_SANDBOX === false ? "https://giftcards.reloadly.com" : "https://giftcards-sandbox.reloadly.com", - }), - }; - - const res = await fetch(url, options); - if (res.status == 200) { - const successResponse = (await res.json()) as ReloadlyAuthResponse; - return { - token: successResponse.access_token, - isSandbox: env.USE_RELOADLY_SANDBOX !== false, - }; - } - throw `Getting access token failed: ${JSON.stringify(await res.json())}`; -} - -export function getBaseUrl(isSandbox: boolean): string { - if (isSandbox === false) { - return "https://giftcards.reloadly.com"; - } - return "https://giftcards-sandbox.reloadly.com"; -} - -export function isProductAvailableForAmount(product: ReloadlyProduct, rewardAmount: BigNumberish) { - if (product.senderCurrencyCode != "USD") { - throw new Error(`Failed to validate price because product's senderCurrencyCode is not USD: ${JSON.stringify({ rewardAmount, product })}`); - } - - if (product.denominationType == "RANGE") { - return isRangePriceProductAvailable(product, rewardAmount); - } else if (product.denominationType == "FIXED") { - return isFixedPriceProductAvailable(product, rewardAmount); - } -} - -// For use in range price only -// Because reward = price is fixed -// But we can select aa value within the range -export function getValueAfterFeeAndDiscount(product: ReloadlyProduct, rewardAmount: BigNumberish) { - const rewardAmountWei = BigNumber.from(rewardAmount.toString()); - const productFeePercentageWei = parseEther(product.senderFeePercentage.toString()); - const senderFeeFixedWei = parseEther(product.senderFee.toString()); - const senderFeePercentageWei = rewardAmountWei.mul(productFeePercentageWei).div(100); - const totalFeeWei = senderFeePercentageWei.add(senderFeeFixedWei); - - const discountPercentageWei = parseEther(product.discountPercentage.toString()); - const discountWei = rewardAmountWei.mul(discountPercentageWei).div(100); - - const value = rewardAmountWei.add(discountWei).sub(totalFeeWei); - return Number(formatEther(value)); -} - -export function getEstimatedExchangeRate(product: ReloadlyProduct) { - let exchangeRate = 1; - if (product.recipientCurrencyCode != "USD") { - if (product.denominationType == "FIXED") { - const key = Object.keys(product.fixedRecipientToSenderDenominationsMap)[0]; - exchangeRate = product.fixedRecipientToSenderDenominationsMap[key] / Number(key); - } else { - exchangeRate = product.minSenderDenomination / product.minRecipientDenomination; - } - } - return exchangeRate; -} -export function getRangePriceToValueMap(product: ReloadlyProduct) { - // product.minRecipientDenomination, product.maxRecipientDenomination - // are the range of values the gift card is availble in - - // product.minSenderDenomination, product.maxSenderDenomination - // are the equivalent of available values range in our account currency USD - // they do no include any fees, and we must add fees/discounts - - // price = amount that is deducted from our reloadly USD acacount when a gift card is claimed - // value = amount the gift card holds, it can be any currency - - // price = value + percent discount of value - senderFee - percentFee of value - // value = price - percent discount of value + senderFee + percentFee of value - - const priceToValueMap: PriceToValueMap = {}; - - [product.minRecipientDenomination, product.maxRecipientDenomination].forEach((value) => { - const totalPrice = getTotalPriceOfValue(Number(value), product); - priceToValueMap[totalPrice.toFixed(2).toString()] = Number(value); - }); - - return priceToValueMap; -} - -export function getTotalPriceOfValue(value: number, product: ReloadlyProduct) { - const exchangeRate = getEstimatedExchangeRate(product); - console.log(product.productId); - console.log(exchangeRate, value); - const usdValue = parseEther((exchangeRate * value).toString()); - - // multiply by extra 100 to support minimum upto 0.01% - // because we are using BigNumbers - const feePercentage = BigNumber.from((product.senderFeePercentage * 100).toString()); - const fee = usdValue.mul(feePercentage).div(100 * 100); - const totalFee = fee.add(parseEther(product.senderFee.toString())); - const discountPercent = BigNumber.from(Math.trunc(product.discountPercentage * 100).toString()); - const discount = usdValue.mul(discountPercent).div(100 * 100); - - return Number(formatEther(usdValue.add(totalFee).sub(discount))); -} - -export function getUsdValueForRangePrice(product: ReloadlyProduct, price: BigNumberish) { - // price = value + senderFee + feePercent - discountPercent - const priceWei = BigNumber.from(price.toString()); - const priceAfterFee = priceWei.sub(parseEther(product.senderFee.toString())); - - const feeDiscountPercentDiff = product.senderFeePercentage - product.discountPercentage; - // multiply by extra 100 to support minimum upto 0.01% - // because we are using BigNumbers - const feeDiscountPercentDiffWei = parseEther(Math.trunc(feeDiscountPercentDiff * 100).toString()); - const hundredPercent = parseEther((100 * 100).toString()); - const priceWithAddedPercentFromFees = hundredPercent.add(feeDiscountPercentDiffWei); - const usdValue = hundredPercent.mul(priceAfterFee).div(priceWithAddedPercentFromFees); - return Number(formatEther(usdValue)); -} - -export function isRangePriceProductAvailable(product: ReloadlyProduct, rewardAmount: BigNumberish) { - const value = Number(getProductValue(product, rewardAmount).toFixed(2)); - return value >= product.minRecipientDenomination && value <= product.maxRecipientDenomination; -} - -export function getFixedPriceToValueMap(product: ReloadlyProduct) { - const valueToPriceMap = product.fixedRecipientToSenderDenominationsMap; - - const priceToValueMap: PriceToValueMap = {}; - Object.keys(valueToPriceMap).forEach((value) => { - const totalPrice = getTotalPriceOfValue(Number(value), product); - priceToValueMap[totalPrice.toFixed(2).toString()] = Number(value); - }); - - return priceToValueMap; -} - -export function isFixedPriceProductAvailable(product: ReloadlyProduct, rewardAmount: BigNumberish) { - const priceToValueMap = getFixedPriceToValueMap(product); - const priceAsKey = Number(formatEther(rewardAmount)).toFixed(2).toString(); - return !!priceToValueMap[priceAsKey]; -} - -export function getProductValue(product: ReloadlyProduct, reward: BigNumberish, exchangeRate?: number) { - let productValue; - const amountDaiEth = Number(formatEther(reward)).toFixed(2); - if (product.denominationType == "FIXED") { - const priceToValueMap = getFixedPriceToValueMap(product); - productValue = priceToValueMap[amountDaiEth]; - } else if (product.denominationType == "RANGE") { - const usdValue = getUsdValueForRangePrice(product, reward); - if (!exchangeRate) { - exchangeRate = getEstimatedExchangeRate(product); - } - productValue = usdValue / exchangeRate; - console.log("usdValue", usdValue); - console.log("productValue", productValue); - } else { - throw new Error( - `Unknown denomination type of gift card: ${JSON.stringify({ - denominationType: product.denominationType, - })}` - ); - } - - if (!productValue) { - throw new Error(`Product is not available for the reward amount: ${JSON.stringify({ product, reward: reward })}`); - } - return productValue; -} +import { ethers } from "ethers"; export function getGiftCardOrderId(rewardToAddress: string, signature: string) { const checksumAddress = ethers.utils.getAddress(rewardToAddress); diff --git a/shared/pricing.ts b/shared/pricing.ts new file mode 100644 index 00000000..55d0ebb1 --- /dev/null +++ b/shared/pricing.ts @@ -0,0 +1,148 @@ +import { BigNumber, BigNumberish } from "ethers"; +import { formatEther, parseEther } from "ethers/lib/utils"; +import { PriceToValueMap, ReloadlyProduct } from "./types"; + +/** + * PRICE OF A GIFT CARD + * ==================== + * Price of a gift card is the amount that a user must pay to get the gift card. + * It includes fees and discounts. It is always in USD. No field in the Reloadly API + * provides exact price of gift card. It must be calculated manually from value of card, fees, and discount. + * price = value + percent discount of value - senderFee - percentFee of value + * + * VALUE OF A GIFT CARD + * ==================== + * Value of a gift is the amount that is available within the gift card. + * It can be in any currency. + * + * For fixed price products, the value is provided by following fields. + * Elements of ReloadlyProduct.fixedRecipientDenominations[] + * Keys of ReloadlyProduct.fixedRecipientToSenderDenominationsMap {}[] + * value = price - percent discount of value + senderFee + percentFee of value + * + * For ranged price products, the value is any amount between the following fields. + * ReloadlyProduct.minRecipientDenomination + * ReloadlyProduct.maxRecipientDenomination + * + * Following fields are the equivalent of available values range in our account currency (USD). + * ReloadlyProduct.minSenderDenomination + * ReloadlyProduct.maxSenderDenomination + * Values of ReloadlyProduct.fixedRecipientToSenderDenominationsMap{}[] + */ + +export function isProductAvailableForAmount(product: ReloadlyProduct, rewardAmount: BigNumberish) { + if (product.senderCurrencyCode != "USD") { + throw new Error(`Failed to validate price because product's senderCurrencyCode is not USD: ${JSON.stringify({ rewardAmount, product })}`); + } + + if (product.denominationType == "RANGE") { + return isRangePriceProductAvailable(product, rewardAmount); + } else if (product.denominationType == "FIXED") { + return isFixedPriceProductAvailable(product, rewardAmount); + } +} + +export function getEstimatedExchangeRate(product: ReloadlyProduct) { + let exchangeRate = 1; + if (product.recipientCurrencyCode != "USD") { + if (product.denominationType == "FIXED") { + const key = Object.keys(product.fixedRecipientToSenderDenominationsMap)[0]; + exchangeRate = product.fixedRecipientToSenderDenominationsMap[key] / Number(key); + } else { + exchangeRate = product.minSenderDenomination / product.minRecipientDenomination; + } + } + return exchangeRate; +} + +export function getTotalPriceOfValue(value: number, product: ReloadlyProduct) { + const exchangeRate = getEstimatedExchangeRate(product); + console.log(product.productId); + console.log(exchangeRate, value); + const usdValue = parseEther((exchangeRate * value).toString()); + + // multiply by extra 100 to support minimum upto 0.01% + // because we are using BigNumbers + const feePercentage = BigNumber.from((product.senderFeePercentage * 100).toString()); + const fee = usdValue.mul(feePercentage).div(100 * 100); + const totalFee = fee.add(parseEther(product.senderFee.toString())); + const discountPercent = BigNumber.from(Math.trunc(product.discountPercentage * 100).toString()); + const discount = usdValue.mul(discountPercent).div(100 * 100); + + return Number(formatEther(usdValue.add(totalFee).sub(discount))); +} + +export function getRangePriceToValueMap(product: ReloadlyProduct) { + const priceToValueMap: PriceToValueMap = {}; + + [product.minRecipientDenomination, product.maxRecipientDenomination].forEach((value) => { + const totalPrice = getTotalPriceOfValue(Number(value), product); + priceToValueMap[totalPrice.toFixed(2).toString()] = Number(value); + }); + + return priceToValueMap; +} + +export function getUsdValueForRangePrice(product: ReloadlyProduct, price: BigNumberish) { + // price = value + senderFee + feePercent - discountPercent + const priceWei = BigNumber.from(price.toString()); + const priceAfterFee = priceWei.sub(parseEther(product.senderFee.toString())); + + const feeDiscountPercentDiff = product.senderFeePercentage - product.discountPercentage; + // multiply by extra 100 to support minimum upto 0.01% + // because we are using BigNumbers + const feeDiscountPercentDiffWei = parseEther(Math.trunc(feeDiscountPercentDiff * 100).toString()); + const hundredPercent = parseEther((100 * 100).toString()); + const priceWithAddedPercentFromFees = hundredPercent.add(feeDiscountPercentDiffWei); + const usdValue = hundredPercent.mul(priceAfterFee).div(priceWithAddedPercentFromFees); + return Number(formatEther(usdValue)); +} + +export function isRangePriceProductAvailable(product: ReloadlyProduct, rewardAmount: BigNumberish) { + const value = Number(getProductValue(product, rewardAmount).toFixed(2)); + return value >= product.minRecipientDenomination && value <= product.maxRecipientDenomination; +} + +export function getFixedPriceToValueMap(product: ReloadlyProduct) { + const valueToPriceMap = product.fixedRecipientToSenderDenominationsMap; + + const priceToValueMap: PriceToValueMap = {}; + Object.keys(valueToPriceMap).forEach((value) => { + const totalPrice = getTotalPriceOfValue(Number(value), product); + priceToValueMap[totalPrice.toFixed(2).toString()] = Number(value); + }); + + return priceToValueMap; +} + +export function isFixedPriceProductAvailable(product: ReloadlyProduct, rewardAmount: BigNumberish) { + const priceToValueMap = getFixedPriceToValueMap(product); + const priceAsKey = Number(formatEther(rewardAmount)).toFixed(2).toString(); + return !!priceToValueMap[priceAsKey]; +} + +export function getProductValue(product: ReloadlyProduct, reward: BigNumberish, exchangeRate?: number) { + let productValue; + const amountDaiEth = Number(formatEther(reward)).toFixed(2); + if (product.denominationType == "FIXED") { + const priceToValueMap = getFixedPriceToValueMap(product); + productValue = priceToValueMap[amountDaiEth]; + } else if (product.denominationType == "RANGE") { + const usdValue = getUsdValueForRangePrice(product, reward); + if (!exchangeRate) { + exchangeRate = getEstimatedExchangeRate(product); + } + productValue = usdValue / exchangeRate; + } else { + throw new Error( + `Unknown denomination type of gift card: ${JSON.stringify({ + denominationType: product.denominationType, + })}` + ); + } + + if (!productValue) { + throw new Error(`Product is not available for the reward amount: ${JSON.stringify({ product, reward: reward })}`); + } + return productValue; +} diff --git a/shared/types.ts b/shared/types.ts index 96badb0c..df451b6f 100644 --- a/shared/types.ts +++ b/shared/types.ts @@ -1,8 +1,3 @@ -export type AccessToken = { - token: string; - isSandbox: boolean; -}; - export type ReloadlyProduct = { productId: number; productName: string; diff --git a/static/scripts/rewards/gift-cards/claim/claim-action.ts b/static/scripts/rewards/gift-cards/claim/claim-action.ts index 4cfc0e8e..4a5c26df 100644 --- a/static/scripts/rewards/gift-cards/claim/claim-action.ts +++ b/static/scripts/rewards/gift-cards/claim/claim-action.ts @@ -6,7 +6,7 @@ import { giftCardTreasuryAddress } from "../../../../../shared/constants"; import { toaster } from "../../toaster"; import { isNonceClaimed, transferFromPermit, waitForTransaction } from "../../web3/erc20-permit"; import { getApiBaseUrl } from "../helpers"; -import { isProductAvailableForAmount } from "../../../../../shared/helpers"; +import { isProductAvailableForAmount } from "../../../../../shared/pricing"; import { OrderRequestParams, ReloadlyProduct } from "../../../../../shared/types"; export function attachClaimAction(className: string, giftcards: ReloadlyProduct[], app: AppState) { diff --git a/static/scripts/rewards/gift-cards/gift-card.ts b/static/scripts/rewards/gift-cards/gift-card.ts index f6f8907a..7b4e30c3 100644 --- a/static/scripts/rewards/gift-cards/gift-card.ts +++ b/static/scripts/rewards/gift-cards/gift-card.ts @@ -1,6 +1,6 @@ import { BigNumberish } from "ethers"; import { ReloadlyProduct } from "../../../../shared/types"; -import { getFixedPriceToValueMap, getProductValue, getRangePriceToValueMap, isRangePriceProductAvailable } from "../../../../shared/helpers"; +import { getFixedPriceToValueMap, getProductValue, getRangePriceToValueMap, isRangePriceProductAvailable } from "../../../../shared/pricing"; import { formatEther } from "ethers/lib/utils"; const html = String.raw; From 9ebe8f002c01958c2085599c92747db88b9e8f83 Mon Sep 17 00:00:00 2001 From: EresDev Date: Thu, 16 May 2024 21:51:18 +0500 Subject: [PATCH 009/174] fix: offer only visa & mastercard --- functions/list-gift-cards.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/functions/list-gift-cards.ts b/functions/list-gift-cards.ts index 6d7e7edf..c31c62ef 100644 --- a/functions/list-gift-cards.ts +++ b/functions/list-gift-cards.ts @@ -10,8 +10,9 @@ export const onRequest: PagesFunction = async (ctx) => { const accessToken = await getAccessToken(ctx.env); - // TODO: load visa and mastercards only by default - const products = await getProducts("visa", accessToken); + const visaCards = await getProducts("visa", accessToken); + const masterCards = await getProducts("mastercard", accessToken); + const products = [...masterCards, ...visaCards]; if (products.length) { return Response.json(products, { status: 200 }); @@ -37,6 +38,13 @@ const getProducts = async (productQuery: string, accessToken: AccessToken) => { const response = await fetch(url, options); const responseJson = await response.json(); + console.log("Response status", response.status); + console.log(`Response from ${url}`, responseJson); + + if (response.status == 404) { + return []; + } + if (response.status != 200) { throw new Error( `Error from Reloadly API: ${JSON.stringify({ @@ -45,8 +53,6 @@ const getProducts = async (productQuery: string, accessToken: AccessToken) => { })}` ); } - console.log("Response status", response.status); - console.log(`Response from ${url}`, responseJson); return (responseJson as ReloadlyListGiftCardResponse).content; }; From 47e644e738b1979096ba777a7a4b59f105f8707a Mon Sep 17 00:00:00 2001 From: EresDev Date: Thu, 16 May 2024 22:03:13 +0500 Subject: [PATCH 010/174] fix: add disclaimer below gift cards list --- .../rewards/gift-cards/list-gift-cards.ts | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index 55148696..dc80e94e 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -9,6 +9,8 @@ import { getGiftCardActivateInfoHtml } from "./activate/activate-html"; import { getGiftCardHtml } from "./gift-card"; import { getRedeemCodeHtml } from "./reveal/redeem-code-html"; +const html = String.raw; + export async function initCollectGiftCard(app: AppState) { const retrieveOrderUrl = `${getApiBaseUrl()}/get-order?orderId=${getGiftCardOrderId(app.reward.beneficiary, app.reward.signature)}`; const listGiftCardsUrl = `${getApiBaseUrl()}/list-gift-cards`; @@ -62,8 +64,11 @@ export async function initCollectGiftCard(app: AppState) { giftcards.forEach((giftcard: ReloadlyProduct) => { giftCardsHtml += getGiftCardHtml(giftcard, true, app.reward.amount); }); - giftCardsHtml += ``; - giftCardsHtml += `

*The value of a claimed card can be slightly different due to exchange rate.

`; + giftCardsHtml += `
`; + giftCardsHtml += getDisclaimerHtml(); + giftCardsHtml += `

`; + giftCardsHtml += `

`; + giftCardsSection.innerHTML = giftCardsHtml; let activateInfoHtml = ""; @@ -79,3 +84,11 @@ export async function initCollectGiftCard(app: AppState) { attachActivateInfoAction(); } + +function getDisclaimerHtml() { + return html` +

Disclaimer

+

All visa/mastercards are non-exchangeable & non-refundable.

+

Exact value of a card can be slightly different due to exchange rate.

+ `; +} From 56cba033572e714dd6e9aa89ec3587049732169e Mon Sep 17 00:00:00 2001 From: EresDev Date: Thu, 16 May 2024 22:13:20 +0500 Subject: [PATCH 011/174] docs: add info about API base url --- static/scripts/rewards/gift-cards/helpers.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/static/scripts/rewards/gift-cards/helpers.ts b/static/scripts/rewards/gift-cards/helpers.ts index af48e3f7..282f8a50 100644 --- a/static/scripts/rewards/gift-cards/helpers.ts +++ b/static/scripts/rewards/gift-cards/helpers.ts @@ -1,3 +1,4 @@ export function getApiBaseUrl() { + // specify when backend functions and frontend are deployed to a different URL return ""; } From cf21902fa8fb513dd8416c2d09466ceb19c74a52 Mon Sep 17 00:00:00 2001 From: EresDev Date: Thu, 16 May 2024 22:50:38 +0500 Subject: [PATCH 012/174] fix: allow only ERC20 permit to claim card --- static/scripts/rewards/gift-cards/claim/claim-action.ts | 5 ++++- .../scripts/rewards/render-transaction/render-transaction.ts | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/static/scripts/rewards/gift-cards/claim/claim-action.ts b/static/scripts/rewards/gift-cards/claim/claim-action.ts index 4a5c26df..dae336d0 100644 --- a/static/scripts/rewards/gift-cards/claim/claim-action.ts +++ b/static/scripts/rewards/gift-cards/claim/claim-action.ts @@ -8,6 +8,7 @@ import { isNonceClaimed, transferFromPermit, waitForTransaction } from "../../we import { getApiBaseUrl } from "../helpers"; import { isProductAvailableForAmount } from "../../../../../shared/pricing"; import { OrderRequestParams, ReloadlyProduct } from "../../../../../shared/types"; +import { isErc20Permit } from "../../render-transaction/render-transaction"; export function attachClaimAction(className: string, giftcards: ReloadlyProduct[], app: AppState) { const claimButtons: HTMLCollectionOf = document.getElementsByClassName(className); @@ -18,7 +19,9 @@ export function attachClaimAction(className: string, giftcards: ReloadlyProduct[ const product = giftcards.find((product: ReloadlyProduct) => product.productId == productId); if (product) { - if (!isProductAvailableForAmount(product, app.reward.amount)) { + if (!isErc20Permit(app.reward)) { + toaster.create("error", "Only ERC20 permits are allowed to claim a card."); + } else if (!isProductAvailableForAmount(product, app.reward.amount)) { toaster.create("error", "Your reward amount is not equal to the price of available card."); } else { await claimGiftCard(productId, app); diff --git a/static/scripts/rewards/render-transaction/render-transaction.ts b/static/scripts/rewards/render-transaction/render-transaction.ts index d4a573f2..6b1f12da 100644 --- a/static/scripts/rewards/render-transaction/render-transaction.ts +++ b/static/scripts/rewards/render-transaction/render-transaction.ts @@ -79,6 +79,6 @@ export async function renderTransaction(): Promise { return true; } -function isErc20Permit(permit: Permit): permit is ERC20Permit { +export function isErc20Permit(permit: Permit): permit is ERC20Permit { return permit.tokenType === TokenType.ERC20; } From f056b9db564537111744e0d73409197d81177528 Mon Sep 17 00:00:00 2001 From: EresDev Date: Thu, 16 May 2024 23:16:10 +0500 Subject: [PATCH 013/174] fix: prevent large prices to take second line on cards list --- static/scripts/rewards/gift-cards/gift-card.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/static/scripts/rewards/gift-cards/gift-card.ts b/static/scripts/rewards/gift-cards/gift-card.ts index 7b4e30c3..e2ae2e22 100644 --- a/static/scripts/rewards/gift-cards/gift-card.ts +++ b/static/scripts/rewards/gift-cards/gift-card.ts @@ -60,8 +60,8 @@ function getFixedPricesHtml(giftCard: ReloadlyProduct, rewardAmount: BigNumberis Object.keys(priceToValueMap).forEach((price) => { const _class = price == priceAsKey ? ` class="available"` : ``; _html += html` -
${price}${giftCard.senderCurrencyCode}
-
${priceToValueMap[price]}${giftCard.recipientCurrencyCode}
+
${Number(price).toFixed(0)}${giftCard.senderCurrencyCode}
+
${priceToValueMap[price].toFixed(0)}${giftCard.recipientCurrencyCode}
`; }); return _html; @@ -88,11 +88,11 @@ function getRangePricesHtml(giftCard: ReloadlyProduct, rewardAmount: BigNumberis _html += html`
Value
-
${giftCard.minRecipientDenomination.toFixed(2)}-${giftCard.maxRecipientDenomination}${giftCard.recipientCurrencyCode}
+
${giftCard.minRecipientDenomination.toFixed(0)}-${giftCard.maxRecipientDenomination.toFixed(0)}${giftCard.recipientCurrencyCode}
Price
-
${prices[0]}-${prices[1]}${giftCard.senderCurrencyCode}
+
${Number(prices[0]).toFixed(0)}-${Number(prices[1]).toFixed(0)}${giftCard.senderCurrencyCode}
`; From ed6c28e77f986f4c81bf60148f72af0c9602ba2f Mon Sep 17 00:00:00 2001 From: EresDev Date: Thu, 16 May 2024 23:46:05 +0500 Subject: [PATCH 014/174] chore: run missing yarn install from previous merge --- yarn.lock | 830 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 814 insertions(+), 16 deletions(-) diff --git a/yarn.lock b/yarn.lock index adfc4a75..57ce0952 100644 --- a/yarn.lock +++ b/yarn.lock @@ -98,6 +98,11 @@ resolved "https://registry.yarnpkg.com/@cloudflare/workers-types/-/workers-types-4.20240423.0.tgz#f09f18e338cd3e1ce0acbe02bb72d101cc38aa7f" integrity sha512-ssuccb3j+URp6mP2p0PcQE9vmS3YeKBQnALHF9P3yQfUAFozuhTsDTbqmL+zPrJvUcG7SL2xVQkNDF9QJeKDZw== +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + "@commitlint/cli@^18.6.1": version "18.6.1" resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-18.6.1.tgz#78bffdfa00d6f01425d53096954993d83f2b343d" @@ -623,6 +628,38 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@cypress/request@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.1.tgz#72d7d5425236a2413bd3d8bb66d02d9dc3168960" + integrity sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + http-signature "~1.3.6" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + performance-now "^2.1.0" + qs "6.10.4" + safe-buffer "^5.1.2" + tough-cookie "^4.1.3" + tunnel-agent "^0.6.0" + uuid "^8.3.2" + +"@cypress/xvfb@^1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" + integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== + dependencies: + debug "^3.1.0" + lodash.once "^4.1.1" + "@ericcornelissen/bash-parser@0.5.2": version "0.5.2" resolved "https://registry.yarnpkg.com/@ericcornelissen/bash-parser/-/bash-parser-0.5.2.tgz#5eb3bc52020d97fbaebc63b5168ca0aa0b2e8418" @@ -1770,6 +1807,16 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== +"@types/sinonjs__fake-timers@8.1.1": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" + integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== + +"@types/sizzle@^2.3.2": + version "2.3.8" + resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.8.tgz#518609aefb797da19bf222feb199e8f653ff7627" + integrity sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg== + "@types/ws@^8.5.10": version "8.5.10" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" @@ -1777,6 +1824,13 @@ dependencies: "@types/node" "*" +"@types/yauzl@^2.9.1": + version "2.10.3" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== + dependencies: + "@types/node" "*" + "@typescript-eslint/eslint-plugin@^7.0.1": version "7.7.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.1.tgz#50a9044e3e5fe76b22caf64fb7fc1f97614bdbfd" @@ -1966,6 +2020,18 @@ ajv@^8.11.0: require-from-string "^2.0.2" uri-js "^4.2.2" +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + ansi-escapes@^6.2.0: version "6.2.1" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-6.2.1.tgz#76c54ce9b081dad39acec4b5d53377913825fb0f" @@ -2008,6 +2074,11 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +arch@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -2074,11 +2145,38 @@ as-table@^1.0.36: dependencies: printable-characters "^1.0.42" +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async@^3.2.0: + version "3.2.5" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + available-typed-arrays@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" @@ -2086,6 +2184,16 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + axios@^1.6.7: version "1.6.8" resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" @@ -2105,6 +2213,18 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + bech32@1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" @@ -2130,6 +2250,16 @@ blake3-wasm@^2.1.5: resolved "https://registry.yarnpkg.com/blake3-wasm/-/blake3-wasm-2.1.5.tgz#b22dbb84bc9419ed0159caa76af4b1b132e6ba52" integrity sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g== +blob-util@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" + integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== + +bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" @@ -2167,6 +2297,24 @@ brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer@^5.7.1: + 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" + +cachedir@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.4.0.tgz#7fef9cf7367233d7c88068fe6e34ed0d355a610d" + integrity sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ== + 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" @@ -2205,6 +2353,11 @@ capnp-ts@^0.7.0: debug "^4.3.1" tslib "^2.2.0" +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + chalk-template@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/chalk-template/-/chalk-template-1.1.0.tgz#ffc55db6dd745e9394b85327c8ac8466edb7a7b1" @@ -2234,6 +2387,11 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +check-more-types@^2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" + integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== + chokidar@^3.5.2, chokidar@^3.5.3: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" @@ -2249,6 +2407,11 @@ chokidar@^3.5.2, chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -2269,6 +2432,13 @@ clear-module@^4.1.2: parent-module "^2.0.0" resolve-from "^5.0.0" +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-cursor@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" @@ -2276,6 +2446,23 @@ cli-cursor@^4.0.0: dependencies: restore-cursor "^4.0.0" +cli-table3@~0.6.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f" + integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + cli-truncate@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" @@ -2322,12 +2509,12 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colorette@^2.0.20: +colorette@^2.0.16, colorette@^2.0.20: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== -combined-stream@^1.0.8: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -2349,6 +2536,11 @@ commander@^4.1.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== + comment-json@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/comment-json/-/comment-json-4.2.3.tgz#50b487ebbf43abe44431f575ebda07d30d015365" @@ -2360,6 +2552,11 @@ comment-json@^4.2.3: has-own-prop "^2.0.0" repeat-string "^1.6.1" +common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + compare-func@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" @@ -2420,6 +2617,11 @@ cookie@^0.5.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + core-util-is@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" @@ -2453,7 +2655,7 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -2579,16 +2781,76 @@ cspell@^8.3.2: strip-ansi "^7.1.0" vscode-uri "^3.0.8" +cypress@13.7.0: + version "13.7.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.7.0.tgz#19e53c0bd6eca5e3bde0d6ac9e98fbf1782e3a9e" + integrity sha512-UimjRSJJYdTlvkChcdcfywKJ6tUYuwYuk/n1uMMglrvi+ZthNhoRYcxnWgTqUtkl17fXrPAsD5XT2rcQYN1xKA== + dependencies: + "@cypress/request" "^3.0.0" + "@cypress/xvfb" "^1.2.4" + "@types/sinonjs__fake-timers" "8.1.1" + "@types/sizzle" "^2.3.2" + arch "^2.2.0" + blob-util "^2.0.2" + bluebird "^3.7.2" + buffer "^5.7.1" + cachedir "^2.3.0" + chalk "^4.1.0" + check-more-types "^2.24.0" + cli-cursor "^3.1.0" + cli-table3 "~0.6.1" + commander "^6.2.1" + common-tags "^1.8.0" + dayjs "^1.10.4" + debug "^4.3.4" + enquirer "^2.3.6" + eventemitter2 "6.4.7" + execa "4.1.0" + executable "^4.1.1" + extract-zip "2.0.1" + figures "^3.2.0" + fs-extra "^9.1.0" + getos "^3.2.1" + is-ci "^3.0.1" + is-installed-globally "~0.4.0" + lazy-ass "^1.6.0" + listr2 "^3.8.3" + lodash "^4.17.21" + log-symbols "^4.0.0" + minimist "^1.2.8" + ospath "^1.2.2" + pretty-bytes "^5.6.0" + process "^0.11.10" + proxy-from-env "1.0.0" + request-progress "^3.0.0" + semver "^7.5.3" + supports-color "^8.1.1" + tmp "~0.2.1" + untildify "^4.0.0" + yauzl "^2.10.0" + dargs@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + data-uri-to-buffer@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz#d296973d5a4897a5dbe31716d118211921f04770" integrity sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA== +data-uri-to-buffer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" + integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== + data-view-buffer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" @@ -2616,13 +2878,25 @@ data-view-byte-offset@^1.0.0: es-errors "^1.3.0" is-data-view "^1.0.1" -debug@4.3.4, debug@^4, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +dayjs@^1.10.4: + version "1.11.11" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.11.tgz#dfe0e9d54c5f8b68ccf8ca5f72ac603e7e5ed59e" + integrity sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg== + +debug@4.3.4, debug@^4, 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== dependencies: ms "2.1.2" +debug@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + decamelize-keys@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" @@ -2723,6 +2997,14 @@ easy-table@1.2.0: optionalDependencies: wcwidth "^1.0.1" +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + elliptic@6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -2746,6 +3028,21 @@ 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== +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enquirer@^2.3.6: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -3102,11 +3399,31 @@ ethers@^5.3.1, ethers@^5.7.2: "@ethersproject/web" "5.7.1" "@ethersproject/wordlists" "5.7.0" +eventemitter2@6.4.7: + version "6.4.7" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" + integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== + eventemitter3@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== +execa@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + execa@8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" @@ -3137,11 +3454,44 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +executable@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" + integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== + dependencies: + pify "^2.2.0" + exit-hook@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-2.2.1.tgz#007b2d92c6428eda2b76e7016a34351586934593" integrity sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw== +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + 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" @@ -3180,6 +3530,28 @@ fastq@^1.15.0, fastq@^1.6.0: dependencies: reusify "^1.0.4" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + +fetch-blob@^3.1.2, fetch-blob@^3.1.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" + integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== + dependencies: + node-domexception "^1.0.0" + web-streams-polyfill "^3.0.3" + +figures@^3.2.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, 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" @@ -3266,6 +3638,11 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -3275,6 +3652,32 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +formdata-polyfill@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" + integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== + dependencies: + fetch-blob "^3.1.2" + +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -3344,6 +3747,13 @@ get-stdin@^9.0.0: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== +get-stream@^5.0.0, get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + get-stream@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" @@ -3370,6 +3780,20 @@ get-tsconfig@^4.7.2: dependencies: resolve-pkg-maps "^1.0.0" +getos@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" + integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== + dependencies: + async "^3.2.0" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + git-raw-commits@^2.0.11: version "2.0.11" resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" @@ -3437,6 +3861,13 @@ global-dirs@^0.1.1: dependencies: ini "^1.3.4" +global-dirs@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== + dependencies: + ini "2.0.0" + globals@^13.19.0: version "13.24.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" @@ -3470,7 +3901,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.2, graceful-fs@^4.2.6: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.6: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -3570,6 +4001,20 @@ hosted-git-info@^4.0.1: dependencies: lru-cache "^6.0.0" +http-signature@~1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" + integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== + dependencies: + assert-plus "^1.0.0" + jsprim "^2.0.2" + sshpk "^1.14.1" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" @@ -3590,6 +4035,11 @@ identity-function@^1.0.0: resolved "https://registry.yarnpkg.com/identity-function/-/identity-function-1.0.0.tgz#bea1159f0985239be3ca348edf40ce2f0dd2c21d" integrity sha512-kNrgUK0qI+9qLTBidsH85HjDLpZfrrS0ElquKKe/fJFdB3D7VeKdXXEvOPDUHSHOzdZKCAAaQIWWyp0l2yq6pw== +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore-by-default@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" @@ -3641,6 +4091,11 @@ inherits@2, inherits@^2.0.3, inherits@^2.0.4: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + ini@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" @@ -3700,6 +4155,13 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== +is-ci@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + is-core-module@^2.13.0, is-core-module@^2.5.0: version "2.13.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" @@ -3750,6 +4212,14 @@ 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-installed-globally@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + is-iterable@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/is-iterable/-/is-iterable-1.1.1.tgz#71f9aa6f113e1d968ebe1d41cff4c8fb23a817bc" @@ -3782,7 +4252,7 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== -is-path-inside@^3.0.3: +is-path-inside@^3.0.2, is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== @@ -3845,11 +4315,16 @@ is-typed-array@^1.1.13: dependencies: which-typed-array "^1.1.14" -is-typedarray@^1.0.0: +is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== +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" @@ -3867,6 +4342,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + iterable-lookahead@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/iterable-lookahead/-/iterable-lookahead-1.0.0.tgz#896dfcb78680bdb50036e97edb034c8b68a9737f" @@ -3894,6 +4374,11 @@ js-yaml@4.1.0, js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -3919,21 +4404,50 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + jsonparse@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== +jsprim@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d" + integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + keyv@^4.5.3, keyv@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" @@ -3970,6 +4484,11 @@ knip@^5.0.1: zod "^3.22.4" zod-validation-error "^3.0.3" +lazy-ass@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" + integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -4028,6 +4547,20 @@ listr2@8.0.1: rfdc "^1.3.0" wrap-ansi "^9.0.0" +listr2@^3.8.3: + version "3.14.0" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" + integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.5.1" + through "^2.3.8" + wrap-ansi "^7.0.0" + load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -4087,6 +4620,11 @@ lodash.mergewith@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== +lodash.once@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== + lodash.snakecase@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" @@ -4107,11 +4645,29 @@ lodash.upperfirst@^4.3.1: resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== -lodash@^4.17.15: +lodash@^4.17.15, 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.0.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" + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + log-update@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.0.0.tgz#0ddeb7ac6ad658c944c1de902993fce7c33f5e59" @@ -4209,7 +4765,7 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12: +mime-types@^2.1.12, mime-types@~2.1.19: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -4294,7 +4850,7 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@1.2.8, minimist@^1.2.6: +minimist@1.2.8, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -4304,6 +4860,11 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + mustache@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" @@ -4324,6 +4885,20 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +node-domexception@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== + +node-fetch@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" + integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== + dependencies: + data-uri-to-buffer "^4.0.0" + fetch-blob "^3.1.4" + formdata-polyfill "^4.0.10" + node-forge@^1: version "1.3.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" @@ -4392,7 +4967,7 @@ npm-run-all@^4.1.5: shell-quote "^1.6.1" string.prototype.padend "^3.0.0" -npm-run-path@^4.0.1: +npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== @@ -4436,7 +5011,7 @@ object.assign@^4.1.5: has-symbols "^1.0.3" object-keys "^1.1.1" -once@^1.3.0, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -4469,6 +5044,11 @@ optionator@^0.9.3: prelude-ls "^1.2.1" type-check "^0.4.0" +ospath@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" + integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== + p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -4593,6 +5173,16 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + picocolors@1.0.0, picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -4618,6 +5208,11 @@ pidtree@^0.3.0: resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== +pify@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" @@ -4638,6 +5233,11 @@ prettier@^3.2.5: resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== +pretty-bytes@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + pretty-ms@9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-9.0.0.tgz#53c57f81171c53be7ce3fd20bdd4265422bc5929" @@ -4650,21 +5250,56 @@ printable-characters@^1.0.42: resolved "https://registry.yarnpkg.com/printable-characters/-/printable-characters-1.0.42.tgz#3f18e977a9bd8eb37fcc4ff5659d7be90868b3d8" integrity sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ== +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +proxy-from-env@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + pstree.remy@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== -punycode@^2.1.0: +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0, punycode@^2.1.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== +qs@6.10.4: + version "6.10.4" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.4.tgz#6a3003755add91c0ec9eacdc5f878b034e73f9e7" + integrity sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g== + dependencies: + side-channel "^1.0.4" + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -4742,6 +5377,13 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== +request-progress@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" + integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== + dependencies: + throttleit "^1.0.0" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -4752,6 +5394,11 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + resolve-from@5.0.0, resolve-from@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" @@ -4788,6 +5435,14 @@ resolve@1.22.8, resolve@^1.10.0, resolve@^1.22.8: 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" + restore-cursor@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" @@ -4848,6 +5503,13 @@ run-parallel@^1.1.9, run-parallel@^1.2.0: dependencies: queue-microtask "^1.2.2" +rxjs@^7.5.1: + 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" @@ -4858,7 +5520,7 @@ safe-array-concat@^1.1.2: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -4877,6 +5539,11 @@ safe-stable-stringify@^2.4.3: resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== +safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + scrypt-js@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" @@ -4990,6 +5657,24 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + slice-ansi@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" @@ -5059,6 +5744,21 @@ split2@^4.0.0: resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== +sshpk@^1.14.1: + version "1.18.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" + integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + stacktracey@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/stacktracey/-/stacktracey-2.1.8.tgz#bf9916020738ce3700d1323b32bd2c91ea71199d" @@ -5210,6 +5910,13 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -5225,6 +5932,11 @@ 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== +throttleit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.1.tgz#304ec51631c3b770c65c6c6f76938b384000f4d5" + integrity sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ== + through2@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" @@ -5232,7 +5944,7 @@ through2@^4.0.0: dependencies: readable-stream "3" -"through@>=2.2.7 <3": +"through@>=2.2.7 <3", through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== @@ -5242,6 +5954,11 @@ tiny-invariant@^1.3.1: resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== +tmp@~0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== + to-no-case@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/to-no-case/-/to-no-case-1.0.2.tgz#c722907164ef6b178132c8e69930212d1b4aa16a" @@ -5275,6 +5992,16 @@ touch@^3.1.0: dependencies: nopt "~1.0.10" +tough-cookie@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -5308,7 +6035,7 @@ tslib@2.4.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== -tslib@^2.2.0: +tslib@^2.1.0, tslib@^2.2.0: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -5323,11 +6050,23 @@ tsx@^4.7.1: optionalDependencies: fsevents "~2.3.3" +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + tunnel@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -5345,6 +6084,11 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-fest@^0.21.3: + version "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@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" @@ -5462,6 +6206,21 @@ universal-user-agent@^6.0.0: resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -5469,6 +6228,14 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + util-deprecate@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -5487,6 +6254,15 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + vlq@^0.2.1: version "0.2.3" resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" @@ -5509,6 +6285,11 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +web-streams-polyfill@^3.0.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" + integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -5592,6 +6373,15 @@ wrangler@^3.51.2: optionalDependencies: fsevents "~2.3.2" +wrap-ansi@^6.2.0: + 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" @@ -5693,6 +6483,14 @@ yargs@^17.0.0: y18n "^5.0.5" yargs-parser "^21.1.1" +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From afe5f9e83326b7af846d551426c0f670e42bede7 Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 17 May 2024 00:29:39 +0500 Subject: [PATCH 015/174] chore: handle cspell warnings by listing & fixing words --- .cspell.json | 3 +++ .../gift-cards/activate/activate-html.ts | 8 +++---- .../rewards/gift-cards/claim/claim-action.ts | 4 ++-- .../scripts/rewards/gift-cards/gift-card.ts | 2 +- .../rewards/gift-cards/list-gift-cards.ts | 24 +++++++++---------- 5 files changed, 22 insertions(+), 19 deletions(-) diff --git a/.cspell.json b/.cspell.json index d54182ac..b7e7adab 100644 --- a/.cspell.json +++ b/.cspell.json @@ -14,6 +14,7 @@ "devpool", "ethersproject", "fract", + "giftcards", "gnosisscan", "godb", "greyscale", @@ -23,6 +24,8 @@ "libsodium", "Numberish", "outdir", + "pageable", + "Reloadly", "Rpcs", "scalarmult", "servedir", diff --git a/static/scripts/rewards/gift-cards/activate/activate-html.ts b/static/scripts/rewards/gift-cards/activate/activate-html.ts index 9bfd76c9..c338434d 100644 --- a/static/scripts/rewards/gift-cards/activate/activate-html.ts +++ b/static/scripts/rewards/gift-cards/activate/activate-html.ts @@ -2,9 +2,9 @@ import { ReloadlyProduct } from "../../../../../shared/types"; const html = String.raw; -export function getGiftCardActivateInfoHtml(giftcard: ReloadlyProduct) { +export function getGiftCardActivateInfoHtml(giftCard: ReloadlyProduct) { return html` -
+
@@ -21,8 +21,8 @@ export function getGiftCardActivateInfoHtml(giftcard: ReloadlyProduct) {
-

${giftcard.redeemInstruction.concise}

- ${giftcard.redeemInstruction.concise != giftcard.redeemInstruction.verbose ? `

${giftcard.redeemInstruction.verbose}

` : ``} +

${giftCard.redeemInstruction.concise}

+ ${giftCard.redeemInstruction.concise != giftCard.redeemInstruction.verbose ? `

${giftCard.redeemInstruction.verbose}

` : ``}
diff --git a/static/scripts/rewards/gift-cards/claim/claim-action.ts b/static/scripts/rewards/gift-cards/claim/claim-action.ts index dae336d0..6dd3c4e1 100644 --- a/static/scripts/rewards/gift-cards/claim/claim-action.ts +++ b/static/scripts/rewards/gift-cards/claim/claim-action.ts @@ -10,14 +10,14 @@ import { isProductAvailableForAmount } from "../../../../../shared/pricing"; import { OrderRequestParams, ReloadlyProduct } from "../../../../../shared/types"; import { isErc20Permit } from "../../render-transaction/render-transaction"; -export function attachClaimAction(className: string, giftcards: ReloadlyProduct[], app: AppState) { +export function attachClaimAction(className: string, giftCards: ReloadlyProduct[], app: AppState) { const claimButtons: HTMLCollectionOf = document.getElementsByClassName(className); Array.from(claimButtons).forEach((claimButton: Element) => { (claimButton as HTMLButtonElement).addEventListener("click", async () => { claimButton.setAttribute("data-loading", "true"); const productId = Number(claimButton.parentElement?.parentElement?.parentElement?.getAttribute("data-product-id")); - const product = giftcards.find((product: ReloadlyProduct) => product.productId == productId); + const product = giftCards.find((product: ReloadlyProduct) => product.productId == productId); if (product) { if (!isErc20Permit(app.reward)) { toaster.create("error", "Only ERC20 permits are allowed to claim a card."); diff --git a/static/scripts/rewards/gift-cards/gift-card.ts b/static/scripts/rewards/gift-cards/gift-card.ts index e2ae2e22..f85f6348 100644 --- a/static/scripts/rewards/gift-cards/gift-card.ts +++ b/static/scripts/rewards/gift-cards/gift-card.ts @@ -79,7 +79,7 @@ function getRangePricesHtml(giftCard: ReloadlyProduct, rewardAmount: BigNumberis
${formatEther(rewardAmount)}${giftCard.senderCurrencyCode}
${productValue.toFixed(2)}${giftCard.recipientCurrencyCode}

Availble in range

`; + >

Available in range

`; } const priceToValueMap = getRangePriceToValueMap(giftCard); diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index dc80e94e..e2893351 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -25,7 +25,7 @@ export async function initCollectGiftCard(app: AppState) { const [retrieveOrderResponse, retrieveGiftCardsResponse] = await Promise.all([fetch(retrieveOrderUrl, requestInit), fetch(listGiftCardsUrl, requestInit)]); const transaction = (await retrieveOrderResponse.json()) as ReloadlyTransaction; - const giftcards = (await retrieveGiftCardsResponse.json()) as ReloadlyProduct[]; + const giftCards = (await retrieveGiftCardsResponse.json()) as ReloadlyProduct[]; const giftCardsSection = document.getElementById("gift-cards"); if (!giftCardsSection) { @@ -39,20 +39,20 @@ export async function initCollectGiftCard(app: AppState) { } if (retrieveOrderResponse.status == 200) { - const giftcard = giftcards.find((giftcard) => transaction.product.productId == giftcard.productId); + const giftCard = giftCards.find((giftCard) => transaction.product.productId == giftCard.productId); let giftCardsHtml = `

Your gift card

`; giftCardsHtml += `
`; - if (giftcard) { - giftCardsHtml += getGiftCardHtml(giftcard, false, app.reward.amount); + if (giftCard) { + giftCardsHtml += getGiftCardHtml(giftCard, false, app.reward.amount); } giftCardsHtml += getRedeemCodeHtml(transaction); giftCardsHtml += `
`; giftCardsSection.innerHTML = giftCardsHtml; let activateInfoHtml = ""; - if (giftcard) { - activateInfoHtml += getGiftCardActivateInfoHtml(giftcard); + if (giftCard) { + activateInfoHtml += getGiftCardActivateInfoHtml(giftCard); } activateInfoSection.innerHTML = activateInfoHtml; @@ -61,8 +61,8 @@ export async function initCollectGiftCard(app: AppState) { } else if (retrieveGiftCardsResponse.status == 200) { let giftCardsHtml = `

Or claim in virtual visa/mastercard

`; giftCardsHtml += `
`; - giftcards.forEach((giftcard: ReloadlyProduct) => { - giftCardsHtml += getGiftCardHtml(giftcard, true, app.reward.amount); + giftCards.forEach((giftCard: ReloadlyProduct) => { + giftCardsHtml += getGiftCardHtml(giftCard, true, app.reward.amount); }); giftCardsHtml += `

`; giftCardsHtml += getDisclaimerHtml(); @@ -72,12 +72,12 @@ export async function initCollectGiftCard(app: AppState) { giftCardsSection.innerHTML = giftCardsHtml; let activateInfoHtml = ""; - giftcards.forEach((giftcard: ReloadlyProduct) => { - activateInfoHtml += getGiftCardActivateInfoHtml(giftcard); + giftCards.forEach((giftCard: ReloadlyProduct) => { + activateInfoHtml += getGiftCardActivateInfoHtml(giftCard); }); activateInfoSection.innerHTML = activateInfoHtml; - attachClaimAction("claim-gift-card-btn", giftcards, app); + attachClaimAction("claim-gift-card-btn", giftCards, app); } else { giftCardsSection.innerText = "There was a problem in fetching gift cards. Try again later."; } @@ -88,7 +88,7 @@ export async function initCollectGiftCard(app: AppState) { function getDisclaimerHtml() { return html`

Disclaimer

-

All visa/mastercards are non-exchangeable & non-refundable.

+

All Visa/Mastercard are non-exchangeable & non-refundable.

Exact value of a card can be slightly different due to exchange rate.

`; } From 84763f3c69c425ee1a7e20ab37689b3ce72dfe74 Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 17 May 2024 01:00:21 +0500 Subject: [PATCH 016/174] refactor: replace word usage product with gift-card --- functions/list-gift-cards.ts | 16 +-- functions/post-order.ts | 26 ++-- shared/pricing.ts | 112 +++++++++--------- shared/types.ts | 4 +- .../gift-cards/activate/activate-html.ts | 4 +- .../rewards/gift-cards/claim/claim-action.ts | 10 +- .../scripts/rewards/gift-cards/gift-card.ts | 18 +-- .../rewards/gift-cards/list-gift-cards.ts | 12 +- .../gift-cards/reveal/redeem-code-html.ts | 2 +- static/styles/rewards/gift-cards.css | 26 ++-- 10 files changed, 114 insertions(+), 116 deletions(-) diff --git a/functions/list-gift-cards.ts b/functions/list-gift-cards.ts index c31c62ef..6d612545 100644 --- a/functions/list-gift-cards.ts +++ b/functions/list-gift-cards.ts @@ -10,23 +10,23 @@ export const onRequest: PagesFunction = async (ctx) => { const accessToken = await getAccessToken(ctx.env); - const visaCards = await getProducts("visa", accessToken); - const masterCards = await getProducts("mastercard", accessToken); - const products = [...masterCards, ...visaCards]; + const visaCards = await getGiftCards("visa", accessToken); + const masterCards = await getGiftCards("mastercard", accessToken); + const giftCards = [...masterCards, ...visaCards]; - if (products.length) { - return Response.json(products, { status: 200 }); + if (giftCards.length) { + return Response.json(giftCards, { status: 200 }); } - return Response.json({ message: "There are no products available." }, { status: 404 }); + return Response.json({ message: "There are no gift cards available." }, { status: 404 }); } catch (error) { console.error("There was an error while processing your request.", error); return Response.json({ message: "There was an error while processing your request." }, { status: 500 }); } }; -const getProducts = async (productQuery: string, accessToken: AccessToken) => { +const getGiftCards = async (productQuery: string, accessToken: AccessToken) => { const url = `${getBaseUrl(accessToken.isSandbox)}/products?productName=${productQuery}`; - console.log(`Retrieving products from ${url}`); + console.log(`Retrieving gift cards from ${url}`); const options = { method: "GET", headers: { diff --git a/functions/post-order.ts b/functions/post-order.ts index 58d94d5f..2c136892 100644 --- a/functions/post-order.ts +++ b/functions/post-order.ts @@ -3,13 +3,13 @@ import { JsonRpcProvider } from "@ethersproject/providers/lib/json-rpc-provider" import { Interface } from "ethers/lib/utils"; import { giftCardTreasuryAddress, permit2Address } from "../shared/constants"; import { getGiftCardOrderId } from "../shared/helpers"; -import { ExchangeRate, NotOkReloadlyApiResponse, OrderRequestParams, ReloadlyOrderResponse, ReloadlyProduct } from "../shared/types"; +import { ExchangeRate, NotOkReloadlyApiResponse, OrderRequestParams, ReloadlyOrderResponse, GiftCard } from "../shared/types"; import { permit2Abi } from "../static/scripts/rewards/abis/permit2Abi"; import { getTransactionFromOrderId } from "./get-order"; import { validateEnvVars, validateRequestMethod } from "./validators"; import { Env, commonHeaders, getAccessToken, getBaseUrl } from "./helpers"; import { AccessToken } from "./types"; -import { getProductValue, isProductAvailableForAmount } from "../shared/pricing"; +import { getGiftCardValue, isClaimableForAmount } from "../shared/pricing"; export const networkRpcs: Record = { 1: ["https://gateway.tenderly.co/public/mainnet"], @@ -44,10 +44,10 @@ export const onRequest: PagesFunction = async (ctx) => { chainId ); - const [txReceipt, tx, product]: [TransactionReceipt, TransactionResponse, ReloadlyProduct] = await Promise.all([ + const [txReceipt, tx, giftCard]: [TransactionReceipt, TransactionResponse, GiftCard] = await Promise.all([ provider.getTransactionReceipt(txHash), provider.getTransaction(txHash), - getProductById(productId, accessToken), + getGiftCardById(productId, accessToken), ]); if (!txReceipt) { @@ -62,7 +62,7 @@ export const onRequest: PagesFunction = async (ctx) => { const rewardAmount = txParsed.args.transferDetails.requestedAmount; - if (!isProductAvailableForAmount(product, rewardAmount)) { + if (!isClaimableForAmount(giftCard, rewardAmount)) { return Response.json({ message: "Your reward amount is either too high or too low to buy this card." }, { status: 403 }); } @@ -93,11 +93,11 @@ export const onRequest: PagesFunction = async (ctx) => { const amountDaiWei = txParsed.args.transferDetails.requestedAmount; let exchangeRate = 1; - if (product.recipientCurrencyCode != "USD") { - const exchangeRateResponse = await getExchangeRate(1, product.recipientCurrencyCode, accessToken); + if (giftCard.recipientCurrencyCode != "USD") { + const exchangeRateResponse = await getExchangeRate(1, giftCard.recipientCurrencyCode, accessToken); exchangeRate = exchangeRateResponse.senderAmount; } - const productValue = getProductValue(product, amountDaiWei, exchangeRate); + const giftCardValue = getGiftCardValue(giftCard, amountDaiWei, exchangeRate); const orderId = getGiftCardOrderId(txReceipt.from, txParsed.args.signature); @@ -106,7 +106,7 @@ export const onRequest: PagesFunction = async (ctx) => { return Response.json({ message: "The permit has already claimed a gift card." }, { status: 400 }); } - const order = await orderGiftCard(productId, productValue, orderId, accessToken); + const order = await orderGiftCard(productId, giftCardValue, orderId, accessToken); if (order.status == "SUCCESSFUL") { return Response.json(order, { status: 200 }); @@ -119,9 +119,9 @@ export const onRequest: PagesFunction = async (ctx) => { } }; -const getProductById = async (productId: number, accessToken: AccessToken) => { +const getGiftCardById = async (productId: number, accessToken: AccessToken) => { const url = `${getBaseUrl(accessToken.isSandbox)}/products/${productId}`; - console.log(`Retrieving product from ${url}`); + console.log(`Retrieving gift cards from ${url}`); const options = { method: "GET", headers: { @@ -144,7 +144,7 @@ const getProductById = async (productId: number, accessToken: AccessToken) => { console.log("response.status", response.status); console.log(`Response from ${url}`, responseJson); - return responseJson as ReloadlyProduct; + return responseJson as GiftCard; }; const orderGiftCard = async (productId: number, cardValue: number, identifier: string, accessToken: AccessToken) => { @@ -200,7 +200,7 @@ async function isDuplicateOrder(orderId: string, accessToken: AccessToken) { async function getExchangeRate(usdAmount: number, fromCurrency: string, accessToken: AccessToken) { const url = `${getBaseUrl(accessToken.isSandbox)}/fx-rate?currencyCode=${fromCurrency}&amount=${usdAmount}`; - console.log(`Retrieving products from ${url}`); + console.log(`Retrieving url ${url}`); const options = { method: "GET", headers: { diff --git a/shared/pricing.ts b/shared/pricing.ts index 55d0ebb1..c89847a7 100644 --- a/shared/pricing.ts +++ b/shared/pricing.ts @@ -1,6 +1,6 @@ import { BigNumber, BigNumberish } from "ethers"; import { formatEther, parseEther } from "ethers/lib/utils"; -import { PriceToValueMap, ReloadlyProduct } from "./types"; +import { PriceToValueMap, GiftCard } from "./types"; /** * PRICE OF A GIFT CARD @@ -15,80 +15,78 @@ import { PriceToValueMap, ReloadlyProduct } from "./types"; * Value of a gift is the amount that is available within the gift card. * It can be in any currency. * - * For fixed price products, the value is provided by following fields. - * Elements of ReloadlyProduct.fixedRecipientDenominations[] - * Keys of ReloadlyProduct.fixedRecipientToSenderDenominationsMap {}[] + * For fixed price gift cards, the value is provided by following fields. + * Elements of GiftCard.fixedRecipientDenominations[] + * Keys of GiftCard.fixedRecipientToSenderDenominationsMap {}[] * value = price - percent discount of value + senderFee + percentFee of value * - * For ranged price products, the value is any amount between the following fields. - * ReloadlyProduct.minRecipientDenomination - * ReloadlyProduct.maxRecipientDenomination + * For ranged price gift cards, the value is any amount between the following fields. + * GiftCard.minRecipientDenomination + * GiftCard.maxRecipientDenomination * * Following fields are the equivalent of available values range in our account currency (USD). - * ReloadlyProduct.minSenderDenomination - * ReloadlyProduct.maxSenderDenomination - * Values of ReloadlyProduct.fixedRecipientToSenderDenominationsMap{}[] + * GiftCard.minSenderDenomination + * GiftCard.maxSenderDenomination + * Values of GiftCard.fixedRecipientToSenderDenominationsMap{}[] */ -export function isProductAvailableForAmount(product: ReloadlyProduct, rewardAmount: BigNumberish) { - if (product.senderCurrencyCode != "USD") { - throw new Error(`Failed to validate price because product's senderCurrencyCode is not USD: ${JSON.stringify({ rewardAmount, product })}`); +export function isClaimableForAmount(giftCard: GiftCard, rewardAmount: BigNumberish) { + if (giftCard.senderCurrencyCode != "USD") { + throw new Error(`Failed to validate price because gift card's senderCurrencyCode is not USD: ${JSON.stringify({ rewardAmount, giftCard: giftCard })}`); } - if (product.denominationType == "RANGE") { - return isRangePriceProductAvailable(product, rewardAmount); - } else if (product.denominationType == "FIXED") { - return isFixedPriceProductAvailable(product, rewardAmount); + if (giftCard.denominationType == "RANGE") { + return isRangePriceGiftCardClaimable(giftCard, rewardAmount); + } else if (giftCard.denominationType == "FIXED") { + return isFixedPriceGiftCardClaimable(giftCard, rewardAmount); } } -export function getEstimatedExchangeRate(product: ReloadlyProduct) { +export function getEstimatedExchangeRate(giftCard: GiftCard) { let exchangeRate = 1; - if (product.recipientCurrencyCode != "USD") { - if (product.denominationType == "FIXED") { - const key = Object.keys(product.fixedRecipientToSenderDenominationsMap)[0]; - exchangeRate = product.fixedRecipientToSenderDenominationsMap[key] / Number(key); + if (giftCard.recipientCurrencyCode != "USD") { + if (giftCard.denominationType == "FIXED") { + const key = Object.keys(giftCard.fixedRecipientToSenderDenominationsMap)[0]; + exchangeRate = giftCard.fixedRecipientToSenderDenominationsMap[key] / Number(key); } else { - exchangeRate = product.minSenderDenomination / product.minRecipientDenomination; + exchangeRate = giftCard.minSenderDenomination / giftCard.minRecipientDenomination; } } return exchangeRate; } -export function getTotalPriceOfValue(value: number, product: ReloadlyProduct) { - const exchangeRate = getEstimatedExchangeRate(product); - console.log(product.productId); - console.log(exchangeRate, value); +export function getTotalPriceOfValue(value: number, giftCard: GiftCard) { + const exchangeRate = getEstimatedExchangeRate(giftCard); const usdValue = parseEther((exchangeRate * value).toString()); // multiply by extra 100 to support minimum upto 0.01% // because we are using BigNumbers - const feePercentage = BigNumber.from((product.senderFeePercentage * 100).toString()); + const feePercentage = BigNumber.from((giftCard.senderFeePercentage * 100).toString()); const fee = usdValue.mul(feePercentage).div(100 * 100); - const totalFee = fee.add(parseEther(product.senderFee.toString())); - const discountPercent = BigNumber.from(Math.trunc(product.discountPercentage * 100).toString()); + const totalFee = fee.add(parseEther(giftCard.senderFee.toString())); + const discountPercent = BigNumber.from(Math.trunc(giftCard.discountPercentage * 100).toString()); const discount = usdValue.mul(discountPercent).div(100 * 100); return Number(formatEther(usdValue.add(totalFee).sub(discount))); } -export function getRangePriceToValueMap(product: ReloadlyProduct) { +export function getRangePriceToValueMap(giftCard: GiftCard) { const priceToValueMap: PriceToValueMap = {}; - [product.minRecipientDenomination, product.maxRecipientDenomination].forEach((value) => { - const totalPrice = getTotalPriceOfValue(Number(value), product); + [giftCard.minRecipientDenomination, giftCard.maxRecipientDenomination].forEach((value) => { + const totalPrice = getTotalPriceOfValue(Number(value), giftCard); priceToValueMap[totalPrice.toFixed(2).toString()] = Number(value); }); return priceToValueMap; } -export function getUsdValueForRangePrice(product: ReloadlyProduct, price: BigNumberish) { +export function getUsdValueForRangePrice(giftCard: GiftCard, price: BigNumberish) { // price = value + senderFee + feePercent - discountPercent const priceWei = BigNumber.from(price.toString()); - const priceAfterFee = priceWei.sub(parseEther(product.senderFee.toString())); + const priceAfterFee = priceWei.sub(parseEther(giftCard.senderFee.toString())); - const feeDiscountPercentDiff = product.senderFeePercentage - product.discountPercentage; + const feeDiscountPercentDiff = giftCard.senderFeePercentage - giftCard.discountPercentage; // multiply by extra 100 to support minimum upto 0.01% // because we are using BigNumbers const feeDiscountPercentDiffWei = parseEther(Math.trunc(feeDiscountPercentDiff * 100).toString()); @@ -98,51 +96,51 @@ export function getUsdValueForRangePrice(product: ReloadlyProduct, price: BigNum return Number(formatEther(usdValue)); } -export function isRangePriceProductAvailable(product: ReloadlyProduct, rewardAmount: BigNumberish) { - const value = Number(getProductValue(product, rewardAmount).toFixed(2)); - return value >= product.minRecipientDenomination && value <= product.maxRecipientDenomination; +export function isRangePriceGiftCardClaimable(giftCard: GiftCard, rewardAmount: BigNumberish) { + const value = Number(getGiftCardValue(giftCard, rewardAmount).toFixed(2)); + return value >= giftCard.minRecipientDenomination && value <= giftCard.maxRecipientDenomination; } -export function getFixedPriceToValueMap(product: ReloadlyProduct) { - const valueToPriceMap = product.fixedRecipientToSenderDenominationsMap; +export function getFixedPriceToValueMap(giftCard: GiftCard) { + const valueToPriceMap = giftCard.fixedRecipientToSenderDenominationsMap; const priceToValueMap: PriceToValueMap = {}; Object.keys(valueToPriceMap).forEach((value) => { - const totalPrice = getTotalPriceOfValue(Number(value), product); + const totalPrice = getTotalPriceOfValue(Number(value), giftCard); priceToValueMap[totalPrice.toFixed(2).toString()] = Number(value); }); return priceToValueMap; } -export function isFixedPriceProductAvailable(product: ReloadlyProduct, rewardAmount: BigNumberish) { - const priceToValueMap = getFixedPriceToValueMap(product); +export function isFixedPriceGiftCardClaimable(giftCard: GiftCard, rewardAmount: BigNumberish) { + const priceToValueMap = getFixedPriceToValueMap(giftCard); const priceAsKey = Number(formatEther(rewardAmount)).toFixed(2).toString(); return !!priceToValueMap[priceAsKey]; } -export function getProductValue(product: ReloadlyProduct, reward: BigNumberish, exchangeRate?: number) { - let productValue; +export function getGiftCardValue(giftCard: GiftCard, reward: BigNumberish, exchangeRate?: number) { + let giftCardValue; const amountDaiEth = Number(formatEther(reward)).toFixed(2); - if (product.denominationType == "FIXED") { - const priceToValueMap = getFixedPriceToValueMap(product); - productValue = priceToValueMap[amountDaiEth]; - } else if (product.denominationType == "RANGE") { - const usdValue = getUsdValueForRangePrice(product, reward); + if (giftCard.denominationType == "FIXED") { + const priceToValueMap = getFixedPriceToValueMap(giftCard); + giftCardValue = priceToValueMap[amountDaiEth]; + } else if (giftCard.denominationType == "RANGE") { + const usdValue = getUsdValueForRangePrice(giftCard, reward); if (!exchangeRate) { - exchangeRate = getEstimatedExchangeRate(product); + exchangeRate = getEstimatedExchangeRate(giftCard); } - productValue = usdValue / exchangeRate; + giftCardValue = usdValue / exchangeRate; } else { throw new Error( `Unknown denomination type of gift card: ${JSON.stringify({ - denominationType: product.denominationType, + denominationType: giftCard.denominationType, })}` ); } - if (!productValue) { - throw new Error(`Product is not available for the reward amount: ${JSON.stringify({ product, reward: reward })}`); + if (!giftCardValue) { + throw new Error(`Gift card is not available for the reward amount: ${JSON.stringify({ giftCard: giftCard, reward: reward })}`); } - return productValue; + return giftCardValue; } diff --git a/shared/types.ts b/shared/types.ts index df451b6f..ac2685b7 100644 --- a/shared/types.ts +++ b/shared/types.ts @@ -1,4 +1,4 @@ -export type ReloadlyProduct = { +export type GiftCard = { productId: number; productName: string; global: boolean; @@ -34,7 +34,7 @@ export type ReloadlyProduct = { }; export type ReloadlyListGiftCardResponse = { - content: ReloadlyProduct[]; + content: GiftCard[]; pageable: { sort: { sorted: boolean; diff --git a/static/scripts/rewards/gift-cards/activate/activate-html.ts b/static/scripts/rewards/gift-cards/activate/activate-html.ts index c338434d..3b3c3db7 100644 --- a/static/scripts/rewards/gift-cards/activate/activate-html.ts +++ b/static/scripts/rewards/gift-cards/activate/activate-html.ts @@ -1,8 +1,8 @@ -import { ReloadlyProduct } from "../../../../../shared/types"; +import { GiftCard } from "../../../../../shared/types"; const html = String.raw; -export function getGiftCardActivateInfoHtml(giftCard: ReloadlyProduct) { +export function getGiftCardActivateInfoHtml(giftCard: GiftCard) { return html`
diff --git a/static/scripts/rewards/gift-cards/claim/claim-action.ts b/static/scripts/rewards/gift-cards/claim/claim-action.ts index 6dd3c4e1..8f7e9a3d 100644 --- a/static/scripts/rewards/gift-cards/claim/claim-action.ts +++ b/static/scripts/rewards/gift-cards/claim/claim-action.ts @@ -6,22 +6,22 @@ import { giftCardTreasuryAddress } from "../../../../../shared/constants"; import { toaster } from "../../toaster"; import { isNonceClaimed, transferFromPermit, waitForTransaction } from "../../web3/erc20-permit"; import { getApiBaseUrl } from "../helpers"; -import { isProductAvailableForAmount } from "../../../../../shared/pricing"; -import { OrderRequestParams, ReloadlyProduct } from "../../../../../shared/types"; +import { isClaimableForAmount } from "../../../../../shared/pricing"; +import { OrderRequestParams, GiftCard } from "../../../../../shared/types"; import { isErc20Permit } from "../../render-transaction/render-transaction"; -export function attachClaimAction(className: string, giftCards: ReloadlyProduct[], app: AppState) { +export function attachClaimAction(className: string, giftCards: GiftCard[], app: AppState) { const claimButtons: HTMLCollectionOf = document.getElementsByClassName(className); Array.from(claimButtons).forEach((claimButton: Element) => { (claimButton as HTMLButtonElement).addEventListener("click", async () => { claimButton.setAttribute("data-loading", "true"); const productId = Number(claimButton.parentElement?.parentElement?.parentElement?.getAttribute("data-product-id")); - const product = giftCards.find((product: ReloadlyProduct) => product.productId == productId); + const product = giftCards.find((product: GiftCard) => product.productId == productId); if (product) { if (!isErc20Permit(app.reward)) { toaster.create("error", "Only ERC20 permits are allowed to claim a card."); - } else if (!isProductAvailableForAmount(product, app.reward.amount)) { + } else if (!isClaimableForAmount(product, app.reward.amount)) { toaster.create("error", "Your reward amount is not equal to the price of available card."); } else { await claimGiftCard(productId, app); diff --git a/static/scripts/rewards/gift-cards/gift-card.ts b/static/scripts/rewards/gift-cards/gift-card.ts index f85f6348..b59293fc 100644 --- a/static/scripts/rewards/gift-cards/gift-card.ts +++ b/static/scripts/rewards/gift-cards/gift-card.ts @@ -1,13 +1,13 @@ import { BigNumberish } from "ethers"; -import { ReloadlyProduct } from "../../../../shared/types"; -import { getFixedPriceToValueMap, getProductValue, getRangePriceToValueMap, isRangePriceProductAvailable } from "../../../../shared/pricing"; +import { GiftCard } from "../../../../shared/types"; +import { getFixedPriceToValueMap, getGiftCardValue, getRangePriceToValueMap, isRangePriceGiftCardClaimable } from "../../../../shared/pricing"; import { formatEther } from "ethers/lib/utils"; const html = String.raw; -export function getGiftCardHtml(giftCard: ReloadlyProduct, allowBuy: boolean, rewardAmount: BigNumberish) { +export function getGiftCardHtml(giftCard: GiftCard, allowBuy: boolean, rewardAmount: BigNumberish) { return html` -
+

${giftCard.productName.length > 16 ? giftCard.productName.substring(0, 16) + "..." : giftCard.productName}

@@ -48,7 +48,7 @@ export function getGiftCardHtml(giftCard: ReloadlyProduct, allowBuy: boolean, re `; } -function getFixedPricesHtml(giftCard: ReloadlyProduct, rewardAmount: BigNumberish) { +function getFixedPricesHtml(giftCard: GiftCard, rewardAmount: BigNumberish) { let _html = html`

Price
Value
@@ -67,10 +67,10 @@ function getFixedPricesHtml(giftCard: ReloadlyProduct, rewardAmount: BigNumberis return _html; } -function getRangePricesHtml(giftCard: ReloadlyProduct, rewardAmount: BigNumberish) { +function getRangePricesHtml(giftCard: GiftCard, rewardAmount: BigNumberish) { let _html = ``; - const productValue = getProductValue(giftCard, rewardAmount); - const isAvailable = isRangePriceProductAvailable(giftCard, rewardAmount); + const giftCardValue = getGiftCardValue(giftCard, rewardAmount); + const isAvailable = isRangePriceGiftCardClaimable(giftCard, rewardAmount); if (isAvailable) { _html += html`
Price
@@ -78,7 +78,7 @@ function getRangePricesHtml(giftCard: ReloadlyProduct, rewardAmount: BigNumberis
${formatEther(rewardAmount)}${giftCard.senderCurrencyCode}
-
${productValue.toFixed(2)}${giftCard.recipientCurrencyCode}
${giftCardValue.toFixed(2)}${giftCard.recipientCurrencyCode}

Available in range

`; } diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index e2893351..6ddf12e3 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -1,5 +1,5 @@ import { getGiftCardOrderId } from "../../../../shared/helpers"; -import { ReloadlyProduct, ReloadlyTransaction } from "../../../../shared/types"; +import { GiftCard, ReloadlyTransaction } from "../../../../shared/types"; import { AppState } from "../app-state"; import { attachActivateInfoAction } from "./activate/activate-action"; import { attachClaimAction } from "./claim/claim-action"; @@ -25,7 +25,7 @@ export async function initCollectGiftCard(app: AppState) { const [retrieveOrderResponse, retrieveGiftCardsResponse] = await Promise.all([fetch(retrieveOrderUrl, requestInit), fetch(listGiftCardsUrl, requestInit)]); const transaction = (await retrieveOrderResponse.json()) as ReloadlyTransaction; - const giftCards = (await retrieveGiftCardsResponse.json()) as ReloadlyProduct[]; + const giftCards = (await retrieveGiftCardsResponse.json()) as GiftCard[]; const giftCardsSection = document.getElementById("gift-cards"); if (!giftCardsSection) { @@ -42,7 +42,7 @@ export async function initCollectGiftCard(app: AppState) { const giftCard = giftCards.find((giftCard) => transaction.product.productId == giftCard.productId); let giftCardsHtml = `

Your gift card

`; - giftCardsHtml += `
`; + giftCardsHtml += `
`; if (giftCard) { giftCardsHtml += getGiftCardHtml(giftCard, false, app.reward.amount); } @@ -60,8 +60,8 @@ export async function initCollectGiftCard(app: AppState) { attachRevealAction(transaction, app); } else if (retrieveGiftCardsResponse.status == 200) { let giftCardsHtml = `

Or claim in virtual visa/mastercard

`; - giftCardsHtml += `
`; - giftCards.forEach((giftCard: ReloadlyProduct) => { + giftCardsHtml += `
`; + giftCards.forEach((giftCard: GiftCard) => { giftCardsHtml += getGiftCardHtml(giftCard, true, app.reward.amount); }); giftCardsHtml += `

`; @@ -72,7 +72,7 @@ export async function initCollectGiftCard(app: AppState) { giftCardsSection.innerHTML = giftCardsHtml; let activateInfoHtml = ""; - giftCards.forEach((giftCard: ReloadlyProduct) => { + giftCards.forEach((giftCard: GiftCard) => { activateInfoHtml += getGiftCardActivateInfoHtml(giftCard); }); activateInfoSection.innerHTML = activateInfoHtml; diff --git a/static/scripts/rewards/gift-cards/reveal/redeem-code-html.ts b/static/scripts/rewards/gift-cards/reveal/redeem-code-html.ts index f9a39786..a2bc6323 100644 --- a/static/scripts/rewards/gift-cards/reveal/redeem-code-html.ts +++ b/static/scripts/rewards/gift-cards/reveal/redeem-code-html.ts @@ -4,7 +4,7 @@ const html = String.raw; export function getRedeemCodeHtml(transaction: ReloadlyTransaction) { return html` -
+

Your redeem code

xxxxxxxxxxxx

xxxxxxxxxxxx

diff --git a/static/styles/rewards/gift-cards.css b/static/styles/rewards/gift-cards.css index 202a9fe4..9ae111a6 100644 --- a/static/styles/rewards/gift-cards.css +++ b/static/styles/rewards/gift-cards.css @@ -11,18 +11,18 @@ align-items: center; } -main:has(#gift-cards .product) { +main:has(#gift-cards .gift-card) { height: auto; } -main:has(#gift-cards .product) div:has(table.receipt) { +main:has(#gift-cards .gift-card) div:has(table.receipt) { padding-top: 50px; } .redeem-info-wrapper[data-show="false"] { display: none; } -.products { +.gift-cards-wrapper { display: flex; flex-direction: row; overflow-x: auto; @@ -33,7 +33,7 @@ main:has(#gift-cards .product) div:has(table.receipt) { align-items: end; padding-bottom: 12px; } -.products .product { +.gift-cards-wrapper .gift-card { transform: rotateX(180deg); } @@ -42,7 +42,7 @@ main:has(#gift-cards .product) div:has(table.receipt) { align-items: center; } -.product { +.gift-card { background-color: var(--background-color-default); margin-right: 10px; padding: 12px 6px; @@ -55,17 +55,17 @@ main:has(#gift-cards .product) div:has(table.receipt) { width: 160px; } -.product h3 { +.gift-card h3 { color: #fff; } -.product div.buttons { +.gift-card div.buttons { display: flex; flex-direction: row; justify-content: space-evenly; margin: 10px 0; } -.product div.buttons span { +.gift-card div.buttons span { display: flex; flex-direction: column; align-items: center; @@ -73,13 +73,13 @@ main:has(#gift-cards .product) div:has(table.receipt) { padding: 6px; } -.product div.buttons button { +.gift-card div.buttons button { background-color: #80808020; border: none; color: #fff; cursor: pointer; } -.product img { +.gift-card img { box-sizing: border-box; width: 100%; height: auto; @@ -88,14 +88,14 @@ main:has(#gift-cards .product) div:has(table.receipt) { max-height: 110px; } -.product .pricing { +.gift-card .pricing { display: flex; flex-direction: column; } -.product .pricing .available { +.gift-card .pricing .available { color: #fff; } -.product .pricing div { +.gift-card .pricing div { display: flex; flex-direction: row; justify-content: space-between; From 8d18bbae1f278fae069f958b2c9c59446869eb0d Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 17 May 2024 14:35:50 +0500 Subject: [PATCH 017/174] fix: check permit transfers correct erc20 token on claim gift card --- functions/post-order.ts | 13 ++++++++++++- shared/constants.ts | 4 ++++ static/scripts/rewards/constants.ts | 5 ----- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/functions/post-order.ts b/functions/post-order.ts index 2c136892..6c642c56 100644 --- a/functions/post-order.ts +++ b/functions/post-order.ts @@ -1,7 +1,7 @@ import { TransactionReceipt, TransactionResponse } from "@ethersproject/providers"; import { JsonRpcProvider } from "@ethersproject/providers/lib/json-rpc-provider"; import { Interface } from "ethers/lib/utils"; -import { giftCardTreasuryAddress, permit2Address } from "../shared/constants"; +import { Tokens, giftCardTreasuryAddress, permit2Address } from "../shared/constants"; import { getGiftCardOrderId } from "../shared/helpers"; import { ExchangeRate, NotOkReloadlyApiResponse, OrderRequestParams, ReloadlyOrderResponse, GiftCard } from "../shared/types"; import { permit2Abi } from "../static/scripts/rewards/abis/permit2Abi"; @@ -90,6 +90,17 @@ export const onRequest: PagesFunction = async (ctx) => { return errorResponse; } + if (txParsed.args.permit[0].token.toLowerCase() != Tokens.WXDAI.toLowerCase()) { + console.error( + "Given transaction hash is not transferring the required ERC20 token.", + JSON.stringify({ + tranferedToken: txParsed.args.permit[0].token.toLowerCase(), + requiredToken: Tokens.WXDAI.toLowerCase(), + }) + ); + return errorResponse; + } + const amountDaiWei = txParsed.args.transferDetails.requestedAmount; let exchangeRate = 1; diff --git a/shared/constants.ts b/shared/constants.ts index 40b01d7f..3d8cce24 100644 --- a/shared/constants.ts +++ b/shared/constants.ts @@ -1,2 +1,6 @@ +export enum Tokens { + DAI = "0x6b175474e89094c44da98b954eedeac495271d0f", + WXDAI = "0xe91d153e0b41518a2ce8dd3d7944fa863463a97d", +} export const permit2Address = "0x000000000022D473030F116dDEE9F6B43aC78BA3"; export const giftCardTreasuryAddress = "0x3B47E3e4758E133acf72684727Dc10550C40e4B9"; diff --git a/static/scripts/rewards/constants.ts b/static/scripts/rewards/constants.ts index 6c772a56..27b84aaa 100644 --- a/static/scripts/rewards/constants.ts +++ b/static/scripts/rewards/constants.ts @@ -11,11 +11,6 @@ enum NetworkIds { Anvil = 31337, } -enum Tokens { - DAI = "0x6b175474e89094c44da98b954eedeac495271d0f", - WXDAI = "0xe91d153e0b41518a2ce8dd3d7944fa863463a97d", -} - const networkNames = { [NetworkIds.Mainnet]: "Ethereum Mainnet", [NetworkIds.Goerli]: "Goerli Testnet", From 7cc3fc56e8aeb33acb90f4da181688cc0110835a Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 17 May 2024 16:39:48 +0500 Subject: [PATCH 018/174] fix: check permit token owner is correct on claim gift card --- functions/post-order.ts | 100 ++++++++++++++++++++++++---------------- shared/constants.ts | 3 ++ 2 files changed, 62 insertions(+), 41 deletions(-) diff --git a/functions/post-order.ts b/functions/post-order.ts index 6c642c56..94d3589c 100644 --- a/functions/post-order.ts +++ b/functions/post-order.ts @@ -1,7 +1,7 @@ import { TransactionReceipt, TransactionResponse } from "@ethersproject/providers"; import { JsonRpcProvider } from "@ethersproject/providers/lib/json-rpc-provider"; -import { Interface } from "ethers/lib/utils"; -import { Tokens, giftCardTreasuryAddress, permit2Address } from "../shared/constants"; +import { Interface, TransactionDescription } from "ethers/lib/utils"; +import { Tokens, giftCardTreasuryAddress, permit2Address, permitTokenOwner } from "../shared/constants"; import { getGiftCardOrderId } from "../shared/helpers"; import { ExchangeRate, NotOkReloadlyApiResponse, OrderRequestParams, ReloadlyOrderResponse, GiftCard } from "../shared/types"; import { permit2Abi } from "../static/scripts/rewards/abis/permit2Abi"; @@ -60,45 +60,9 @@ export const onRequest: PagesFunction = async (ctx) => { console.log("Parsed transaction data: ", JSON.stringify(txParsed)); - const rewardAmount = txParsed.args.transferDetails.requestedAmount; - - if (!isClaimableForAmount(giftCard, rewardAmount)) { - return Response.json({ message: "Your reward amount is either too high or too low to buy this card." }, { status: 403 }); - } - - const errorResponse = Response.json({ message: "Transaction is not authorized to purchase gift card." }, { status: 403 }); - - if (txReceipt.to.toLowerCase() != permit2Address.toLowerCase()) { - console.error("Given transaction hash is not an interaction with permit2Address", `txReceipt.to=${txReceipt.to}`, `permit2Address=${permit2Address}`); - return errorResponse; - } - - if (txParsed.args.transferDetails.to.toLowerCase() != giftCardTreasuryAddress.toLowerCase()) { - console.error( - "Given transaction hash is not a token transfer to giftCardTreasuryAddress", - `txParsed.args.transferDetails.to=${txParsed.args.transferDetails.to}`, - `giftCardTreasuryAddress=${giftCardTreasuryAddress}` - ); - return errorResponse; - } - - if (txParsed.functionFragment.name != "permitTransferFrom") { - console.error( - "Given transaction hash is not call to contract function permitTransferFrom", - `txParsed.functionFragment.name=${txParsed.functionFragment.name}` - ); - return errorResponse; - } - - if (txParsed.args.permit[0].token.toLowerCase() != Tokens.WXDAI.toLowerCase()) { - console.error( - "Given transaction hash is not transferring the required ERC20 token.", - JSON.stringify({ - tranferedToken: txParsed.args.permit[0].token.toLowerCase(), - requiredToken: Tokens.WXDAI.toLowerCase(), - }) - ); - return errorResponse; + const errorResposne = validateTransaction(txParsed, txReceipt, giftCard); + if (errorResposne) { + return errorResposne; } const amountDaiWei = txParsed.args.transferDetails.requestedAmount; @@ -236,3 +200,57 @@ async function getExchangeRate(usdAmount: number, fromCurrency: string, accessTo return responseJson as ExchangeRate; } + +function validateTransaction(txParsed: TransactionDescription, txReceipt: TransactionReceipt, giftCard: GiftCard) { + const rewardAmount = txParsed.args.transferDetails.requestedAmount; + + if (!isClaimableForAmount(giftCard, rewardAmount)) { + return Response.json({ message: "Your reward amount is either too high or too low to buy this card." }, { status: 403 }); + } + + const errorResponse = Response.json({ message: "Transaction is not authorized to purchase gift card." }, { status: 403 }); + + if (txReceipt.to.toLowerCase() != permit2Address.toLowerCase()) { + console.error("Given transaction hash is not an interaction with permit2Address", `txReceipt.to=${txReceipt.to}`, `permit2Address=${permit2Address}`); + return errorResponse; + } + + if (txParsed.args.transferDetails.to.toLowerCase() != giftCardTreasuryAddress.toLowerCase()) { + console.error( + "Given transaction hash is not a token transfer to giftCardTreasuryAddress", + `txParsed.args.transferDetails.to=${txParsed.args.transferDetails.to}`, + `giftCardTreasuryAddress=${giftCardTreasuryAddress}` + ); + return errorResponse; + } + + if (txParsed.functionFragment.name != "permitTransferFrom") { + console.error( + "Given transaction hash is not call to contract function permitTransferFrom", + `txParsed.functionFragment.name=${txParsed.functionFragment.name}` + ); + return errorResponse; + } + + if (txParsed.args.permit[0].token.toLowerCase() != Tokens.WXDAI.toLowerCase()) { + console.error( + "Given transaction hash is not transferring the required ERC20 token.", + JSON.stringify({ + tranferedToken: txParsed.args.permit[0].token, + requiredToken: Tokens.WXDAI.toLowerCase(), + }) + ); + return errorResponse; + } + + if (txParsed.args.owner.toLowerCase() != permitTokenOwner.toLowerCase()) { + console.error( + "Given transaction hash has not a valid permit signer, and reward token owner.", + JSON.stringify({ + "txParsed.args.owner": txParsed.args.owner, + permitsTransferOwner: permitTokenOwner, + }) + ); + return errorResponse; + } +} diff --git a/shared/constants.ts b/shared/constants.ts index 3d8cce24..0d08487e 100644 --- a/shared/constants.ts +++ b/shared/constants.ts @@ -4,3 +4,6 @@ export enum Tokens { } export const permit2Address = "0x000000000022D473030F116dDEE9F6B43aC78BA3"; export const giftCardTreasuryAddress = "0x3B47E3e4758E133acf72684727Dc10550C40e4B9"; + +// Signer of the permit and owner of the tokens are same in SignatureTransfer +export const permitTokenOwner = "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"; From 8fe9b2b404956370439e109ae87d1b91092c0fc1 Mon Sep 17 00:00:00 2001 From: EresDev Date: Sat, 18 May 2024 00:29:44 +0500 Subject: [PATCH 019/174] fix: validate correct token transfer on different chains --- functions/post-order.ts | 14 +++++++------- shared/constants.ts | 6 ++++++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/functions/post-order.ts b/functions/post-order.ts index 94d3589c..328bd616 100644 --- a/functions/post-order.ts +++ b/functions/post-order.ts @@ -1,7 +1,7 @@ import { TransactionReceipt, TransactionResponse } from "@ethersproject/providers"; import { JsonRpcProvider } from "@ethersproject/providers/lib/json-rpc-provider"; import { Interface, TransactionDescription } from "ethers/lib/utils"; -import { Tokens, giftCardTreasuryAddress, permit2Address, permitTokenOwner } from "../shared/constants"; +import { Tokens, chainIdToRewardTokenMap, giftCardTreasuryAddress, permit2Address, permitTokenOwner } from "../shared/constants"; import { getGiftCardOrderId } from "../shared/helpers"; import { ExchangeRate, NotOkReloadlyApiResponse, OrderRequestParams, ReloadlyOrderResponse, GiftCard } from "../shared/types"; import { permit2Abi } from "../static/scripts/rewards/abis/permit2Abi"; @@ -60,9 +60,9 @@ export const onRequest: PagesFunction = async (ctx) => { console.log("Parsed transaction data: ", JSON.stringify(txParsed)); - const errorResposne = validateTransaction(txParsed, txReceipt, giftCard); - if (errorResposne) { - return errorResposne; + const errorResponse = validateTransaction(txParsed, txReceipt, chainId, giftCard); + if (errorResponse) { + return errorResponse; } const amountDaiWei = txParsed.args.transferDetails.requestedAmount; @@ -201,7 +201,7 @@ async function getExchangeRate(usdAmount: number, fromCurrency: string, accessTo return responseJson as ExchangeRate; } -function validateTransaction(txParsed: TransactionDescription, txReceipt: TransactionReceipt, giftCard: GiftCard) { +function validateTransaction(txParsed: TransactionDescription, txReceipt: TransactionReceipt, chainId: number, giftCard: GiftCard) { const rewardAmount = txParsed.args.transferDetails.requestedAmount; if (!isClaimableForAmount(giftCard, rewardAmount)) { @@ -232,11 +232,11 @@ function validateTransaction(txParsed: TransactionDescription, txReceipt: Transa return errorResponse; } - if (txParsed.args.permit[0].token.toLowerCase() != Tokens.WXDAI.toLowerCase()) { + if (txParsed.args.permit[0].token.toLowerCase() != chainIdToRewardTokenMap[chainId].toLowerCase()) { console.error( "Given transaction hash is not transferring the required ERC20 token.", JSON.stringify({ - tranferedToken: txParsed.args.permit[0].token, + transferredToken: txParsed.args.permit[0].token, requiredToken: Tokens.WXDAI.toLowerCase(), }) ); diff --git a/shared/constants.ts b/shared/constants.ts index 0d08487e..7bc02d40 100644 --- a/shared/constants.ts +++ b/shared/constants.ts @@ -2,8 +2,14 @@ export enum Tokens { DAI = "0x6b175474e89094c44da98b954eedeac495271d0f", WXDAI = "0xe91d153e0b41518a2ce8dd3d7944fa863463a97d", } + export const permit2Address = "0x000000000022D473030F116dDEE9F6B43aC78BA3"; export const giftCardTreasuryAddress = "0x3B47E3e4758E133acf72684727Dc10550C40e4B9"; // Signer of the permit and owner of the tokens are same in SignatureTransfer export const permitTokenOwner = "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"; + +export const chainIdToRewardTokenMap = { + 1: Tokens.DAI, + 100: Tokens.WXDAI, +}; From 83b816a040c40fd3dcf0cdbcf2ef108377850adb Mon Sep 17 00:00:00 2001 From: EresDev Date: Wed, 22 May 2024 02:50:53 +0500 Subject: [PATCH 020/174] refactor: allow tests to generate permits without CLI --- .../typescript/generate-erc20-permit-url.ts | 44 +++++++++++-------- scripts/typescript/generate-permit2-url.ts | 4 +- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/scripts/typescript/generate-erc20-permit-url.ts b/scripts/typescript/generate-erc20-permit-url.ts index fb23fec0..bf87df7b 100644 --- a/scripts/typescript/generate-erc20-permit-url.ts +++ b/scripts/typescript/generate-erc20-permit-url.ts @@ -5,36 +5,38 @@ import { BigNumber, ethers } from "ethers"; import { log } from "./utils"; dotenv.config(); +export type PermitConfig = NodeJS.ProcessEnv; + const PERMIT2_ADDRESS = "0x000000000022D473030F116dDEE9F6B43aC78BA3"; // same on all chains -function createProviderAndWallet() { - const provider = new ethers.providers.JsonRpcProvider(process.env.RPC_PROVIDER_URL); - const myWallet = new ethers.Wallet(process.env.UBIQUIBOT_PRIVATE_KEY, provider); +function createProviderAndWallet(permitConfig: PermitConfig) { + const provider = new ethers.providers.JsonRpcProvider(permitConfig.RPC_PROVIDER_URL); + const myWallet = new ethers.Wallet(permitConfig.UBIQUIBOT_PRIVATE_KEY, provider); return { provider, myWallet }; } -function createPermitTransferFromData(amount: string) { +function createPermitTransferFromData(permitConfig: PermitConfig) { return { permitted: { - token: process.env.PAYMENT_TOKEN_ADDRESS || "", - amount: ethers.utils.parseUnits(amount || "", 18), + token: permitConfig.PAYMENT_TOKEN_ADDRESS || "", + amount: ethers.utils.parseUnits(permitConfig.AMOUNT_IN_ETH || "", 18), }, - spender: process.env.BENEFICIARY_ADDRESS, + spender: permitConfig.BENEFICIARY_ADDRESS, nonce: BigNumber.from(`0x${randomBytes(32).toString("hex")}`), deadline: MaxUint256, }; } -async function signTypedData(myWallet: ethers.Wallet, permitTransferFromData: PermitTransferFrom) { +async function signTypedData(myWallet: ethers.Wallet, permitTransferFromData: PermitTransferFrom, permitConfig: PermitConfig) { const { domain, types, values } = SignatureTransfer.getPermitData( permitTransferFromData, PERMIT2_ADDRESS, - process.env.CHAIN_ID ? Number(process.env.CHAIN_ID) : 1 + permitConfig.CHAIN_ID ? Number(permitConfig.CHAIN_ID) : 1 ); return await myWallet._signTypedData(domain, types, values); } -function createTxData(myWallet: ethers.Wallet, permitTransferFromData: PermitTransferFrom, signature: string) { +function createTxData(myWallet: ethers.Wallet, permitTransferFromData: PermitTransferFrom, signature: string, permitConfig: PermitConfig) { return { type: "erc20-permit", permit: { @@ -51,25 +53,29 @@ function createTxData(myWallet: ethers.Wallet, permitTransferFromData: PermitTra }, owner: myWallet.address, signature: signature, - networkId: Number(process.env.CHAIN_ID), + networkId: Number(permitConfig.CHAIN_ID), }; } -export async function generateERC20Permit() { - const { myWallet } = createProviderAndWallet(); +export async function generateERC20Permit(permitConfig: PermitConfig) { + const { myWallet } = createProviderAndWallet(permitConfig); - const permitTransferFromData = createPermitTransferFromData(process.env.AMOUNT_IN_ETH); - const signature = await signTypedData(myWallet, permitTransferFromData); + const permitTransferFromData = createPermitTransferFromData(permitConfig); + const signature = await signTypedData(myWallet, permitTransferFromData, permitConfig); - const permitTransferFromData2 = createPermitTransferFromData("9"); - const sig = await signTypedData(myWallet, permitTransferFromData); + const permitTransferFromData2 = createPermitTransferFromData({ ...permitConfig, AMOUNT_IN_ETH: "9" }); + const sig = await signTypedData(myWallet, permitTransferFromData, permitConfig); - const txData = [createTxData(myWallet, permitTransferFromData, signature), createTxData(myWallet, permitTransferFromData2, sig)]; + const txData = [createTxData(myWallet, permitTransferFromData, signature, permitConfig), createTxData(myWallet, permitTransferFromData2, sig, permitConfig)]; const base64encodedTxData = Buffer.from(JSON.stringify(txData)).toString("base64"); + return `${permitConfig.FRONTEND_URL}?claim=${base64encodedTxData}`; +} + +export async function logERC20Permit(permitConfig: PermitConfig) { log.ok("ERC20 Local URL:"); - log.info(`${process.env.FRONTEND_URL}?claim=${base64encodedTxData}`); + log.info(await generateERC20Permit(permitConfig)); } /* eslint-disable @typescript-eslint/no-namespace */ diff --git a/scripts/typescript/generate-permit2-url.ts b/scripts/typescript/generate-permit2-url.ts index e1e0f7c5..d6336a01 100644 --- a/scripts/typescript/generate-permit2-url.ts +++ b/scripts/typescript/generate-permit2-url.ts @@ -1,9 +1,9 @@ -import { generateERC20Permit } from "./generate-erc20-permit-url"; +import { logERC20Permit } from "./generate-erc20-permit-url"; import { generateERC721Permit } from "./generate-erc721-permit-url"; import { verifyEnvironmentVariables } from "./utils"; (async () => { verifyEnvironmentVariables(); generateERC721Permit().catch(console.error); - generateERC20Permit().catch(console.error); + logERC20Permit(process.env).catch(console.error); })().catch(console.error); From bd17ddb257a2bb66bce0116795698f1db932f3d2 Mon Sep 17 00:00:00 2001 From: EresDev Date: Wed, 22 May 2024 02:53:57 +0500 Subject: [PATCH 021/174] fix: show price/value upto 2 decimals in title --- static/scripts/rewards/gift-cards/gift-card.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/static/scripts/rewards/gift-cards/gift-card.ts b/static/scripts/rewards/gift-cards/gift-card.ts index b59293fc..57082691 100644 --- a/static/scripts/rewards/gift-cards/gift-card.ts +++ b/static/scripts/rewards/gift-cards/gift-card.ts @@ -60,8 +60,8 @@ function getFixedPricesHtml(giftCard: GiftCard, rewardAmount: BigNumberish) { Object.keys(priceToValueMap).forEach((price) => { const _class = price == priceAsKey ? ` class="available"` : ``; _html += html` -
${Number(price).toFixed(0)}${giftCard.senderCurrencyCode}
-
${priceToValueMap[price].toFixed(0)}${giftCard.recipientCurrencyCode}
+
${Number(price).toFixed(0)}${giftCard.senderCurrencyCode}
+
${priceToValueMap[price].toFixed(0)}${giftCard.recipientCurrencyCode}
`; }); return _html; @@ -88,11 +88,15 @@ function getRangePricesHtml(giftCard: GiftCard, rewardAmount: BigNumberish) { _html += html`
Value
-
${giftCard.minRecipientDenomination.toFixed(0)}-${giftCard.maxRecipientDenomination.toFixed(0)}${giftCard.recipientCurrencyCode}
+
${giftCard.minRecipientDenomination.toFixed(0)}-${giftCard.maxRecipientDenomination.toFixed(0)}${giftCard.recipientCurrencyCode}
Price
-
${Number(prices[0]).toFixed(0)}-${Number(prices[1]).toFixed(0)}${giftCard.senderCurrencyCode}
+
${Number(prices[0]).toFixed(0)}-${Number(prices[1]).toFixed(0)}${giftCard.senderCurrencyCode}
`; From eff05451c6baf124aafb5e0b9e6ebd25745c2bb4 Mon Sep 17 00:00:00 2001 From: EresDev Date: Wed, 22 May 2024 03:06:54 +0500 Subject: [PATCH 022/174] test: add tests for claiming gift cards --- cypress.config.ts | 3 + cypress/e2e/claim-gift-card.cy.ts | 196 ++++++++++++++++++++++++++++++ cypress/e2e/index.d.ts | 7 ++ shared/constants.ts | 1 + 4 files changed, 207 insertions(+) create mode 100644 cypress/e2e/claim-gift-card.cy.ts create mode 100644 cypress/e2e/index.d.ts diff --git a/cypress.config.ts b/cypress.config.ts index 8eee7a78..772753d2 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -8,6 +8,9 @@ export default defineConfig({ setupNodeEvents() {}, baseUrl: "http://localhost:8080", experimentalStudio: true, + env: { + permitConfig: { ...process.env }, + }, }, viewportHeight: 900, viewportWidth: 1440, diff --git a/cypress/e2e/claim-gift-card.cy.ts b/cypress/e2e/claim-gift-card.cy.ts new file mode 100644 index 00000000..950377d2 --- /dev/null +++ b/cypress/e2e/claim-gift-card.cy.ts @@ -0,0 +1,196 @@ +/* eslint-disable sonarjs/no-duplicate-string */ +import { JsonRpcProvider, JsonRpcSigner } from "@ethersproject/providers"; +import { Wallet } from "ethers"; +import { PermitConfig, generateERC20Permit } from "../../scripts/typescript/generate-erc20-permit-url"; + +const beneficiary = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; // anvil +const SENDER_PRIVATE_KEY = "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d"; // anvil + +describe("Gift Cards", () => { + beforeEach(() => { + cy.clearAllCookies(); + cy.clearAllLocalStorage(); + cy.clearAllSessionStorage(); + setupStubs(); + + setupIntercepts(); + }); + + it("should show/hide activation info", () => { + cy.intercept({ method: "GET", url: "/list-gift-cards" }).as("listGiftCards"); + + const permitConfig = Cypress.env("permitConfig"); + void cy.getPermitUrl(permitConfig).then((permitUrl) => { + cy.visit(`${permitUrl as string}`); + + cy.wait("@listGiftCards"); + + cy.get("#gift-cards").should("exist").and("include.text", "Or claim in virtual visa/mastercard"); + cy.get(".gift-card").should("have.length.above", 0); + + cy.get(".gift-card.purchased").should("not.exist"); + + cy.get('#activate-info .redeem-info-wrapper[data-show="true"]').should("not.exist"); + cy.get(".gift-card").eq(0).find(".activate-btn").invoke("click"); + + cy.get('#activate-info .redeem-info-wrapper[data-show="true"]').should("exist"); + cy.get("#activate-info .close-btn").invoke("click"); + cy.get('#activate-info .redeem-info-wrapper[data-show="true"]').should("not.exist"); + }); + }); + + it("should claim a gift card", () => { + const permitConfig = Cypress.env("permitConfig"); + // 9 WXDAI permit + // Reloadly sandbox has auto recharge when balance falls below 10USD + // so reloadly balance should not be below 10$ + const customPermitConfig = { ...permitConfig, AMOUNT_IN_ETH: "9.0" }; + + void cy.getPermitUrl(customPermitConfig).then((customPermitUrl) => { + // console.log("permitUrl", customPermitUrl); + cy.intercept({ method: "GET", url: "/list-gift-cards" }).as("listGiftCards"); + + cy.visit(customPermitUrl); + cy.wait("@listGiftCards"); + cy.get(".gift-card").should("have.length.above", 0); + cy.get(".gift-card .available").should("have.length.above", 0); + cy.get(".gift-card .available") + .eq(0) + .parent() + .parent() + .find("h3") + .eq(0) + .then(($name) => { + const giftCardName = $name; + cy.wrap(giftCardName).as("giftCardName"); + }); + + cy.intercept({ method: "POST", url: "/post-order" }).as("postOrder"); + + cy.get(".gift-card .available").eq(0).parent().parent().find(".claim-gift-card-btn").should("have.length", 1); + cy.get(".gift-card .available").eq(0).parent().parent().find(".claim-gift-card-btn").invoke("click"); + + cy.wait("@postOrder", { timeout: 10000 }); + + cy.get("#gift-cards").should("exist").and("include.text", "Your gift card"); + + cy.get("@giftCardName").then((name) => { + cy.get(".gift-card h3") + .eq(0) + .should("have.text", name.text() as string); + }); + }); + }); + + it("should reveal a redeem code after claim", () => { + cy.intercept({ method: "GET", url: "/list-gift-cards" }).as("listGiftCards"); + cy.visit( + "http://localhost:8080/?claim=W3sidHlwZSI6ImVyYzIwLXBlcm1pdCIsInBlcm1pdCI6eyJwZXJtaXR0ZWQiOnsidG9rZW4iOiIweGU5MUQxNTNFMGI0MTUxOEEyQ2U4RGQzRDc5NDRGYTg2MzQ2M2E5N2QiLCJhbW91bnQiOiIyMzE2MDAwMDAwMDAwMDAwMDAwMCJ9LCJub25jZSI6IjY4MDM3MTQ4MTA2MjkyODM2MDY5NDA4MDUxNjgwODY0NDc1MjcxMDE0MjY4Njc3NzI0NTQ5MzM4ODkxMTU4NDI1MjY5NjY4NzU3ODI0IiwiZGVhZGxpbmUiOiIxMTU3OTIwODkyMzczMTYxOTU0MjM1NzA5ODUwMDg2ODc5MDc4NTMyNjk5ODQ2NjU2NDA1NjQwMzk0NTc1ODQwMDc5MTMxMjk2Mzk5MzUifSwidHJhbnNmZXJEZXRhaWxzIjp7InRvIjoiMHhmMzlGZDZlNTFhYWQ4OEY2RjRjZTZhQjg4MjcyNzljZmZGYjkyMjY2IiwicmVxdWVzdGVkQW1vdW50IjoiMjMxNjAwMDAwMDAwMDAwMDAwMDAifSwib3duZXIiOiIweDcwOTk3OTcwQzUxODEyZGMzQTAxMEM3ZDAxYjUwZTBkMTdkYzc5QzgiLCJzaWduYXR1cmUiOiIweDkzNzdiMTczNjE5OTAwNDU2YzYxZDY3NTEzNGM2MTEyOGY1N2VmOTU5YjhmZTQ5NmUyMjYyYzEwMTY2Mjk5NGQzYWE2YzRlZDgyODQ0ZjQwY2M2NzQxZTcwMGYxMTkxZjViNGRlN2VhZGJlN2ZhMWU4ZGE4MzNjY2Y4MTA1YTM1MWIiLCJuZXR3b3JrSWQiOjMxMzM3fSx7InR5cGUiOiJlcmMyMC1wZXJtaXQiLCJwZXJtaXQiOnsicGVybWl0dGVkIjp7InRva2VuIjoiMHhlOTFEMTUzRTBiNDE1MThBMkNlOERkM0Q3OTQ0RmE4NjM0NjNhOTdkIiwiYW1vdW50IjoiOTAwMDAwMDAwMDAwMDAwMDAwMCJ9LCJub25jZSI6Ijg3NDA5NDg3MzUyMzAwMzgyODA3NTYwODM1MDEwODI1ODk4MDY0OTk1MzA1OTk3NTM2Mzg2NDE0NDQ3NTQ2MjQ5NDc3ODE0NjY3Nzk1IiwiZGVhZGxpbmUiOiIxMTU3OTIwODkyMzczMTYxOTU0MjM1NzA5ODUwMDg2ODc5MDc4NTMyNjk5ODQ2NjU2NDA1NjQwMzk0NTc1ODQwMDc5MTMxMjk2Mzk5MzUifSwidHJhbnNmZXJEZXRhaWxzIjp7InRvIjoiMHhmMzlGZDZlNTFhYWQ4OEY2RjRjZTZhQjg4MjcyNzljZmZGYjkyMjY2IiwicmVxdWVzdGVkQW1vdW50IjoiOTAwMDAwMDAwMDAwMDAwMDAwMCJ9LCJvd25lciI6IjB4NzA5OTc5NzBDNTE4MTJkYzNBMDEwQzdkMDFiNTBlMGQxN2RjNzlDOCIsInNpZ25hdHVyZSI6IjB4OTM3N2IxNzM2MTk5MDA0NTZjNjFkNjc1MTM0YzYxMTI4ZjU3ZWY5NTliOGZlNDk2ZTIyNjJjMTAxNjYyOTk0ZDNhYTZjNGVkODI4NDRmNDBjYzY3NDFlNzAwZjExOTFmNWI0ZGU3ZWFkYmU3ZmExZThkYTgzM2NjZjgxMDVhMzUxYiIsIm5ldHdvcmtJZCI6MzEzMzd9XQ==" + ); + + cy.wait("@listGiftCards"); + cy.get(".gift-card").should("have.length", 0); + + cy.get("#gift-cards").should("exist").and("include.text", "Your gift card"); + cy.get(".gift-card.redeem-code > h3").eq(0).should("have.text", "Your redeem code"); + cy.get(".gift-card.redeem-code > p").eq(0).should("have.text", "xxxxxxxxxxxx"); + cy.get(".gift-card.redeem-code > p").eq(1).should("have.text", "xxxxxxxxxxxx"); + cy.get(".gift-card.redeem-code > p").eq(2).should("have.text", "xxxxxxxxxxxx"); + cy.get(".gift-card.redeem-code > .buttons > #reveal-btn").invoke("click"); + + cy.get(".gift-card.redeem-code > h3").eq(0).should("have.text", "Your redeem code"); + cy.get(".gift-card.redeem-code > p").should("exist"); + cy.get(".gift-card.redeem-code > p").eq(0).should("not.have.text", "xxxxxxxxxxxx"); + }); +}); + +function setupStubs() { + const provider = new JsonRpcProvider("http://localhost:8545", 31337); + const signer = provider.getSigner(beneficiary); + const wallet = new Wallet(SENDER_PRIVATE_KEY, provider); + + signer.signMessage = cy.stub().callsFake(async () => { + return "0x824d8532d8b96dd4bed592bbb58eb090f23fabfe3e27e017c0b9a378667b3eca2a3fd2449362d18001eaca07dd8f77feadb7ddbafe35ba49704941c8c6af6c061b"; + }); + stubEthereum(signer); + + return { provider, signer, wallet }; +} + +function setupIntercepts() { + cy.intercept("POST", "*", (req) => { + // capturing the RPC optimization calls + if (req.body.method === "eth_getBlockByNumber") { + req.reply({ + statusCode: 200, + body: cy.fixture("eth_getBlockByNumber.json"), + }); + } + }); + + cy.intercept("POST", "https://wfzpewmlyiozupulbuur.supabase.co/rest/v1/*", { + statusCode: 200, + body: {}, + }); + cy.intercept("PATCH", "https://wfzpewmlyiozupulbuur.supabase.co/rest/v1/*", { + statusCode: 200, + body: {}, + }); + cy.intercept("GET", "https://wfzpewmlyiozupulbuur.supabase.co/rest/v1/*", { + statusCode: 200, + body: {}, + }); +} + +function stubEthereum(signer: JsonRpcSigner) { + // Stubbing the ethereum object + cy.on("window:before:load", (win) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ((win as any).ethereum = { + isMetaMask: true, + enable: cy.stub().resolves(["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"]), + request: cy.stub().callsFake(async (method) => providerFunctions(method)), + on: cy.stub().callsFake((event, cb) => { + if (event === "accountsChanged") { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (win as any).ethereum.onAccountsChanged = cb; + } + }), + autoRefreshOnNetworkChange: false, + chainId: "0x7a69", + selectedAddress: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + requestAccounts: cy.stub().resolves(["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"]), + send: cy.stub().callsFake(async (method) => providerFunctions(method)), + getSigner: () => signer, + }), + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ((win as any).signer = signer); + }); +} + +function providerFunctions(method: string) { + switch (method) { + case "eth_requestAccounts": + return ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"]; + case "wallet_sendDomainMetadata": + return true; + case "wallet_addEthereumChain": + return true; + case "wallet_switchEthereumChain": + return true; + case "wallet_watchAsset": + return true; + case "eth_chainId": + return "0x7a69"; + case "eth_accounts": + return ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"]; + case "eth_signTypedData_v4": + return "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; + case "eth_estimateGas": + return "0x7a69"; + } +} + +Cypress.Commands.add("getPermitUrl", (customPermitConfig: PermitConfig) => { + return generateERC20Permit(customPermitConfig); +}); diff --git a/cypress/e2e/index.d.ts b/cypress/e2e/index.d.ts new file mode 100644 index 00000000..63248ca0 --- /dev/null +++ b/cypress/e2e/index.d.ts @@ -0,0 +1,7 @@ +/// + +declare namespace Cypress { + interface Chainable { + getPermitUrl(permitConfig: PermitConfig): Promise; + } +} diff --git a/shared/constants.ts b/shared/constants.ts index 7bc02d40..11e9d1a7 100644 --- a/shared/constants.ts +++ b/shared/constants.ts @@ -12,4 +12,5 @@ export const permitTokenOwner = "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"; export const chainIdToRewardTokenMap = { 1: Tokens.DAI, 100: Tokens.WXDAI, + 31337: Tokens.WXDAI, }; From d12b9bb2c0b44f874a0cd1c14e5127d1a0002c09 Mon Sep 17 00:00:00 2001 From: EresDev Date: Wed, 22 May 2024 21:46:45 +0500 Subject: [PATCH 023/174] fix: add date filter to retrieve old order --- functions/get-order.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/functions/get-order.ts b/functions/get-order.ts index 4dc2a0a4..fce5c43c 100644 --- a/functions/get-order.ts +++ b/functions/get-order.ts @@ -31,7 +31,11 @@ export const onRequest: PagesFunction = async (ctx) => { }; export const getTransactionFromOrderId = async (orderId: string, accessToken: AccessToken) => { - const url = `${getBaseUrl(accessToken.isSandbox)}/reports/transactions?size=1&page=1&customIdentifier=${orderId}`; + const nowFormatted = new Date().toISOString().replace("T", " ").substring(0, 19); //// yyyy-mm-dd HH:mm:ss + const oneYearago = new Date(new Date().setFullYear(new Date().getFullYear() - 1)); + const oneYearagoFormatted = oneYearago.toISOString().replace("T", " ").substring(0, 19); + + const url = `${getBaseUrl(accessToken.isSandbox)}/reports/transactions?size=1&page=1&customIdentifier=${orderId}&startDate=${oneYearagoFormatted}&endDate=${nowFormatted}`; console.log(`Retrieving transaction from ${url}`); const options = { method: "GET", From 0e909ec53ab0ec7e71c0d890fc647f74baa42e68 Mon Sep 17 00:00:00 2001 From: EresDev Date: Thu, 23 May 2024 00:11:55 +0500 Subject: [PATCH 024/174] test: ignore balance because it changes with tests --- cypress/e2e/claim-portal-success.cy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/e2e/claim-portal-success.cy.ts b/cypress/e2e/claim-portal-success.cy.ts index 16f13255..8043018d 100644 --- a/cypress/e2e/claim-portal-success.cy.ts +++ b/cypress/e2e/claim-portal-success.cy.ts @@ -21,7 +21,7 @@ describe("Claims Portal Success", () => { it("should successfully claim a permit", () => { cy.get("#additionalDetails", { timeout: 15000 }).should("be.visible").invoke("click"); - cy.get('table[data-make-claim="ok"]').should("exist").and("include.text", "337888.4 WXDAI"); + cy.get('table[data-make-claim="ok"]').should("exist"); cy.get("button[id='make-claim']").invoke("click"); From 082f52bac9aeb24dc5d4fd91805279cc1fa343fc Mon Sep 17 00:00:00 2001 From: EresDev Date: Thu, 23 May 2024 02:38:10 +0500 Subject: [PATCH 025/174] chore: fix spell --- functions/get-order.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/functions/get-order.ts b/functions/get-order.ts index fce5c43c..bd67f549 100644 --- a/functions/get-order.ts +++ b/functions/get-order.ts @@ -32,10 +32,10 @@ export const onRequest: PagesFunction = async (ctx) => { export const getTransactionFromOrderId = async (orderId: string, accessToken: AccessToken) => { const nowFormatted = new Date().toISOString().replace("T", " ").substring(0, 19); //// yyyy-mm-dd HH:mm:ss - const oneYearago = new Date(new Date().setFullYear(new Date().getFullYear() - 1)); - const oneYearagoFormatted = oneYearago.toISOString().replace("T", " ").substring(0, 19); + const oneYearAgo = new Date(new Date().setFullYear(new Date().getFullYear() - 1)); + const oneYearAgoFormatted = oneYearAgo.toISOString().replace("T", " ").substring(0, 19); - const url = `${getBaseUrl(accessToken.isSandbox)}/reports/transactions?size=1&page=1&customIdentifier=${orderId}&startDate=${oneYearagoFormatted}&endDate=${nowFormatted}`; + const url = `${getBaseUrl(accessToken.isSandbox)}/reports/transactions?size=1&page=1&customIdentifier=${orderId}&startDate=${oneYearAgoFormatted}&endDate=${nowFormatted}`; console.log(`Retrieving transaction from ${url}`); const options = { method: "GET", From 678ca44ca05207654ae67102e3e2c2ae722abc2a Mon Sep 17 00:00:00 2001 From: EresDev Date: Thu, 23 May 2024 14:04:01 +0500 Subject: [PATCH 026/174] fix: run wrangler in workflow for backend in tests --- .github/workflows/cypress-testing.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cypress-testing.yml b/.github/workflows/cypress-testing.yml index b338e0a1..52a0d8dc 100644 --- a/.github/workflows/cypress-testing.yml +++ b/.github/workflows/cypress-testing.yml @@ -40,7 +40,7 @@ jobs: uses: cypress-io/github-action@v6 with: build: yarn run build - start: yarn test:fund, yarn start + start: yarn test:fund, npx wrangler pages dev static --port 8080 --compatibility-date "2024-04-05" --compatibility-flag "nodejs_compat" --binding USE_RELOADLY_SANDBOX=true RELOADLY_API_CLIENT_ID="$RELOADLY_SANDBOX_API_CLIENT_ID" RELOADLY_API_CLIENT_SECRET="$RELOADLY_SANDBOX_API_CLIENT_SECRET" env: SUPABASE_URL: "https://wfzpewmlyiozupulbuur.supabase.co" @@ -52,6 +52,8 @@ jobs: PAYMENT_TOKEN_ADDRESS: "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d" RPC_PROVIDER_URL: "http://localhost:8545" UBIQUIBOT_PRIVATE_KEY: "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d" + RELOADLY_SANDBOX_API_CLIENT_ID: ${{ secrets.RELOADLY_SANDBOX_API_CLIENT_ID }} + RELOADLY_SANDBOX_API_CLIENT_SECRET: ${{ secrets.RELOADLY_SANDBOX_API_CLIENT_SECRET }} - uses: actions/upload-artifact@v4 if: failure() with: From e28ac1372f9abfe3c78c79d64e05b11ce5398666 Mon Sep 17 00:00:00 2001 From: EresDev Date: Thu, 23 May 2024 15:16:40 +0500 Subject: [PATCH 027/174] fix: use reloadly sandbox by default --- functions/validators.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/functions/validators.ts b/functions/validators.ts index e7fa93fa..91e01afe 100644 --- a/functions/validators.ts +++ b/functions/validators.ts @@ -12,9 +12,6 @@ export function validateRequestMethod(expectedMethod: string, receivedMethod: st } export function validateEnvVars(ctx) { - if (typeof ctx.env.USE_RELOADLY_SANDBOX != "boolean") { - throw new Error("USE_RELOADLY_SANDBOX env var must be set to boolean true or false."); - } if (!(ctx.env.RELOADLY_API_CLIENT_ID && ctx.env.RELOADLY_API_CLIENT_SECRET)) { console.error("One or more environment variable is missing."); throw new Error("Missing server configurations."); From 5dee0f7cc8c33187e2ac257036df3499caa10a8f Mon Sep 17 00:00:00 2001 From: EresDev Date: Thu, 23 May 2024 15:17:41 +0500 Subject: [PATCH 028/174] fix: log if using reloadly sandbox or not --- functions/helpers.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/functions/helpers.ts b/functions/helpers.ts index 6d2e1a45..fa61bf15 100644 --- a/functions/helpers.ts +++ b/functions/helpers.ts @@ -18,6 +18,8 @@ export type ReloadlyAuthResponse = { }; export async function getAccessToken(env: Env): Promise { + console.log("Using Reloadly Sandbox:", env.USE_RELOADLY_SANDBOX !== false); + const url = "https://auth.reloadly.com/oauth/token"; const options = { method: "POST", From c16253d9240dd23bb74a2fd5cc8f818126e70904 Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 24 May 2024 00:53:01 +0500 Subject: [PATCH 029/174] fix: change anvil RPC to fork for tests Old RPC was causing issues randomly when forked with anvil --- cypress/scripts/anvil.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/scripts/anvil.ts b/cypress/scripts/anvil.ts index d8c22635..11c2777e 100644 --- a/cypress/scripts/anvil.ts +++ b/cypress/scripts/anvil.ts @@ -3,7 +3,7 @@ import { spawn } from "child_process"; const url = "http://localhost:8545"; -const anvil = spawn("anvil", ["--chain-id", "31337", "--fork-url", "https://gnosis.drpc.org", "--host", "127.0.0.1", "--port", "8545"], { +const anvil = spawn("anvil", ["--chain-id", "31337", "--fork-url", "https://rpc.gnosis.gateway.fm", "--host", "127.0.0.1", "--port", "8545"], { stdio: "inherit", }); From 530f3d12e9f061a2939f1ba12e0603579d5b45f8 Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 24 May 2024 00:55:23 +0500 Subject: [PATCH 030/174] fix: start wrangler in action for tests backend --- .github/workflows/cypress-testing.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cypress-testing.yml b/.github/workflows/cypress-testing.yml index 52a0d8dc..4bae8cb9 100644 --- a/.github/workflows/cypress-testing.yml +++ b/.github/workflows/cypress-testing.yml @@ -36,11 +36,17 @@ jobs: - name: Start Anvil run: yarn test:anvil & + - name: Start Cloudflare Wrangler + run: npx wrangler pages dev static --port 8080 --binding USE_RELOADLY_SANDBOX=true RELOADLY_API_CLIENT_ID="$RELOADLY_SANDBOX_API_CLIENT_ID" RELOADLY_API_CLIENT_SECRET="$RELOADLY_SANDBOX_API_CLIENT_SECRET" & + env: + RELOADLY_SANDBOX_API_CLIENT_ID: ${{ secrets.RELOADLY_SANDBOX_API_CLIENT_ID }} + RELOADLY_SANDBOX_API_CLIENT_SECRET: ${{ secrets.RELOADLY_SANDBOX_API_CLIENT_SECRET }} + - name: Cypress run uses: cypress-io/github-action@v6 with: build: yarn run build - start: yarn test:fund, npx wrangler pages dev static --port 8080 --compatibility-date "2024-04-05" --compatibility-flag "nodejs_compat" --binding USE_RELOADLY_SANDBOX=true RELOADLY_API_CLIENT_ID="$RELOADLY_SANDBOX_API_CLIENT_ID" RELOADLY_API_CLIENT_SECRET="$RELOADLY_SANDBOX_API_CLIENT_SECRET" + start: yarn test:fund env: SUPABASE_URL: "https://wfzpewmlyiozupulbuur.supabase.co" @@ -52,8 +58,7 @@ jobs: PAYMENT_TOKEN_ADDRESS: "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d" RPC_PROVIDER_URL: "http://localhost:8545" UBIQUIBOT_PRIVATE_KEY: "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d" - RELOADLY_SANDBOX_API_CLIENT_ID: ${{ secrets.RELOADLY_SANDBOX_API_CLIENT_ID }} - RELOADLY_SANDBOX_API_CLIENT_SECRET: ${{ secrets.RELOADLY_SANDBOX_API_CLIENT_SECRET }} + - uses: actions/upload-artifact@v4 if: failure() with: From fa20756e9c0a329591d78c81d196303e0f4d6d60 Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 24 May 2024 01:07:33 +0500 Subject: [PATCH 031/174] fix: only show visa & mastercard --- functions/list-gift-cards.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/list-gift-cards.ts b/functions/list-gift-cards.ts index 6d612545..a48dcefd 100644 --- a/functions/list-gift-cards.ts +++ b/functions/list-gift-cards.ts @@ -12,7 +12,7 @@ export const onRequest: PagesFunction = async (ctx) => { const visaCards = await getGiftCards("visa", accessToken); const masterCards = await getGiftCards("mastercard", accessToken); - const giftCards = [...masterCards, ...visaCards]; + const giftCards = [...visaCards, ...masterCards]; if (giftCards.length) { return Response.json(giftCards, { status: 200 }); From 878d7cbfa2c83cc7748a5daf10bd901fc08c34c4 Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 24 May 2024 01:28:56 +0500 Subject: [PATCH 032/174] test: buy minimum available visa or mastercard --- cypress/e2e/claim-gift-card.cy.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cypress/e2e/claim-gift-card.cy.ts b/cypress/e2e/claim-gift-card.cy.ts index 950377d2..04246f15 100644 --- a/cypress/e2e/claim-gift-card.cy.ts +++ b/cypress/e2e/claim-gift-card.cy.ts @@ -41,10 +41,8 @@ describe("Gift Cards", () => { it("should claim a gift card", () => { const permitConfig = Cypress.env("permitConfig"); - // 9 WXDAI permit - // Reloadly sandbox has auto recharge when balance falls below 10USD - // so reloadly balance should not be below 10$ - const customPermitConfig = { ...permitConfig, AMOUNT_IN_ETH: "9.0" }; + + const customPermitConfig = { ...permitConfig, AMOUNT_IN_ETH: "30.0" }; void cy.getPermitUrl(customPermitConfig).then((customPermitUrl) => { // console.log("permitUrl", customPermitUrl); From ae9b34156fa85fe0e8f7fd4afbceb57b5de57f9c Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 24 May 2024 01:32:47 +0500 Subject: [PATCH 033/174] test: reveal code of already claimed visa --- cypress/e2e/claim-gift-card.cy.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cypress/e2e/claim-gift-card.cy.ts b/cypress/e2e/claim-gift-card.cy.ts index 04246f15..6cdba18b 100644 --- a/cypress/e2e/claim-gift-card.cy.ts +++ b/cypress/e2e/claim-gift-card.cy.ts @@ -83,7 +83,7 @@ describe("Gift Cards", () => { it("should reveal a redeem code after claim", () => { cy.intercept({ method: "GET", url: "/list-gift-cards" }).as("listGiftCards"); cy.visit( - "http://localhost:8080/?claim=W3sidHlwZSI6ImVyYzIwLXBlcm1pdCIsInBlcm1pdCI6eyJwZXJtaXR0ZWQiOnsidG9rZW4iOiIweGU5MUQxNTNFMGI0MTUxOEEyQ2U4RGQzRDc5NDRGYTg2MzQ2M2E5N2QiLCJhbW91bnQiOiIyMzE2MDAwMDAwMDAwMDAwMDAwMCJ9LCJub25jZSI6IjY4MDM3MTQ4MTA2MjkyODM2MDY5NDA4MDUxNjgwODY0NDc1MjcxMDE0MjY4Njc3NzI0NTQ5MzM4ODkxMTU4NDI1MjY5NjY4NzU3ODI0IiwiZGVhZGxpbmUiOiIxMTU3OTIwODkyMzczMTYxOTU0MjM1NzA5ODUwMDg2ODc5MDc4NTMyNjk5ODQ2NjU2NDA1NjQwMzk0NTc1ODQwMDc5MTMxMjk2Mzk5MzUifSwidHJhbnNmZXJEZXRhaWxzIjp7InRvIjoiMHhmMzlGZDZlNTFhYWQ4OEY2RjRjZTZhQjg4MjcyNzljZmZGYjkyMjY2IiwicmVxdWVzdGVkQW1vdW50IjoiMjMxNjAwMDAwMDAwMDAwMDAwMDAifSwib3duZXIiOiIweDcwOTk3OTcwQzUxODEyZGMzQTAxMEM3ZDAxYjUwZTBkMTdkYzc5QzgiLCJzaWduYXR1cmUiOiIweDkzNzdiMTczNjE5OTAwNDU2YzYxZDY3NTEzNGM2MTEyOGY1N2VmOTU5YjhmZTQ5NmUyMjYyYzEwMTY2Mjk5NGQzYWE2YzRlZDgyODQ0ZjQwY2M2NzQxZTcwMGYxMTkxZjViNGRlN2VhZGJlN2ZhMWU4ZGE4MzNjY2Y4MTA1YTM1MWIiLCJuZXR3b3JrSWQiOjMxMzM3fSx7InR5cGUiOiJlcmMyMC1wZXJtaXQiLCJwZXJtaXQiOnsicGVybWl0dGVkIjp7InRva2VuIjoiMHhlOTFEMTUzRTBiNDE1MThBMkNlOERkM0Q3OTQ0RmE4NjM0NjNhOTdkIiwiYW1vdW50IjoiOTAwMDAwMDAwMDAwMDAwMDAwMCJ9LCJub25jZSI6Ijg3NDA5NDg3MzUyMzAwMzgyODA3NTYwODM1MDEwODI1ODk4MDY0OTk1MzA1OTk3NTM2Mzg2NDE0NDQ3NTQ2MjQ5NDc3ODE0NjY3Nzk1IiwiZGVhZGxpbmUiOiIxMTU3OTIwODkyMzczMTYxOTU0MjM1NzA5ODUwMDg2ODc5MDc4NTMyNjk5ODQ2NjU2NDA1NjQwMzk0NTc1ODQwMDc5MTMxMjk2Mzk5MzUifSwidHJhbnNmZXJEZXRhaWxzIjp7InRvIjoiMHhmMzlGZDZlNTFhYWQ4OEY2RjRjZTZhQjg4MjcyNzljZmZGYjkyMjY2IiwicmVxdWVzdGVkQW1vdW50IjoiOTAwMDAwMDAwMDAwMDAwMDAwMCJ9LCJvd25lciI6IjB4NzA5OTc5NzBDNTE4MTJkYzNBMDEwQzdkMDFiNTBlMGQxN2RjNzlDOCIsInNpZ25hdHVyZSI6IjB4OTM3N2IxNzM2MTk5MDA0NTZjNjFkNjc1MTM0YzYxMTI4ZjU3ZWY5NTliOGZlNDk2ZTIyNjJjMTAxNjYyOTk0ZDNhYTZjNGVkODI4NDRmNDBjYzY3NDFlNzAwZjExOTFmNWI0ZGU3ZWFkYmU3ZmExZThkYTgzM2NjZjgxMDVhMzUxYiIsIm5ldHdvcmtJZCI6MzEzMzd9XQ==" + "http://localhost:8080/?claim=W3sidHlwZSI6ImVyYzIwLXBlcm1pdCIsInBlcm1pdCI6eyJwZXJtaXR0ZWQiOnsidG9rZW4iOiIweGU5MUQxNTNFMGI0MTUxOEEyQ2U4RGQzRDc5NDRGYTg2MzQ2M2E5N2QiLCJhbW91bnQiOiIzMDAwMDAwMDAwMDAwMDAwMDAwMCJ9LCJub25jZSI6IjczMDU2NzU0MjU1ODU4ODMxMzQ0NTMzNDgxMDc0Njg5NTE1ODEyNzIzNDE5NTkwNjMwOTY2MTUwOTIxNzk3ODEzMzExMDE4NjgyMDMzIiwiZGVhZGxpbmUiOiIxMTU3OTIwODkyMzczMTYxOTU0MjM1NzA5ODUwMDg2ODc5MDc4NTMyNjk5ODQ2NjU2NDA1NjQwMzk0NTc1ODQwMDc5MTMxMjk2Mzk5MzUifSwidHJhbnNmZXJEZXRhaWxzIjp7InRvIjoiMHhmMzlGZDZlNTFhYWQ4OEY2RjRjZTZhQjg4MjcyNzljZmZGYjkyMjY2IiwicmVxdWVzdGVkQW1vdW50IjoiMzAwMDAwMDAwMDAwMDAwMDAwMDAifSwib3duZXIiOiIweDcwOTk3OTcwQzUxODEyZGMzQTAxMEM3ZDAxYjUwZTBkMTdkYzc5QzgiLCJzaWduYXR1cmUiOiIweDdkYWYxMTNhNTA0ZjYxYzk5MDg0ZGM2ZGFlZTZkZDFkZjhhM2I4YjM5ZTU0N2VkYWIxMjNhNzQxNjBhNWVhNDYwZDgyODdmYWM1MDlhYTc5M2ZhNjc5M2RlOTg5YmVhOTg4Y2M3NDAyNGE5ZmQyNjAyMjY2YTQzZjg1MDlhYTJkMWIiLCJuZXR3b3JrSWQiOjMxMzM3fSx7InR5cGUiOiJlcmMyMC1wZXJtaXQiLCJwZXJtaXQiOnsicGVybWl0dGVkIjp7InRva2VuIjoiMHhlOTFEMTUzRTBiNDE1MThBMkNlOERkM0Q3OTQ0RmE4NjM0NjNhOTdkIiwiYW1vdW50IjoiOTAwMDAwMDAwMDAwMDAwMDAwMCJ9LCJub25jZSI6IjYyOTc2MjY4MDU3NjQ1MTA0ODc3MTI4NDU3MTU1NDgwNTU5NzU1OTQwMjA4MzExMDQ3Mjc1Njc2NjAyNDI3NzQwODY1NzE0MDkxMzAwIiwiZGVhZGxpbmUiOiIxMTU3OTIwODkyMzczMTYxOTU0MjM1NzA5ODUwMDg2ODc5MDc4NTMyNjk5ODQ2NjU2NDA1NjQwMzk0NTc1ODQwMDc5MTMxMjk2Mzk5MzUifSwidHJhbnNmZXJEZXRhaWxzIjp7InRvIjoiMHhmMzlGZDZlNTFhYWQ4OEY2RjRjZTZhQjg4MjcyNzljZmZGYjkyMjY2IiwicmVxdWVzdGVkQW1vdW50IjoiOTAwMDAwMDAwMDAwMDAwMDAwMCJ9LCJvd25lciI6IjB4NzA5OTc5NzBDNTE4MTJkYzNBMDEwQzdkMDFiNTBlMGQxN2RjNzlDOCIsInNpZ25hdHVyZSI6IjB4N2RhZjExM2E1MDRmNjFjOTkwODRkYzZkYWVlNmRkMWRmOGEzYjhiMzllNTQ3ZWRhYjEyM2E3NDE2MGE1ZWE0NjBkODI4N2ZhYzUwOWFhNzkzZmE2NzkzZGU5ODliZWE5ODhjYzc0MDI0YTlmZDI2MDIyNjZhNDNmODUwOWFhMmQxYiIsIm5ldHdvcmtJZCI6MzEzMzd9XQ==" ); cy.wait("@listGiftCards"); @@ -108,7 +108,7 @@ function setupStubs() { const wallet = new Wallet(SENDER_PRIVATE_KEY, provider); signer.signMessage = cy.stub().callsFake(async () => { - return "0x824d8532d8b96dd4bed592bbb58eb090f23fabfe3e27e017c0b9a378667b3eca2a3fd2449362d18001eaca07dd8f77feadb7ddbafe35ba49704941c8c6af6c061b"; + return "0x4d9f92f69898fd112748ff04c98e294cced4dbde80ac3cba42fb546538bf54ca0e3fbc3f94416813f8da58a4b26957b62bae66c48bf01ca1068af0f222bf18df1c"; }); stubEthereum(signer); From d4f8be29c15a8107166f3a6a4b6b2d339421f4da Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 24 May 2024 02:12:23 +0500 Subject: [PATCH 034/174] fix: remove fixed chainId from test for gift card claim --- cypress/e2e/claim-gift-card.cy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/e2e/claim-gift-card.cy.ts b/cypress/e2e/claim-gift-card.cy.ts index 6cdba18b..db3d39c8 100644 --- a/cypress/e2e/claim-gift-card.cy.ts +++ b/cypress/e2e/claim-gift-card.cy.ts @@ -103,7 +103,7 @@ describe("Gift Cards", () => { }); function setupStubs() { - const provider = new JsonRpcProvider("http://localhost:8545", 31337); + const provider = new JsonRpcProvider("http://localhost:8545"); const signer = provider.getSigner(beneficiary); const wallet = new Wallet(SENDER_PRIVATE_KEY, provider); From 926e9f10025959e384c3f3512383bd6081f419ad Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 24 May 2024 02:13:55 +0500 Subject: [PATCH 035/174] fix: wait 2 sec for page to laod in test --- cypress/e2e/claim-gift-card.cy.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cypress/e2e/claim-gift-card.cy.ts b/cypress/e2e/claim-gift-card.cy.ts index db3d39c8..4e9f87ce 100644 --- a/cypress/e2e/claim-gift-card.cy.ts +++ b/cypress/e2e/claim-gift-card.cy.ts @@ -22,6 +22,7 @@ describe("Gift Cards", () => { const permitConfig = Cypress.env("permitConfig"); void cy.getPermitUrl(permitConfig).then((permitUrl) => { cy.visit(`${permitUrl as string}`); + cy.wait(2000); cy.wait("@listGiftCards"); @@ -49,6 +50,8 @@ describe("Gift Cards", () => { cy.intercept({ method: "GET", url: "/list-gift-cards" }).as("listGiftCards"); cy.visit(customPermitUrl); + cy.wait(2000); + cy.wait("@listGiftCards"); cy.get(".gift-card").should("have.length.above", 0); cy.get(".gift-card .available").should("have.length.above", 0); @@ -85,6 +88,7 @@ describe("Gift Cards", () => { cy.visit( "http://localhost:8080/?claim=W3sidHlwZSI6ImVyYzIwLXBlcm1pdCIsInBlcm1pdCI6eyJwZXJtaXR0ZWQiOnsidG9rZW4iOiIweGU5MUQxNTNFMGI0MTUxOEEyQ2U4RGQzRDc5NDRGYTg2MzQ2M2E5N2QiLCJhbW91bnQiOiIzMDAwMDAwMDAwMDAwMDAwMDAwMCJ9LCJub25jZSI6IjczMDU2NzU0MjU1ODU4ODMxMzQ0NTMzNDgxMDc0Njg5NTE1ODEyNzIzNDE5NTkwNjMwOTY2MTUwOTIxNzk3ODEzMzExMDE4NjgyMDMzIiwiZGVhZGxpbmUiOiIxMTU3OTIwODkyMzczMTYxOTU0MjM1NzA5ODUwMDg2ODc5MDc4NTMyNjk5ODQ2NjU2NDA1NjQwMzk0NTc1ODQwMDc5MTMxMjk2Mzk5MzUifSwidHJhbnNmZXJEZXRhaWxzIjp7InRvIjoiMHhmMzlGZDZlNTFhYWQ4OEY2RjRjZTZhQjg4MjcyNzljZmZGYjkyMjY2IiwicmVxdWVzdGVkQW1vdW50IjoiMzAwMDAwMDAwMDAwMDAwMDAwMDAifSwib3duZXIiOiIweDcwOTk3OTcwQzUxODEyZGMzQTAxMEM3ZDAxYjUwZTBkMTdkYzc5QzgiLCJzaWduYXR1cmUiOiIweDdkYWYxMTNhNTA0ZjYxYzk5MDg0ZGM2ZGFlZTZkZDFkZjhhM2I4YjM5ZTU0N2VkYWIxMjNhNzQxNjBhNWVhNDYwZDgyODdmYWM1MDlhYTc5M2ZhNjc5M2RlOTg5YmVhOTg4Y2M3NDAyNGE5ZmQyNjAyMjY2YTQzZjg1MDlhYTJkMWIiLCJuZXR3b3JrSWQiOjMxMzM3fSx7InR5cGUiOiJlcmMyMC1wZXJtaXQiLCJwZXJtaXQiOnsicGVybWl0dGVkIjp7InRva2VuIjoiMHhlOTFEMTUzRTBiNDE1MThBMkNlOERkM0Q3OTQ0RmE4NjM0NjNhOTdkIiwiYW1vdW50IjoiOTAwMDAwMDAwMDAwMDAwMDAwMCJ9LCJub25jZSI6IjYyOTc2MjY4MDU3NjQ1MTA0ODc3MTI4NDU3MTU1NDgwNTU5NzU1OTQwMjA4MzExMDQ3Mjc1Njc2NjAyNDI3NzQwODY1NzE0MDkxMzAwIiwiZGVhZGxpbmUiOiIxMTU3OTIwODkyMzczMTYxOTU0MjM1NzA5ODUwMDg2ODc5MDc4NTMyNjk5ODQ2NjU2NDA1NjQwMzk0NTc1ODQwMDc5MTMxMjk2Mzk5MzUifSwidHJhbnNmZXJEZXRhaWxzIjp7InRvIjoiMHhmMzlGZDZlNTFhYWQ4OEY2RjRjZTZhQjg4MjcyNzljZmZGYjkyMjY2IiwicmVxdWVzdGVkQW1vdW50IjoiOTAwMDAwMDAwMDAwMDAwMDAwMCJ9LCJvd25lciI6IjB4NzA5OTc5NzBDNTE4MTJkYzNBMDEwQzdkMDFiNTBlMGQxN2RjNzlDOCIsInNpZ25hdHVyZSI6IjB4N2RhZjExM2E1MDRmNjFjOTkwODRkYzZkYWVlNmRkMWRmOGEzYjhiMzllNTQ3ZWRhYjEyM2E3NDE2MGE1ZWE0NjBkODI4N2ZhYzUwOWFhNzkzZmE2NzkzZGU5ODliZWE5ODhjYzc0MDI0YTlmZDI2MDIyNjZhNDNmODUwOWFhMmQxYiIsIm5ldHdvcmtJZCI6MzEzMzd9XQ==" ); + cy.wait(2000); cy.wait("@listGiftCards"); cy.get(".gift-card").should("have.length", 0); From 3212a262be91c8e3738e0b7746b83546373e39bd Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 24 May 2024 02:23:24 +0500 Subject: [PATCH 036/174] fix: remove invalid expectation from test --- cypress/e2e/claim-gift-card.cy.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/cypress/e2e/claim-gift-card.cy.ts b/cypress/e2e/claim-gift-card.cy.ts index 4e9f87ce..7bdf6727 100644 --- a/cypress/e2e/claim-gift-card.cy.ts +++ b/cypress/e2e/claim-gift-card.cy.ts @@ -91,7 +91,6 @@ describe("Gift Cards", () => { cy.wait(2000); cy.wait("@listGiftCards"); - cy.get(".gift-card").should("have.length", 0); cy.get("#gift-cards").should("exist").and("include.text", "Your gift card"); cy.get(".gift-card.redeem-code > h3").eq(0).should("have.text", "Your redeem code"); From 9f770aea5c4e83bff440c9d691c7fcfdc8915093 Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 24 May 2024 22:42:25 +0500 Subject: [PATCH 037/174] test: extract interceptors to remove duplication --- cypress/e2e/claim-gift-card.cy.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cypress/e2e/claim-gift-card.cy.ts b/cypress/e2e/claim-gift-card.cy.ts index 7bdf6727..e3de235e 100644 --- a/cypress/e2e/claim-gift-card.cy.ts +++ b/cypress/e2e/claim-gift-card.cy.ts @@ -17,8 +17,6 @@ describe("Gift Cards", () => { }); it("should show/hide activation info", () => { - cy.intercept({ method: "GET", url: "/list-gift-cards" }).as("listGiftCards"); - const permitConfig = Cypress.env("permitConfig"); void cy.getPermitUrl(permitConfig).then((permitUrl) => { cy.visit(`${permitUrl as string}`); @@ -47,7 +45,6 @@ describe("Gift Cards", () => { void cy.getPermitUrl(customPermitConfig).then((customPermitUrl) => { // console.log("permitUrl", customPermitUrl); - cy.intercept({ method: "GET", url: "/list-gift-cards" }).as("listGiftCards"); cy.visit(customPermitUrl); cy.wait(2000); @@ -84,7 +81,6 @@ describe("Gift Cards", () => { }); it("should reveal a redeem code after claim", () => { - cy.intercept({ method: "GET", url: "/list-gift-cards" }).as("listGiftCards"); cy.visit( "http://localhost:8080/?claim=W3sidHlwZSI6ImVyYzIwLXBlcm1pdCIsInBlcm1pdCI6eyJwZXJtaXR0ZWQiOnsidG9rZW4iOiIweGU5MUQxNTNFMGI0MTUxOEEyQ2U4RGQzRDc5NDRGYTg2MzQ2M2E5N2QiLCJhbW91bnQiOiIzMDAwMDAwMDAwMDAwMDAwMDAwMCJ9LCJub25jZSI6IjczMDU2NzU0MjU1ODU4ODMxMzQ0NTMzNDgxMDc0Njg5NTE1ODEyNzIzNDE5NTkwNjMwOTY2MTUwOTIxNzk3ODEzMzExMDE4NjgyMDMzIiwiZGVhZGxpbmUiOiIxMTU3OTIwODkyMzczMTYxOTU0MjM1NzA5ODUwMDg2ODc5MDc4NTMyNjk5ODQ2NjU2NDA1NjQwMzk0NTc1ODQwMDc5MTMxMjk2Mzk5MzUifSwidHJhbnNmZXJEZXRhaWxzIjp7InRvIjoiMHhmMzlGZDZlNTFhYWQ4OEY2RjRjZTZhQjg4MjcyNzljZmZGYjkyMjY2IiwicmVxdWVzdGVkQW1vdW50IjoiMzAwMDAwMDAwMDAwMDAwMDAwMDAifSwib3duZXIiOiIweDcwOTk3OTcwQzUxODEyZGMzQTAxMEM3ZDAxYjUwZTBkMTdkYzc5QzgiLCJzaWduYXR1cmUiOiIweDdkYWYxMTNhNTA0ZjYxYzk5MDg0ZGM2ZGFlZTZkZDFkZjhhM2I4YjM5ZTU0N2VkYWIxMjNhNzQxNjBhNWVhNDYwZDgyODdmYWM1MDlhYTc5M2ZhNjc5M2RlOTg5YmVhOTg4Y2M3NDAyNGE5ZmQyNjAyMjY2YTQzZjg1MDlhYTJkMWIiLCJuZXR3b3JrSWQiOjMxMzM3fSx7InR5cGUiOiJlcmMyMC1wZXJtaXQiLCJwZXJtaXQiOnsicGVybWl0dGVkIjp7InRva2VuIjoiMHhlOTFEMTUzRTBiNDE1MThBMkNlOERkM0Q3OTQ0RmE4NjM0NjNhOTdkIiwiYW1vdW50IjoiOTAwMDAwMDAwMDAwMDAwMDAwMCJ9LCJub25jZSI6IjYyOTc2MjY4MDU3NjQ1MTA0ODc3MTI4NDU3MTU1NDgwNTU5NzU1OTQwMjA4MzExMDQ3Mjc1Njc2NjAyNDI3NzQwODY1NzE0MDkxMzAwIiwiZGVhZGxpbmUiOiIxMTU3OTIwODkyMzczMTYxOTU0MjM1NzA5ODUwMDg2ODc5MDc4NTMyNjk5ODQ2NjU2NDA1NjQwMzk0NTc1ODQwMDc5MTMxMjk2Mzk5MzUifSwidHJhbnNmZXJEZXRhaWxzIjp7InRvIjoiMHhmMzlGZDZlNTFhYWQ4OEY2RjRjZTZhQjg4MjcyNzljZmZGYjkyMjY2IiwicmVxdWVzdGVkQW1vdW50IjoiOTAwMDAwMDAwMDAwMDAwMDAwMCJ9LCJvd25lciI6IjB4NzA5OTc5NzBDNTE4MTJkYzNBMDEwQzdkMDFiNTBlMGQxN2RjNzlDOCIsInNpZ25hdHVyZSI6IjB4N2RhZjExM2E1MDRmNjFjOTkwODRkYzZkYWVlNmRkMWRmOGEzYjhiMzllNTQ3ZWRhYjEyM2E3NDE2MGE1ZWE0NjBkODI4N2ZhYzUwOWFhNzkzZmE2NzkzZGU5ODliZWE5ODhjYzc0MDI0YTlmZDI2MDIyNjZhNDNmODUwOWFhMmQxYiIsIm5ldHdvcmtJZCI6MzEzMzd9XQ==" ); @@ -141,6 +137,8 @@ function setupIntercepts() { statusCode: 200, body: {}, }); + + cy.intercept({ method: "GET", url: "/list-gift-cards" }).as("listGiftCards"); } function stubEthereum(signer: JsonRpcSigner) { From cf608e5036c822e1913a1616d3388f34d0db2b1b Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 24 May 2024 22:46:39 +0500 Subject: [PATCH 038/174] refactor: rename var --- cypress/e2e/claim-gift-card.cy.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cypress/e2e/claim-gift-card.cy.ts b/cypress/e2e/claim-gift-card.cy.ts index e3de235e..9f5c77d5 100644 --- a/cypress/e2e/claim-gift-card.cy.ts +++ b/cypress/e2e/claim-gift-card.cy.ts @@ -43,10 +43,8 @@ describe("Gift Cards", () => { const customPermitConfig = { ...permitConfig, AMOUNT_IN_ETH: "30.0" }; - void cy.getPermitUrl(customPermitConfig).then((customPermitUrl) => { - // console.log("permitUrl", customPermitUrl); - - cy.visit(customPermitUrl); + void cy.getPermitUrl(customPermitConfig).then((permitUrl) => { + cy.visit(permitUrl); cy.wait(2000); cy.wait("@listGiftCards"); From e695cac6a1f0989145d97597baf4de87a0a1062e Mon Sep 17 00:00:00 2001 From: EresDev Date: Sat, 25 May 2024 02:35:19 +0500 Subject: [PATCH 039/174] test: make claim gift card test more reliable --- cypress/e2e/claim-gift-card.cy.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/cypress/e2e/claim-gift-card.cy.ts b/cypress/e2e/claim-gift-card.cy.ts index 9f5c77d5..f7948ded 100644 --- a/cypress/e2e/claim-gift-card.cy.ts +++ b/cypress/e2e/claim-gift-card.cy.ts @@ -64,9 +64,12 @@ describe("Gift Cards", () => { cy.intercept({ method: "POST", url: "/post-order" }).as("postOrder"); cy.get(".gift-card .available").eq(0).parent().parent().find(".claim-gift-card-btn").should("have.length", 1); - cy.get(".gift-card .available").eq(0).parent().parent().find(".claim-gift-card-btn").invoke("click"); - cy.wait("@postOrder", { timeout: 10000 }); + cy.intercept({ method: "GET", url: "/get-order**" }).as("getOrder"); + cy.get(".gift-card .available").eq(0).parent().parent().find(".claim-gift-card-btn").invoke("click"); + cy.get(".notifications", { timeout: 10000 }).should("contain.text", "Transaction sent"); + cy.get(".notifications", { timeout: 10000 }).should("contain.text", "Payment confirmed. Claiming card now..."); + cy.wait("@getOrder", { timeout: 10000 }); cy.get("#gift-cards").should("exist").and("include.text", "Your gift card"); From 238aae3fd410b42fd6167c3b7e63996fc9768d22 Mon Sep 17 00:00:00 2001 From: EresDev Date: Sat, 25 May 2024 02:49:59 +0500 Subject: [PATCH 040/174] fix: return 404 if order not found insteaf of 500 --- functions/get-order.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/functions/get-order.ts b/functions/get-order.ts index bd67f549..7c078438 100644 --- a/functions/get-order.ts +++ b/functions/get-order.ts @@ -19,7 +19,9 @@ export const onRequest: PagesFunction = async (ctx) => { const reloadlyTransaction = await getTransactionFromOrderId(orderId, accessToken); - if (reloadlyTransaction.status == "SUCCESSFUL") { + if (!reloadlyTransaction) { + return Response.json("Order not found.", { status: 404 }); + } else if (reloadlyTransaction.status && reloadlyTransaction.status == "SUCCESSFUL") { return Response.json(reloadlyTransaction, { status: 200 }); } else { return Response.json({ message: "There is no successful transaction for given order ID." }, { status: 404 }); @@ -48,6 +50,9 @@ export const getTransactionFromOrderId = async (orderId: string, accessToken: Ac const response = await fetch(url, options); const responseJson = await response.json(); + console.log("Response status", response.status); + console.log(`Response from ${url}`, responseJson); + if (response.status != 200) { throw new Error( `Error from Reloadly API: ${JSON.stringify({ @@ -56,7 +61,5 @@ export const getTransactionFromOrderId = async (orderId: string, accessToken: Ac })}` ); } - console.log("Response status", response.status); - console.log(`Response from ${url}`, responseJson); return (responseJson as ReloadlyGetTransactionResponse).content[0]; }; From 0ed7b5213972d50340e175cfba95f71879d04dcf Mon Sep 17 00:00:00 2001 From: EresDev Date: Sat, 25 May 2024 14:03:12 +0500 Subject: [PATCH 041/174] refactor: change types to interfaces --- functions/helpers.ts | 4 ++-- functions/types.ts | 4 ++-- shared/types.ts | 48 ++++++++++++++++++++++++-------------------- 3 files changed, 30 insertions(+), 26 deletions(-) diff --git a/functions/helpers.ts b/functions/helpers.ts index fa61bf15..749ae2df 100644 --- a/functions/helpers.ts +++ b/functions/helpers.ts @@ -10,12 +10,12 @@ export interface Env { RELOADLY_API_CLIENT_SECRET: string; } -export type ReloadlyAuthResponse = { +export interface ReloadlyAuthResponse { access_token: string; scope: string; expires_in: number; token_type: string; -}; +} export async function getAccessToken(env: Env): Promise { console.log("Using Reloadly Sandbox:", env.USE_RELOADLY_SANDBOX !== false); diff --git a/functions/types.ts b/functions/types.ts index 0dff4b0a..5b71d63a 100644 --- a/functions/types.ts +++ b/functions/types.ts @@ -1,4 +1,4 @@ -export type AccessToken = { +export interface AccessToken { token: string; isSandbox: boolean; -}; +} diff --git a/shared/types.ts b/shared/types.ts index ac2685b7..120e4bd5 100644 --- a/shared/types.ts +++ b/shared/types.ts @@ -1,4 +1,4 @@ -export type GiftCard = { +export interface GiftCard { productId: number; productName: string; global: boolean; @@ -31,9 +31,9 @@ export type GiftCard = { concise: string; verbose: string; }; -}; +} -export type ReloadlyListGiftCardResponse = { +export interface ReloadlyListGiftCardResponse { content: GiftCard[]; pageable: { sort: { @@ -60,9 +60,9 @@ export type ReloadlyListGiftCardResponse = { size: number; number: number; empty: boolean; -}; +} -export type ReloadlyOrderedProduct = { +export interface ReloadlyOrderedProduct { productId: number; productName: string; countryCode: string; @@ -74,9 +74,9 @@ export type ReloadlyOrderedProduct = { brandId: number; brandName: string; }; -}; +} -export type ReloadlyOrderResponse = { +export interface ReloadlyOrderResponse { transactionId: number; amount: number; discount: number; @@ -90,9 +90,9 @@ export type ReloadlyOrderResponse = { recipientPhone: number; transactionCreatedTime: string; //"2022-02-28 13:46:00", preOrdered: boolean; -}; +} -export type ReloadlyTransaction = { +export interface ReloadlyTransaction { transactionId: number; amount: number; discount: number; @@ -106,8 +106,8 @@ export type ReloadlyTransaction = { recipientPhone: number; transactionCreatedTime: string; //"2022-02-28 13:46:00", preOrdered: boolean; -}; -export type ReloadlyGetTransactionResponse = { +} +export interface ReloadlyGetTransactionResponse { content: ReloadlyTransaction[]; pageable: { sort: { sorted: boolean; unsorted: boolean; empty: boolean }; @@ -126,36 +126,40 @@ export type ReloadlyGetTransactionResponse = { size: number; number: number; empty: boolean; -}; +} -export type RedeemCode = { +export interface RedeemCode { cardNumber: string; pinCode: string; -}; +} export type ReloadlyRedeemCodeResponse = RedeemCode[]; // TODO: rename this to FailedReloadlyApiResponse -export type NotOkReloadlyApiResponse = { +export interface NotOkReloadlyApiResponse { timeStamp: string; message: string; path: string; errorCode: string; infoLink?: string; details: []; -}; +} -export type OrderRequestParams = { +export interface OrderRequestParams { productId: number; txHash: string; chainId: number; -}; +} -export type ExchangeRate = { +export interface ExchangeRate { senderCurrency: string; senderAmount: number; recipientCurrency: string; recipientAmount: number; -}; +} -export type PriceToValueMap = { [key: string]: number }; -export type ValueToPriceMap = { [key: string]: number }; +export interface PriceToValueMap { + [key: string]: number; +} +export interface ValueToPriceMap { + [key: string]: number; +} From 4de57e0e9aa6150c84e638c8eccdf7ea8a871672 Mon Sep 17 00:00:00 2001 From: EresDev Date: Sat, 25 May 2024 14:05:55 +0500 Subject: [PATCH 042/174] refactor: rename interface --- shared/types.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/shared/types.ts b/shared/types.ts index 120e4bd5..0ddab036 100644 --- a/shared/types.ts +++ b/shared/types.ts @@ -134,8 +134,7 @@ export interface RedeemCode { } export type ReloadlyRedeemCodeResponse = RedeemCode[]; -// TODO: rename this to FailedReloadlyApiResponse -export interface NotOkReloadlyApiResponse { +export interface ReloadlyFailureResponse { timeStamp: string; message: string; path: string; From 20c830d96c857378f8059a0f84cea59b0dffd3b1 Mon Sep 17 00:00:00 2001 From: EresDev Date: Sat, 25 May 2024 14:35:02 +0500 Subject: [PATCH 043/174] refactor: replace types with interfaces --- functions/get-order.ts | 4 +- functions/get-redeem-code.ts | 4 +- functions/list-gift-cards.ts | 4 +- functions/post-order.ts | 10 +-- functions/types.ts | 64 +++++++++++++++++ shared/types.ts | 69 ++----------------- .../rewards/gift-cards/list-gift-cards.ts | 4 +- .../gift-cards/reveal/redeem-code-html.ts | 4 +- .../gift-cards/reveal/reveal-action.ts | 6 +- 9 files changed, 87 insertions(+), 82 deletions(-) diff --git a/functions/get-order.ts b/functions/get-order.ts index 7c078438..9928a9cb 100644 --- a/functions/get-order.ts +++ b/functions/get-order.ts @@ -1,5 +1,5 @@ import { Env, getAccessToken, getBaseUrl, commonHeaders } from "./helpers"; -import { NotOkReloadlyApiResponse, ReloadlyGetTransactionResponse } from "../shared/types"; +import { ReloadlyFailureResponse, ReloadlyGetTransactionResponse } from "./types"; import { validateEnvVars, validateRequestMethod } from "./validators"; import { AccessToken } from "./types"; @@ -57,7 +57,7 @@ export const getTransactionFromOrderId = async (orderId: string, accessToken: Ac throw new Error( `Error from Reloadly API: ${JSON.stringify({ status: response.status, - message: (responseJson as NotOkReloadlyApiResponse).message, + message: (responseJson as ReloadlyFailureResponse).message, })}` ); } diff --git a/functions/get-redeem-code.ts b/functions/get-redeem-code.ts index 5beaaffe..ff43d6c8 100644 --- a/functions/get-redeem-code.ts +++ b/functions/get-redeem-code.ts @@ -1,5 +1,5 @@ import { getGiftCardOrderId, getMessageToSign } from "../shared/helpers"; -import { NotOkReloadlyApiResponse, ReloadlyRedeemCodeResponse } from "../shared/types"; +import { ReloadlyFailureResponse, ReloadlyRedeemCodeResponse } from "./types"; import { verifyMessage } from "ethers/lib/utils"; import { getTransactionFromOrderId } from "./get-order"; import { validateEnvVars, validateRequestMethod } from "./validators"; @@ -82,7 +82,7 @@ export const getRedeemCode = async (transactionId: number, accessToken: AccessTo throw new Error( `Error from Reloadly API: ${JSON.stringify({ status: response.status, - message: (responseJson as NotOkReloadlyApiResponse).message, + message: (responseJson as ReloadlyFailureResponse).message, })}` ); } diff --git a/functions/list-gift-cards.ts b/functions/list-gift-cards.ts index a48dcefd..942de61a 100644 --- a/functions/list-gift-cards.ts +++ b/functions/list-gift-cards.ts @@ -1,4 +1,4 @@ -import { NotOkReloadlyApiResponse, ReloadlyListGiftCardResponse } from "../shared/types"; +import { ReloadlyFailureResponse, ReloadlyListGiftCardResponse } from "./types"; import { Env, getAccessToken, getBaseUrl, commonHeaders } from "./helpers"; import { AccessToken } from "./types"; import { validateEnvVars, validateRequestMethod } from "./validators"; @@ -49,7 +49,7 @@ const getGiftCards = async (productQuery: string, accessToken: AccessToken) => { throw new Error( `Error from Reloadly API: ${JSON.stringify({ status: response.status, - message: (responseJson as NotOkReloadlyApiResponse).message, + message: (responseJson as ReloadlyFailureResponse).message, })}` ); } diff --git a/functions/post-order.ts b/functions/post-order.ts index 328bd616..b875eddd 100644 --- a/functions/post-order.ts +++ b/functions/post-order.ts @@ -3,12 +3,12 @@ import { JsonRpcProvider } from "@ethersproject/providers/lib/json-rpc-provider" import { Interface, TransactionDescription } from "ethers/lib/utils"; import { Tokens, chainIdToRewardTokenMap, giftCardTreasuryAddress, permit2Address, permitTokenOwner } from "../shared/constants"; import { getGiftCardOrderId } from "../shared/helpers"; -import { ExchangeRate, NotOkReloadlyApiResponse, OrderRequestParams, ReloadlyOrderResponse, GiftCard } from "../shared/types"; +import { ExchangeRate, OrderRequestParams, GiftCard } from "../shared/types"; import { permit2Abi } from "../static/scripts/rewards/abis/permit2Abi"; import { getTransactionFromOrderId } from "./get-order"; import { validateEnvVars, validateRequestMethod } from "./validators"; import { Env, commonHeaders, getAccessToken, getBaseUrl } from "./helpers"; -import { AccessToken } from "./types"; +import { AccessToken, ReloadlyFailureResponse, ReloadlyOrderResponse } from "./types"; import { getGiftCardValue, isClaimableForAmount } from "../shared/pricing"; export const networkRpcs: Record = { @@ -112,7 +112,7 @@ const getGiftCardById = async (productId: number, accessToken: AccessToken) => { throw new Error( `Error from Reloadly API: ${JSON.stringify({ status: response.status, - message: (responseJson as NotOkReloadlyApiResponse).message, + message: (responseJson as ReloadlyFailureResponse).message, })}` ); } @@ -153,7 +153,7 @@ const orderGiftCard = async (productId: number, cardValue: number, identifier: s throw new Error( `Error from Reloadly API: ${JSON.stringify({ status: response.status, - message: (responseJson as NotOkReloadlyApiResponse).message, + message: (responseJson as ReloadlyFailureResponse).message, })}` ); } @@ -191,7 +191,7 @@ async function getExchangeRate(usdAmount: number, fromCurrency: string, accessTo throw new Error( `Error from Reloadly API: ${JSON.stringify({ status: response.status, - message: (responseJson as NotOkReloadlyApiResponse).message, + message: (responseJson as ReloadlyFailureResponse).message, })}` ); } diff --git a/functions/types.ts b/functions/types.ts index 5b71d63a..8730ada9 100644 --- a/functions/types.ts +++ b/functions/types.ts @@ -1,4 +1,68 @@ +import { GiftCard, Order, OrderTransaction, RedeemCode } from "../shared/types"; + export interface AccessToken { token: string; isSandbox: boolean; } + +export interface ReloadlyListGiftCardResponse { + content: GiftCard[]; + pageable: { + sort: { + sorted: boolean; + unsorted: boolean; + empty: boolean; + }; + pageNumber: number; + pageSize: number; + offset: number; + unpaged: boolean; + paged: boolean; + }; + totalElements: number; + totalPages: number; + last: boolean; + first: boolean; + sort: { + sorted: boolean; + unsorted: boolean; + empty: boolean; + }; + numberOfElements: number; + size: number; + number: number; + empty: boolean; +} + +export interface ReloadlyOrderResponse extends Order {} +export interface ReloadlyGetTransactionResponse { + content: OrderTransaction[]; + pageable: { + sort: { sorted: boolean; unsorted: boolean; empty: boolean }; + pageNumber: number; + pageSize: number; + offset: number; + unpaged: boolean; + paged: boolean; + }; + totalElements: number; + totalPages: number; + last: boolean; + first: boolean; + sort: { sorted: boolean; unsorted: boolean; empty: boolean }; + numberOfElements: number; + size: number; + number: number; + empty: boolean; +} + +export type ReloadlyRedeemCodeResponse = RedeemCode[]; + +export interface ReloadlyFailureResponse { + timeStamp: string; + message: string; + path: string; + errorCode: string; + infoLink?: string; + details: []; +} diff --git a/shared/types.ts b/shared/types.ts index 0ddab036..a328d14c 100644 --- a/shared/types.ts +++ b/shared/types.ts @@ -33,36 +33,7 @@ export interface GiftCard { }; } -export interface ReloadlyListGiftCardResponse { - content: GiftCard[]; - pageable: { - sort: { - sorted: boolean; - unsorted: boolean; - empty: boolean; - }; - pageNumber: number; - pageSize: number; - offset: number; - unpaged: boolean; - paged: boolean; - }; - totalElements: number; - totalPages: number; - last: boolean; - first: boolean; - sort: { - sorted: boolean; - unsorted: boolean; - empty: boolean; - }; - numberOfElements: number; - size: number; - number: number; - empty: boolean; -} - -export interface ReloadlyOrderedProduct { +export interface OrderedProduct { productId: number; productName: string; countryCode: string; @@ -76,7 +47,7 @@ export interface ReloadlyOrderedProduct { }; } -export interface ReloadlyOrderResponse { +export interface Order { transactionId: number; amount: number; discount: number; @@ -85,14 +56,14 @@ export interface ReloadlyOrderResponse { recipientEmail: string; customIdentifier: string; status: string; - product: ReloadlyOrderedProduct; + product: OrderedProduct; smsFee: number; recipientPhone: number; transactionCreatedTime: string; //"2022-02-28 13:46:00", preOrdered: boolean; } -export interface ReloadlyTransaction { +export interface OrderTransaction { transactionId: number; amount: number; discount: number; @@ -101,47 +72,17 @@ export interface ReloadlyTransaction { recipientEmail: string; customIdentifier: string; status: string; - product: ReloadlyOrderedProduct; + product: OrderedProduct; smsFee: number; recipientPhone: number; transactionCreatedTime: string; //"2022-02-28 13:46:00", preOrdered: boolean; } -export interface ReloadlyGetTransactionResponse { - content: ReloadlyTransaction[]; - pageable: { - sort: { sorted: boolean; unsorted: boolean; empty: boolean }; - pageNumber: number; - pageSize: number; - offset: number; - unpaged: boolean; - paged: boolean; - }; - totalElements: number; - totalPages: number; - last: boolean; - first: boolean; - sort: { sorted: boolean; unsorted: boolean; empty: boolean }; - numberOfElements: number; - size: number; - number: number; - empty: boolean; -} export interface RedeemCode { cardNumber: string; pinCode: string; } -export type ReloadlyRedeemCodeResponse = RedeemCode[]; - -export interface ReloadlyFailureResponse { - timeStamp: string; - message: string; - path: string; - errorCode: string; - infoLink?: string; - details: []; -} export interface OrderRequestParams { productId: number; diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index 6ddf12e3..35e38720 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -1,5 +1,5 @@ import { getGiftCardOrderId } from "../../../../shared/helpers"; -import { GiftCard, ReloadlyTransaction } from "../../../../shared/types"; +import { GiftCard, OrderTransaction } from "../../../../shared/types"; import { AppState } from "../app-state"; import { attachActivateInfoAction } from "./activate/activate-action"; import { attachClaimAction } from "./claim/claim-action"; @@ -24,7 +24,7 @@ export async function initCollectGiftCard(app: AppState) { const [retrieveOrderResponse, retrieveGiftCardsResponse] = await Promise.all([fetch(retrieveOrderUrl, requestInit), fetch(listGiftCardsUrl, requestInit)]); - const transaction = (await retrieveOrderResponse.json()) as ReloadlyTransaction; + const transaction = (await retrieveOrderResponse.json()) as OrderTransaction; const giftCards = (await retrieveGiftCardsResponse.json()) as GiftCard[]; const giftCardsSection = document.getElementById("gift-cards"); diff --git a/static/scripts/rewards/gift-cards/reveal/redeem-code-html.ts b/static/scripts/rewards/gift-cards/reveal/redeem-code-html.ts index a2bc6323..8e21ff4b 100644 --- a/static/scripts/rewards/gift-cards/reveal/redeem-code-html.ts +++ b/static/scripts/rewards/gift-cards/reveal/redeem-code-html.ts @@ -1,8 +1,8 @@ -import { ReloadlyTransaction } from "../../../../../shared/types"; +import { OrderTransaction } from "../../../../../shared/types"; const html = String.raw; -export function getRedeemCodeHtml(transaction: ReloadlyTransaction) { +export function getRedeemCodeHtml(transaction: OrderTransaction) { return html`

Your redeem code

diff --git a/static/scripts/rewards/gift-cards/reveal/reveal-action.ts b/static/scripts/rewards/gift-cards/reveal/reveal-action.ts index 882991d0..d335cfbe 100644 --- a/static/scripts/rewards/gift-cards/reveal/reveal-action.ts +++ b/static/scripts/rewards/gift-cards/reveal/reveal-action.ts @@ -1,10 +1,10 @@ import { getMessageToSign } from "../../../../../shared/helpers"; -import { RedeemCode, ReloadlyRedeemCodeResponse, ReloadlyTransaction } from "../../../../../shared/types"; +import { RedeemCode, OrderTransaction } from "../../../../../shared/types"; import { AppState } from "../../app-state"; import { toaster } from "../../toaster"; import { getApiBaseUrl } from "../helpers"; -export function attachRevealAction(transaction: ReloadlyTransaction, app: AppState) { +export function attachRevealAction(transaction: OrderTransaction, app: AppState) { const revealButton = document.getElementById("reveal-btn"); const loaderAttribute = "data-loading-reveal"; revealButton?.addEventListener("click", async () => { @@ -43,7 +43,7 @@ async function revealRedeemCode(transactionId: number, signedMessage: string, ap return; } - const responseJson = (await response.json()) as ReloadlyRedeemCodeResponse; + const responseJson = (await response.json()) as RedeemCode[]; const redeemCodeElements = document.getElementsByClassName("redeem-code"); if (redeemCodeElements && redeemCodeElements.length) { From 2e3d5e95bd5fc670c72b44d5bb1bb9b72050d0e9 Mon Sep 17 00:00:00 2001 From: EresDev Date: Sat, 25 May 2024 15:36:49 +0500 Subject: [PATCH 044/174] fix: align gift cards to center when less than 3 --- static/scripts/rewards/gift-cards/list-gift-cards.ts | 2 +- static/styles/rewards/gift-cards.css | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index 35e38720..889e8105 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -60,7 +60,7 @@ export async function initCollectGiftCard(app: AppState) { attachRevealAction(transaction, app); } else if (retrieveGiftCardsResponse.status == 200) { let giftCardsHtml = `

Or claim in virtual visa/mastercard

`; - giftCardsHtml += `
`; + giftCardsHtml += `
`; giftCards.forEach((giftCard: GiftCard) => { giftCardsHtml += getGiftCardHtml(giftCard, true, app.reward.amount); }); diff --git a/static/styles/rewards/gift-cards.css b/static/styles/rewards/gift-cards.css index 9ae111a6..d1dda09c 100644 --- a/static/styles/rewards/gift-cards.css +++ b/static/styles/rewards/gift-cards.css @@ -33,6 +33,9 @@ main:has(#gift-cards .gift-card) div:has(table.receipt) { align-items: end; padding-bottom: 12px; } +.gift-cards-wrapper.center { + justify-content: center; +} .gift-cards-wrapper .gift-card { transform: rotateX(180deg); } From 1963c657ff4bb6cefe205c84e8c506acf9dc25fa Mon Sep 17 00:00:00 2001 From: EresDev Date: Sat, 25 May 2024 15:49:33 +0500 Subject: [PATCH 045/174] fix: remove unnecessary text --- static/scripts/rewards/gift-cards/gift-card.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/static/scripts/rewards/gift-cards/gift-card.ts b/static/scripts/rewards/gift-cards/gift-card.ts index 57082691..e5bb5863 100644 --- a/static/scripts/rewards/gift-cards/gift-card.ts +++ b/static/scripts/rewards/gift-cards/gift-card.ts @@ -78,8 +78,8 @@ function getRangePricesHtml(giftCard: GiftCard, rewardAmount: BigNumberish) {
${formatEther(rewardAmount)}${giftCard.senderCurrencyCode}
-
${giftCardValue.toFixed(2)}${giftCard.recipientCurrencyCode}

Available in range

`; +
${giftCardValue.toFixed(2)}${giftCard.recipientCurrencyCode}
+
`; } const priceToValueMap = getRangePriceToValueMap(giftCard); From 1bd43f115c0ae4417d1a3829917ab4b2039e2dfd Mon Sep 17 00:00:00 2001 From: EresDev Date: Sat, 25 May 2024 16:03:28 +0500 Subject: [PATCH 046/174] fix: inform properly when gift card unavailable --- static/scripts/rewards/gift-cards/list-gift-cards.ts | 4 +++- static/styles/rewards/gift-cards.css | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index 889e8105..f4fb41a1 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -78,8 +78,10 @@ export async function initCollectGiftCard(app: AppState) { activateInfoSection.innerHTML = activateInfoHtml; attachClaimAction("claim-gift-card-btn", giftCards, app); + } else if (retrieveGiftCardsResponse.status == 404) { + giftCardsSection.innerHTML = "

There are no Visa/Mastercard available to claim at the moment.

"; } else { - giftCardsSection.innerText = "There was a problem in fetching gift cards. Try again later."; + giftCardsSection.innerHTML = "

There was a problem in fetching gift cards. Try again later.

"; } attachActivateInfoAction(); diff --git a/static/styles/rewards/gift-cards.css b/static/styles/rewards/gift-cards.css index d1dda09c..d000c3c7 100644 --- a/static/styles/rewards/gift-cards.css +++ b/static/styles/rewards/gift-cards.css @@ -11,6 +11,10 @@ align-items: center; } +#gift-cards p.list-error { + text-align: center; +} + main:has(#gift-cards .gift-card) { height: auto; } From d5503a047dedc4f3819fdd7435673f7cb29deeac Mon Sep 17 00:00:00 2001 From: EresDev Date: Sat, 25 May 2024 22:06:24 +0500 Subject: [PATCH 047/174] refactor: load visa & mastercard concurrently --- functions/list-gift-cards.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/functions/list-gift-cards.ts b/functions/list-gift-cards.ts index 942de61a..e838285b 100644 --- a/functions/list-gift-cards.ts +++ b/functions/list-gift-cards.ts @@ -9,9 +9,8 @@ export const onRequest: PagesFunction = async (ctx) => { validateEnvVars(ctx); const accessToken = await getAccessToken(ctx.env); + const [visaCards, masterCards] = await Promise.all([getGiftCards("visa", accessToken), getGiftCards("mastercard", accessToken)]); - const visaCards = await getGiftCards("visa", accessToken); - const masterCards = await getGiftCards("mastercard", accessToken); const giftCards = [...visaCards, ...masterCards]; if (giftCards.length) { From 2cfabc90c76e169c12aeb08f364c3843480b55e3 Mon Sep 17 00:00:00 2001 From: EresDev Date: Sat, 25 May 2024 22:33:00 +0500 Subject: [PATCH 048/174] fix: reload gift cards when next/prev permit loads --- .../rewards/gift-cards/list-gift-cards.ts | 25 +++++++++++-------- .../claim-rewards-pagination.ts | 2 ++ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index f4fb41a1..0c5d0207 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -12,6 +12,20 @@ import { getRedeemCodeHtml } from "./reveal/redeem-code-html"; const html = String.raw; export async function initCollectGiftCard(app: AppState) { + const giftCardsSection = document.getElementById("gift-cards"); + if (!giftCardsSection) { + console.error("Missing gift cards section #gift-cards"); + return; + } + giftCardsSection.innerHTML = ""; + + const activateInfoSection = document.getElementById("activate-info"); + if (!activateInfoSection) { + console.error("Missing gift cards activate info section #activate-info"); + return; + } + activateInfoSection.innerHTML = ""; + const retrieveOrderUrl = `${getApiBaseUrl()}/get-order?orderId=${getGiftCardOrderId(app.reward.beneficiary, app.reward.signature)}`; const listGiftCardsUrl = `${getApiBaseUrl()}/list-gift-cards`; @@ -27,17 +41,6 @@ export async function initCollectGiftCard(app: AppState) { const transaction = (await retrieveOrderResponse.json()) as OrderTransaction; const giftCards = (await retrieveGiftCardsResponse.json()) as GiftCard[]; - const giftCardsSection = document.getElementById("gift-cards"); - if (!giftCardsSection) { - console.error("Missing gift cards section #gift-cards"); - return; - } - const activateInfoSection = document.getElementById("activate-info"); - if (!activateInfoSection) { - console.error("Missing gift cards activate info section #activate-info"); - return; - } - if (retrieveOrderResponse.status == 200) { const giftCard = giftCards.find((giftCard) => transaction.product.productId == giftCard.productId); diff --git a/static/scripts/rewards/render-transaction/claim-rewards-pagination.ts b/static/scripts/rewards/render-transaction/claim-rewards-pagination.ts index 37735ba5..e5948d8d 100644 --- a/static/scripts/rewards/render-transaction/claim-rewards-pagination.ts +++ b/static/scripts/rewards/render-transaction/claim-rewards-pagination.ts @@ -1,4 +1,5 @@ import { app } from "../app-state"; +import { initCollectGiftCard } from "../gift-cards/list-gift-cards"; import { getMakeClaimButton } from "../toaster"; import { table } from "./read-claim-data-from-url"; import { renderTransaction } from "./render-transaction"; @@ -17,5 +18,6 @@ function transactionHandler(direction: "next" | "previous") { removeAllEventListeners(getMakeClaimButton()) as HTMLButtonElement; direction === "next" ? app.nextPermit() : app.previousPermit(); table.setAttribute(`data-make-claim`, "error"); + initCollectGiftCard(app).catch(console.error); renderTransaction().catch(console.error); } From b09fb16c6dcdeca1de1898ea721f54babd7613cd Mon Sep 17 00:00:00 2001 From: EresDev Date: Sat, 25 May 2024 22:36:27 +0500 Subject: [PATCH 049/174] fix: use websocket rpc for faster & reliable tests --- cypress/scripts/anvil.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/scripts/anvil.ts b/cypress/scripts/anvil.ts index 11c2777e..0f4a8b7c 100644 --- a/cypress/scripts/anvil.ts +++ b/cypress/scripts/anvil.ts @@ -3,7 +3,7 @@ import { spawn } from "child_process"; const url = "http://localhost:8545"; -const anvil = spawn("anvil", ["--chain-id", "31337", "--fork-url", "https://rpc.gnosis.gateway.fm", "--host", "127.0.0.1", "--port", "8545"], { +const anvil = spawn("anvil", ["--chain-id", "31337", "--fork-url", "wss://rpc.gnosischain.com/wss", "--host", "127.0.0.1", "--port", "8545"], { stdio: "inherit", }); From 1bb6211e13a5728a91eb2e42fc06f5f8c34a9594 Mon Sep 17 00:00:00 2001 From: EresDev Date: Sat, 25 May 2024 23:20:36 +0500 Subject: [PATCH 050/174] fix: improve light mode support for gift cards --- static/scripts/rewards/gift-cards/gift-card.ts | 2 +- .../rewards/gift-cards/reveal/redeem-code-html.ts | 2 +- static/styles/rewards/gift-cards.css | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/static/scripts/rewards/gift-cards/gift-card.ts b/static/scripts/rewards/gift-cards/gift-card.ts index e5bb5863..8fd16203 100644 --- a/static/scripts/rewards/gift-cards/gift-card.ts +++ b/static/scripts/rewards/gift-cards/gift-card.ts @@ -33,7 +33,7 @@ export function getGiftCardHtml(giftCard: GiftCard, allowBuy: boolean, rewardAmo enable-background="new 0 0 0 0" xml:space="preserve" > - + ` diff --git a/static/scripts/rewards/gift-cards/reveal/redeem-code-html.ts b/static/scripts/rewards/gift-cards/reveal/redeem-code-html.ts index 8e21ff4b..f1995b40 100644 --- a/static/scripts/rewards/gift-cards/reveal/redeem-code-html.ts +++ b/static/scripts/rewards/gift-cards/reveal/redeem-code-html.ts @@ -24,7 +24,7 @@ export function getRedeemCodeHtml(transaction: OrderTransaction) { enable-background="new 0 0 0 0" xml:space="preserve" > - + diff --git a/static/styles/rewards/gift-cards.css b/static/styles/rewards/gift-cards.css index d000c3c7..ddbe8562 100644 --- a/static/styles/rewards/gift-cards.css +++ b/static/styles/rewards/gift-cards.css @@ -170,3 +170,18 @@ main:has(#gift-cards .gift-card) div:has(table.receipt) { #reveal-btn[data-loading-reveal="true"] .action { display: none; } +@media (prefers-color-scheme: light) { + .gift-card, + .redeem-info-wrapper { + background-color: #fff; + } + .gift-card h3, + .gift-card .pricing .available, + .gift-card div.buttons button, + .close-btn { + color: #000; + } + .gift-card img { + border-color: var(--light-mode-border-color); + } +} From 344befd5c81ff53c2bb3f238ac0293f84e7acaff Mon Sep 17 00:00:00 2001 From: EresDev Date: Sat, 25 May 2024 23:41:24 +0500 Subject: [PATCH 051/174] fix: separate matching & available price --- .../scripts/rewards/gift-cards/gift-card.ts | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/static/scripts/rewards/gift-cards/gift-card.ts b/static/scripts/rewards/gift-cards/gift-card.ts index 8fd16203..79f4ab5a 100644 --- a/static/scripts/rewards/gift-cards/gift-card.ts +++ b/static/scripts/rewards/gift-cards/gift-card.ts @@ -49,7 +49,7 @@ export function getGiftCardHtml(giftCard: GiftCard, allowBuy: boolean, rewardAmo } function getFixedPricesHtml(giftCard: GiftCard, rewardAmount: BigNumberish) { - let _html = html`
+ const _html = html`
Price
Value
`; @@ -57,14 +57,26 @@ function getFixedPricesHtml(giftCard: GiftCard, rewardAmount: BigNumberish) { const priceToValueMap = getFixedPriceToValueMap(giftCard); const priceAsKey = Number(formatEther(rewardAmount)).toFixed(2).toString(); + let matchingCardHtml = ""; + let otherCardsHtml = ""; Object.keys(priceToValueMap).forEach((price) => { - const _class = price == priceAsKey ? ` class="available"` : ``; - _html += html` -
${Number(price).toFixed(0)}${giftCard.senderCurrencyCode}
-
${priceToValueMap[price].toFixed(0)}${giftCard.recipientCurrencyCode}
-
`; + if (price == priceAsKey) { + matchingCardHtml += html`
+
${Number(price).toFixed(0)}${giftCard.senderCurrencyCode}
+
${priceToValueMap[price].toFixed(0)}${giftCard.recipientCurrencyCode}

Also available in

`; + } else { + otherCardsHtml += html`
+
${Number(price).toFixed(0)}${giftCard.senderCurrencyCode}
+
${priceToValueMap[price].toFixed(0)}${giftCard.recipientCurrencyCode}
+
`; + } }); - return _html; + return `${_html}${matchingCardHtml}${otherCardsHtml}`; } function getRangePricesHtml(giftCard: GiftCard, rewardAmount: BigNumberish) { @@ -78,8 +90,8 @@ function getRangePricesHtml(giftCard: GiftCard, rewardAmount: BigNumberish) {
${formatEther(rewardAmount)}${giftCard.senderCurrencyCode}
-
${giftCardValue.toFixed(2)}${giftCard.recipientCurrencyCode}
-
`; +
${giftCardValue.toFixed(2)}${giftCard.recipientCurrencyCode}

Also available in

`; } const priceToValueMap = getRangePriceToValueMap(giftCard); From 8736d1aa255ac3b84480e4783cd0d0be558be931 Mon Sep 17 00:00:00 2001 From: EresDev Date: Sat, 25 May 2024 23:46:29 +0500 Subject: [PATCH 052/174] refactor: rename function --- static/scripts/rewards/gift-cards/list-gift-cards.ts | 2 +- static/scripts/rewards/init.ts | 4 ++-- .../rewards/render-transaction/claim-rewards-pagination.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index 0c5d0207..6b081c8a 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -11,7 +11,7 @@ import { getRedeemCodeHtml } from "./reveal/redeem-code-html"; const html = String.raw; -export async function initCollectGiftCard(app: AppState) { +export async function initClaimGiftCard(app: AppState) { const giftCardsSection = document.getElementById("gift-cards"); if (!giftCardsSection) { console.error("Missing gift cards section #gift-cards"); diff --git a/static/scripts/rewards/init.ts b/static/scripts/rewards/init.ts index 1aa3b7ad..7e49c38e 100644 --- a/static/scripts/rewards/init.ts +++ b/static/scripts/rewards/init.ts @@ -1,5 +1,5 @@ import { app } from "./app-state"; -import { initCollectGiftCard } from "./gift-cards/list-gift-cards"; +import { initClaimGiftCard } from "./gift-cards/list-gift-cards"; import { readClaimDataFromUrl } from "./render-transaction/read-claim-data-from-url"; import { grid } from "./the-grid"; @@ -21,4 +21,4 @@ function gridLoadedCallback() { document.body.classList.add("grid-loaded"); } -initCollectGiftCard(app).catch(console.error); +initClaimGiftCard(app).catch(console.error); diff --git a/static/scripts/rewards/render-transaction/claim-rewards-pagination.ts b/static/scripts/rewards/render-transaction/claim-rewards-pagination.ts index e5948d8d..5e4ca4e5 100644 --- a/static/scripts/rewards/render-transaction/claim-rewards-pagination.ts +++ b/static/scripts/rewards/render-transaction/claim-rewards-pagination.ts @@ -1,5 +1,5 @@ import { app } from "../app-state"; -import { initCollectGiftCard } from "../gift-cards/list-gift-cards"; +import { initClaimGiftCard } from "../gift-cards/list-gift-cards"; import { getMakeClaimButton } from "../toaster"; import { table } from "./read-claim-data-from-url"; import { renderTransaction } from "./render-transaction"; @@ -18,6 +18,6 @@ function transactionHandler(direction: "next" | "previous") { removeAllEventListeners(getMakeClaimButton()) as HTMLButtonElement; direction === "next" ? app.nextPermit() : app.previousPermit(); table.setAttribute(`data-make-claim`, "error"); - initCollectGiftCard(app).catch(console.error); + initClaimGiftCard(app).catch(console.error); renderTransaction().catch(console.error); } From 376c9f2c234a25b8f3f61cc4af66584f44051a69 Mon Sep 17 00:00:00 2001 From: EresDev Date: Sun, 26 May 2024 00:15:24 +0500 Subject: [PATCH 053/174] fix: show gift card loader on page load --- static/index.html | 2 +- static/scripts/rewards/gift-cards/list-gift-cards.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/static/index.html b/static/index.html index 8570d6a1..03231322 100644 --- a/static/index.html +++ b/static/index.html @@ -179,7 +179,7 @@
-
+
Loading...
diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index 6b081c8a..fb1314e4 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -17,7 +17,7 @@ export async function initClaimGiftCard(app: AppState) { console.error("Missing gift cards section #gift-cards"); return; } - giftCardsSection.innerHTML = ""; + giftCardsSection.innerHTML = "Loading..."; const activateInfoSection = document.getElementById("activate-info"); if (!activateInfoSection) { From 56d7a9570319eeef16c9c559691d13118d7b263b Mon Sep 17 00:00:00 2001 From: EresDev Date: Sun, 26 May 2024 00:34:57 +0500 Subject: [PATCH 054/174] fix: await before printing in erc20 permit gen --- scripts/typescript/generate-erc20-permit-url.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/typescript/generate-erc20-permit-url.ts b/scripts/typescript/generate-erc20-permit-url.ts index bf87df7b..e9513c96 100644 --- a/scripts/typescript/generate-erc20-permit-url.ts +++ b/scripts/typescript/generate-erc20-permit-url.ts @@ -74,8 +74,9 @@ export async function generateERC20Permit(permitConfig: PermitConfig) { } export async function logERC20Permit(permitConfig: PermitConfig) { + const erc20Permit = await generateERC20Permit(permitConfig); log.ok("ERC20 Local URL:"); - log.info(await generateERC20Permit(permitConfig)); + log.info(erc20Permit); } /* eslint-disable @typescript-eslint/no-namespace */ From f9b16c0b79d7a15aa40243cad048869d5fb4d9d2 Mon Sep 17 00:00:00 2001 From: EresDev Date: Sun, 26 May 2024 00:59:38 +0500 Subject: [PATCH 055/174] chore: use wrangler to server UI & backend --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0316e570..c5bf517a 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "node": ">=20.10.0" }, "scripts": { - "start": "run-s start:sign start:ui", + "start": "run-s start:sign && npx wrangler pages dev static --port 8080", "watch": "nodemon -e ts,tsx --exec yarn start", "watch:ui": "nodemon -e ts,tsx --exec yarn start:ui", "format": "run-s format:lint format:prettier format:cspell", From 8fa0b09c8d372688f5a2984632e0ec8a0b66d1eb Mon Sep 17 00:00:00 2001 From: EresDev Date: Sun, 26 May 2024 01:31:37 +0500 Subject: [PATCH 056/174] chore: add gnosischain to accepted words in cspell --- .cspell.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.cspell.json b/.cspell.json index b7e7adab..4fcf5a9d 100644 --- a/.cspell.json +++ b/.cspell.json @@ -15,6 +15,7 @@ "ethersproject", "fract", "giftcards", + "gnosischain", "gnosisscan", "godb", "greyscale", From c0e71f70181b99bc13205b2ca58000a88f92c750 Mon Sep 17 00:00:00 2001 From: EresDev Date: Mon, 27 May 2024 12:56:46 +0500 Subject: [PATCH 057/174] chore: remove tenderly rpc --- functions/post-order.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/functions/post-order.ts b/functions/post-order.ts index b875eddd..e8374805 100644 --- a/functions/post-order.ts +++ b/functions/post-order.ts @@ -16,7 +16,6 @@ export const networkRpcs: Record = { 5: ["https://eth-goerli.public.blastapi.io"], 100: ["https://rpc.gnosischain.com"], 31337: ["http://127.0.0.1:8545"], - 31338: ["https://rpc.tenderly.co/fork/07e0d1c0-c5f5-4690-81ce-0676d0c8dbcd"], }; export const onRequest: PagesFunction = async (ctx) => { From 3c056ca05f5f229d85383cd4b499b47396bc5531 Mon Sep 17 00:00:00 2001 From: EresDev Date: Mon, 27 May 2024 14:52:27 +0500 Subject: [PATCH 058/174] chore: show mastercard before visa cards --- functions/list-gift-cards.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/functions/list-gift-cards.ts b/functions/list-gift-cards.ts index e838285b..5ec201fc 100644 --- a/functions/list-gift-cards.ts +++ b/functions/list-gift-cards.ts @@ -9,9 +9,9 @@ export const onRequest: PagesFunction = async (ctx) => { validateEnvVars(ctx); const accessToken = await getAccessToken(ctx.env); - const [visaCards, masterCards] = await Promise.all([getGiftCards("visa", accessToken), getGiftCards("mastercard", accessToken)]); + const [masterCards, visaCards] = await Promise.all([getGiftCards("mastercard", accessToken), getGiftCards("visa", accessToken)]); - const giftCards = [...visaCards, ...masterCards]; + const giftCards = [...masterCards, ...visaCards]; if (giftCards.length) { return Response.json(giftCards, { status: 200 }); From de33f428978c2cf17450e1d0e7f286ccbdc1d584 Mon Sep 17 00:00:00 2001 From: EresDev Date: Mon, 27 May 2024 14:55:18 +0500 Subject: [PATCH 059/174] fix: prevent exception on zero value --- shared/pricing.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/shared/pricing.ts b/shared/pricing.ts index c89847a7..73c70bbf 100644 --- a/shared/pricing.ts +++ b/shared/pricing.ts @@ -138,9 +138,5 @@ export function getGiftCardValue(giftCard: GiftCard, reward: BigNumberish, excha })}` ); } - - if (!giftCardValue) { - throw new Error(`Gift card is not available for the reward amount: ${JSON.stringify({ giftCard: giftCard, reward: reward })}`); - } return giftCardValue; } From acec598fa779950ed2bb018b81fa98735e873781 Mon Sep 17 00:00:00 2001 From: EresDev Date: Mon, 27 May 2024 15:26:09 +0500 Subject: [PATCH 060/174] fix: reuse existing permit health check --- .../rewards/gift-cards/claim/claim-action.ts | 13 ++----------- static/scripts/rewards/web3/erc20-permit.ts | 2 +- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/static/scripts/rewards/gift-cards/claim/claim-action.ts b/static/scripts/rewards/gift-cards/claim/claim-action.ts index 8f7e9a3d..17b4a5b6 100644 --- a/static/scripts/rewards/gift-cards/claim/claim-action.ts +++ b/static/scripts/rewards/gift-cards/claim/claim-action.ts @@ -4,7 +4,7 @@ import { AppState } from "../../app-state"; import { permit2Address } from "../../../../../shared/constants"; import { giftCardTreasuryAddress } from "../../../../../shared/constants"; import { toaster } from "../../toaster"; -import { isNonceClaimed, transferFromPermit, waitForTransaction } from "../../web3/erc20-permit"; +import { checkPermitClaimable, transferFromPermit, waitForTransaction } from "../../web3/erc20-permit"; import { getApiBaseUrl } from "../helpers"; import { isClaimableForAmount } from "../../../../../shared/pricing"; import { OrderRequestParams, GiftCard } from "../../../../../shared/types"; @@ -34,16 +34,7 @@ export function attachClaimAction(className: string, giftCards: GiftCard[], app: async function claimGiftCard(productId: number, app: AppState) { if (app.signer) { - if ((await app.signer.getAddress()).toLowerCase() != app.reward.beneficiary.toLowerCase()) { - toaster.create("error", "The connected wallet is not the beneficiary of the reward."); - return; - } - const isClaimed = await isNonceClaimed(app); - if (isClaimed) { - toaster.create("error", "Reward has been claimed already."); - return; - } - + await checkPermitClaimable(app); const permit2Contract = new ethers.Contract(permit2Address, permit2Abi, app.signer); if (!permit2Contract) return; diff --git a/static/scripts/rewards/web3/erc20-permit.ts b/static/scripts/rewards/web3/erc20-permit.ts index 6c3ccaaf..d0fb365d 100644 --- a/static/scripts/rewards/web3/erc20-permit.ts +++ b/static/scripts/rewards/web3/erc20-permit.ts @@ -139,7 +139,7 @@ export function claimErc20PermitHandlerWrapper(app: AppState) { }; } -async function checkPermitClaimable(app: AppState): Promise { +export async function checkPermitClaimable(app: AppState): Promise { let isClaimed: boolean; try { isClaimed = await isNonceClaimed(app); From 1d89eea0f7f7eebc4e4e06a28bc7a2076f343764 Mon Sep 17 00:00:00 2001 From: EresDev Date: Mon, 27 May 2024 16:11:56 +0500 Subject: [PATCH 061/174] fix: make the height of card img fixed to align --- static/styles/rewards/gift-cards.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/styles/rewards/gift-cards.css b/static/styles/rewards/gift-cards.css index ddbe8562..2b5ff8a1 100644 --- a/static/styles/rewards/gift-cards.css +++ b/static/styles/rewards/gift-cards.css @@ -92,7 +92,7 @@ main:has(#gift-cards .gift-card) div:has(table.receipt) { height: auto; border: 2px solid #80808020; max-width: 168px; - max-height: 110px; + height: 110px; } .gift-card .pricing { From 8cce1398d3cee54245701015ff7867a377bbc05e Mon Sep 17 00:00:00 2001 From: EresDev Date: Tue, 28 May 2024 00:11:47 +0500 Subject: [PATCH 062/174] fix: check of negative status to fail an order --- functions/post-order.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/post-order.ts b/functions/post-order.ts index e8374805..3e9f8e17 100644 --- a/functions/post-order.ts +++ b/functions/post-order.ts @@ -82,7 +82,7 @@ export const onRequest: PagesFunction = async (ctx) => { const order = await orderGiftCard(productId, giftCardValue, orderId, accessToken); - if (order.status == "SUCCESSFUL") { + if (order.status != "REFUNDED" && order.status != "FAILED") { return Response.json(order, { status: 200 }); } else { throw new Error(`Order failed: ${JSON.stringify(order)}`); From ec7292a21cc443b06d125640fcef1097a46538f5 Mon Sep 17 00:00:00 2001 From: EresDev Date: Tue, 28 May 2024 00:12:42 +0500 Subject: [PATCH 063/174] fix: make redeem code visible as case sensitive & wrapped --- static/styles/rewards/gift-cards.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/static/styles/rewards/gift-cards.css b/static/styles/rewards/gift-cards.css index 2b5ff8a1..21c8a8c2 100644 --- a/static/styles/rewards/gift-cards.css +++ b/static/styles/rewards/gift-cards.css @@ -60,6 +60,11 @@ main:has(#gift-cards .gift-card) div:has(table.receipt) { } .redeem-code { width: 160px; + overflow-wrap: break-word; + text-transform: none; +} +.redeem-code p { + text-transform: none; } .gift-card h3 { From 4fb3568c493b2d58bfe4b77c829b8eb9bf212af1 Mon Sep 17 00:00:00 2001 From: EresDev Date: Tue, 28 May 2024 00:28:54 +0500 Subject: [PATCH 064/174] fix: improve order processing messages --- static/scripts/rewards/gift-cards/claim/claim-action.ts | 4 ++-- static/scripts/rewards/web3/erc20-permit.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/static/scripts/rewards/gift-cards/claim/claim-action.ts b/static/scripts/rewards/gift-cards/claim/claim-action.ts index 17b4a5b6..138483ee 100644 --- a/static/scripts/rewards/gift-cards/claim/claim-action.ts +++ b/static/scripts/rewards/gift-cards/claim/claim-action.ts @@ -43,9 +43,9 @@ async function claimGiftCard(productId: number, app: AppState) { }; reward.beneficiary = giftCardTreasuryAddress; - const tx = await transferFromPermit(permit2Contract, reward); + const tx = await transferFromPermit(permit2Contract, reward, "Processing... Please wait. Do not close this page."); if (!tx) return; - await waitForTransaction(tx, `Payment confirmed. Claiming card now...`); + await waitForTransaction(tx, `Success. Refresh this page in a few minutes to get your card.`); const url = `${getApiBaseUrl()}/post-order`; diff --git a/static/scripts/rewards/web3/erc20-permit.ts b/static/scripts/rewards/web3/erc20-permit.ts index d0fb365d..9241c0f7 100644 --- a/static/scripts/rewards/web3/erc20-permit.ts +++ b/static/scripts/rewards/web3/erc20-permit.ts @@ -56,7 +56,7 @@ async function checkPermitClaimability(app: AppState): Promise { return false; } -export async function transferFromPermit(permit2Contract: Contract, reward: Permit) { +export async function transferFromPermit(permit2Contract: Contract, reward: Permit, successMessage?: string) { try { const tx = await permit2Contract.permitTransferFrom( { @@ -71,7 +71,7 @@ export async function transferFromPermit(permit2Contract: Contract, reward: Perm reward.owner, reward.signature ); - toaster.create("info", `Transaction sent`); + toaster.create("info", successMessage ?? `Transaction sent`); return tx; } catch (error: unknown) { if (error instanceof Error) { From 76916a347888ebb08e2ce0fbdfc36d6483d9a6ad Mon Sep 17 00:00:00 2001 From: EresDev Date: Tue, 28 May 2024 00:53:53 +0500 Subject: [PATCH 065/174] test: update gift card order msgs assertions --- cypress/e2e/claim-gift-card.cy.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cypress/e2e/claim-gift-card.cy.ts b/cypress/e2e/claim-gift-card.cy.ts index f7948ded..d4fef54c 100644 --- a/cypress/e2e/claim-gift-card.cy.ts +++ b/cypress/e2e/claim-gift-card.cy.ts @@ -67,8 +67,8 @@ describe("Gift Cards", () => { cy.intercept({ method: "GET", url: "/get-order**" }).as("getOrder"); cy.get(".gift-card .available").eq(0).parent().parent().find(".claim-gift-card-btn").invoke("click"); - cy.get(".notifications", { timeout: 10000 }).should("contain.text", "Transaction sent"); - cy.get(".notifications", { timeout: 10000 }).should("contain.text", "Payment confirmed. Claiming card now..."); + cy.get(".notifications", { timeout: 10000 }).should("contain.text", "Processing... Please wait. Do not close this page."); + cy.get(".notifications", { timeout: 10000 }).should("contain.text", "Success. Refresh this page in a few minutes to get your card."); cy.wait("@getOrder", { timeout: 10000 }); cy.get("#gift-cards").should("exist").and("include.text", "Your gift card"); From 1135a4f0b5185044c262f75133394d388b2f7d8d Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 31 May 2024 23:18:03 +0500 Subject: [PATCH 066/174] chore: run missed yarn install from previous merge --- yarn.lock | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/yarn.lock b/yarn.lock index 57ce0952..7054848d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1642,7 +1642,7 @@ "@octokit/webhooks-methods" "^5.0.0" aggregate-error "^5.0.0" -"@sinclair/typebox@^0.32.15", "@sinclair/typebox@^0.32.5": +"@sinclair/typebox@^0.32.5": version "0.32.23" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.32.23.tgz#18419f3a276da4e7f26300497c1537848727778b" integrity sha512-NiMhEgFo5nDlg39HDEvETDdXmURfyd8ougIjynebGebZti/gZ4LxoCcbVS6jgfNF8Sf7ZvPVl/fV0YsJIW4ltg== @@ -1933,6 +1933,15 @@ ethers "6.11.1" libsodium-wrappers "^0.7.13" +"@ubiquity-dao/rpc-handler@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@ubiquity-dao/rpc-handler/-/rpc-handler-1.1.0.tgz#5a17e98de8c611ea19315ff946166b20d6f7f629" + integrity sha512-EzbwAoHx+jPEymAdJbKt1O7C9RB/R3IWcBPRbDzFs8iBOuFktClsR8e95xvFrV9n2jTmr2ZHxpXE/rOLOEWfPA== + dependencies: + "@ethersproject/providers" "5.7.2" + axios "^1.7.1" + node-fetch "^3.3.2" + "@ungap/structured-clone@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" @@ -2194,10 +2203,10 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== -axios@^1.6.7: - version "1.6.8" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" - integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== +axios@^1.7.1: + 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" From 214f73097447e33f17adcf314e8a10da4e541edd Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 31 May 2024 23:21:22 +0500 Subject: [PATCH 067/174] refactor: change arrow functions to named functions --- functions/get-order.ts | 14 +++++++------- functions/get-redeem-code.ts | 16 ++++++++-------- functions/list-gift-cards.ts | 14 +++++++------- functions/post-order.ts | 26 +++++++++++++------------- functions/types.ts | 3 +++ 5 files changed, 38 insertions(+), 35 deletions(-) diff --git a/functions/get-order.ts b/functions/get-order.ts index 9928a9cb..e62f3a05 100644 --- a/functions/get-order.ts +++ b/functions/get-order.ts @@ -1,9 +1,9 @@ -import { Env, getAccessToken, getBaseUrl, commonHeaders } from "./helpers"; -import { ReloadlyFailureResponse, ReloadlyGetTransactionResponse } from "./types"; +import { OrderTransaction } from "../shared/types"; +import { commonHeaders, getAccessToken, getBaseUrl } from "./helpers"; +import { AccessToken, Context, ReloadlyFailureResponse, ReloadlyGetTransactionResponse } from "./types"; import { validateEnvVars, validateRequestMethod } from "./validators"; -import { AccessToken } from "./types"; -export const onRequest: PagesFunction = async (ctx) => { +export async function onRequest(ctx: Context): Promise { try { validateRequestMethod(ctx.request.method, "GET"); validateEnvVars(ctx); @@ -30,9 +30,9 @@ export const onRequest: PagesFunction = async (ctx) => { console.error("There was an error while processing your request.", error); return Response.json({ message: "There was an error while processing your request." }, { status: 500 }); } -}; +} -export const getTransactionFromOrderId = async (orderId: string, accessToken: AccessToken) => { +export async function getTransactionFromOrderId(orderId: string, accessToken: AccessToken): Promise { const nowFormatted = new Date().toISOString().replace("T", " ").substring(0, 19); //// yyyy-mm-dd HH:mm:ss const oneYearAgo = new Date(new Date().setFullYear(new Date().getFullYear() - 1)); const oneYearAgoFormatted = oneYearAgo.toISOString().replace("T", " ").substring(0, 19); @@ -62,4 +62,4 @@ export const getTransactionFromOrderId = async (orderId: string, accessToken: Ac ); } return (responseJson as ReloadlyGetTransactionResponse).content[0]; -}; +} diff --git a/functions/get-redeem-code.ts b/functions/get-redeem-code.ts index ff43d6c8..f92a1824 100644 --- a/functions/get-redeem-code.ts +++ b/functions/get-redeem-code.ts @@ -1,12 +1,12 @@ -import { getGiftCardOrderId, getMessageToSign } from "../shared/helpers"; -import { ReloadlyFailureResponse, ReloadlyRedeemCodeResponse } from "./types"; import { verifyMessage } from "ethers/lib/utils"; +import { getGiftCardOrderId, getMessageToSign } from "../shared/helpers"; +import { RedeemCode } from "../shared/types"; import { getTransactionFromOrderId } from "./get-order"; +import { commonHeaders, getAccessToken, getBaseUrl } from "./helpers"; +import { AccessToken, Context, ReloadlyFailureResponse, ReloadlyRedeemCodeResponse } from "./types"; import { validateEnvVars, validateRequestMethod } from "./validators"; -import { Env, getAccessToken, getBaseUrl, commonHeaders } from "./helpers"; -import { AccessToken } from "./types"; -export const onRequest: PagesFunction = async (ctx) => { +export async function onRequest(ctx: Context): Promise { try { validateRequestMethod(ctx.request.method, "GET"); validateEnvVars(ctx); @@ -62,9 +62,9 @@ export const onRequest: PagesFunction = async (ctx) => { console.error("There was an error while processing your request.", error); return Response.json({ message: "There was an error while processing your request." }, { status: 500 }); } -}; +} -export const getRedeemCode = async (transactionId: number, accessToken: AccessToken) => { +export async function getRedeemCode(transactionId: number, accessToken: AccessToken): Promise { const url = `${getBaseUrl(accessToken.isSandbox)}/orders/transactions/${transactionId}/cards`; console.log(`Retrieving redeem codes from ${url}`); const options = { @@ -90,4 +90,4 @@ export const getRedeemCode = async (transactionId: number, accessToken: AccessTo console.log(`Response from ${url}`, responseJson); return responseJson as ReloadlyRedeemCodeResponse; -}; +} diff --git a/functions/list-gift-cards.ts b/functions/list-gift-cards.ts index 5ec201fc..1446d82f 100644 --- a/functions/list-gift-cards.ts +++ b/functions/list-gift-cards.ts @@ -1,9 +1,9 @@ -import { ReloadlyFailureResponse, ReloadlyListGiftCardResponse } from "./types"; -import { Env, getAccessToken, getBaseUrl, commonHeaders } from "./helpers"; -import { AccessToken } from "./types"; +import { GiftCard } from "../shared/types"; +import { commonHeaders, getAccessToken, getBaseUrl } from "./helpers"; +import { AccessToken, Context, ReloadlyFailureResponse, ReloadlyListGiftCardResponse } from "./types"; import { validateEnvVars, validateRequestMethod } from "./validators"; -export const onRequest: PagesFunction = async (ctx) => { +export async function onRequest(ctx: Context): Promise { try { validateRequestMethod(ctx.request.method, "GET"); validateEnvVars(ctx); @@ -21,9 +21,9 @@ export const onRequest: PagesFunction = async (ctx) => { console.error("There was an error while processing your request.", error); return Response.json({ message: "There was an error while processing your request." }, { status: 500 }); } -}; +} -const getGiftCards = async (productQuery: string, accessToken: AccessToken) => { +async function getGiftCards(productQuery: string, accessToken: AccessToken): Promise { const url = `${getBaseUrl(accessToken.isSandbox)}/products?productName=${productQuery}`; console.log(`Retrieving gift cards from ${url}`); const options = { @@ -54,4 +54,4 @@ const getGiftCards = async (productQuery: string, accessToken: AccessToken) => { } return (responseJson as ReloadlyListGiftCardResponse).content; -}; +} diff --git a/functions/post-order.ts b/functions/post-order.ts index 3e9f8e17..9ddb7bb4 100644 --- a/functions/post-order.ts +++ b/functions/post-order.ts @@ -3,13 +3,13 @@ import { JsonRpcProvider } from "@ethersproject/providers/lib/json-rpc-provider" import { Interface, TransactionDescription } from "ethers/lib/utils"; import { Tokens, chainIdToRewardTokenMap, giftCardTreasuryAddress, permit2Address, permitTokenOwner } from "../shared/constants"; import { getGiftCardOrderId } from "../shared/helpers"; -import { ExchangeRate, OrderRequestParams, GiftCard } from "../shared/types"; +import { getGiftCardValue, isClaimableForAmount } from "../shared/pricing"; +import { ExchangeRate, GiftCard, OrderRequestParams } from "../shared/types"; import { permit2Abi } from "../static/scripts/rewards/abis/permit2Abi"; import { getTransactionFromOrderId } from "./get-order"; +import { commonHeaders, getAccessToken, getBaseUrl } from "./helpers"; +import { AccessToken, Context, ReloadlyFailureResponse, ReloadlyOrderResponse } from "./types"; import { validateEnvVars, validateRequestMethod } from "./validators"; -import { Env, commonHeaders, getAccessToken, getBaseUrl } from "./helpers"; -import { AccessToken, ReloadlyFailureResponse, ReloadlyOrderResponse } from "./types"; -import { getGiftCardValue, isClaimableForAmount } from "../shared/pricing"; export const networkRpcs: Record = { 1: ["https://gateway.tenderly.co/public/mainnet"], @@ -18,7 +18,7 @@ export const networkRpcs: Record = { 31337: ["http://127.0.0.1:8545"], }; -export const onRequest: PagesFunction = async (ctx) => { +export async function onRequest(ctx: Context): Promise { try { validateRequestMethod(ctx.request.method, "POST"); validateEnvVars(ctx); @@ -91,9 +91,9 @@ export const onRequest: PagesFunction = async (ctx) => { console.error("There was an error while processing your request.", error); return Response.json({ message: "There was an error while processing your request." }, { status: 500 }); } -}; +} -const getGiftCardById = async (productId: number, accessToken: AccessToken) => { +async function getGiftCardById(productId: number, accessToken: AccessToken): Promise { const url = `${getBaseUrl(accessToken.isSandbox)}/products/${productId}`; console.log(`Retrieving gift cards from ${url}`); const options = { @@ -119,9 +119,9 @@ const getGiftCardById = async (productId: number, accessToken: AccessToken) => { console.log(`Response from ${url}`, responseJson); return responseJson as GiftCard; -}; +} -const orderGiftCard = async (productId: number, cardValue: number, identifier: string, accessToken: AccessToken) => { +async function orderGiftCard(productId: number, cardValue: number, identifier: string, accessToken: AccessToken): Promise { const url = `${getBaseUrl(accessToken.isSandbox)}/orders`; console.log(`Placing order at url: ${url}`); @@ -161,9 +161,9 @@ const orderGiftCard = async (productId: number, cardValue: number, identifier: s console.log(`Response from ${url}`, responseJson); return responseJson as ReloadlyOrderResponse; -}; +} -async function isDuplicateOrder(orderId: string, accessToken: AccessToken) { +async function isDuplicateOrder(orderId: string, accessToken: AccessToken): Promise { try { const transaction = await getTransactionFromOrderId(orderId, accessToken); return !!transaction.transactionId; @@ -172,7 +172,7 @@ async function isDuplicateOrder(orderId: string, accessToken: AccessToken) { } } -async function getExchangeRate(usdAmount: number, fromCurrency: string, accessToken: AccessToken) { +async function getExchangeRate(usdAmount: number, fromCurrency: string, accessToken: AccessToken): Promise { const url = `${getBaseUrl(accessToken.isSandbox)}/fx-rate?currencyCode=${fromCurrency}&amount=${usdAmount}`; console.log(`Retrieving url ${url}`); const options = { @@ -200,7 +200,7 @@ async function getExchangeRate(usdAmount: number, fromCurrency: string, accessTo return responseJson as ExchangeRate; } -function validateTransaction(txParsed: TransactionDescription, txReceipt: TransactionReceipt, chainId: number, giftCard: GiftCard) { +function validateTransaction(txParsed: TransactionDescription, txReceipt: TransactionReceipt, chainId: number, giftCard: GiftCard): Response | void { const rewardAmount = txParsed.args.transferDetails.requestedAmount; if (!isClaimableForAmount(giftCard, rewardAmount)) { diff --git a/functions/types.ts b/functions/types.ts index 8730ada9..97ebd3bb 100644 --- a/functions/types.ts +++ b/functions/types.ts @@ -1,4 +1,5 @@ import { GiftCard, Order, OrderTransaction, RedeemCode } from "../shared/types"; +import { Env } from "./helpers"; export interface AccessToken { token: string; @@ -66,3 +67,5 @@ export interface ReloadlyFailureResponse { infoLink?: string; details: []; } + +export type Context = EventContext>; From ae48f8a6bb2868f5c21ba66353f9cf854f175d9a Mon Sep 17 00:00:00 2001 From: EresDev Date: Sat, 1 Jun 2024 00:14:01 +0500 Subject: [PATCH 068/174] refactor: reduce function complexity --- .../scripts/rewards/gift-cards/gift-card.ts | 40 +++++++++---------- .../rewards/gift-cards/list-gift-cards.ts | 4 +- static/styles/rewards/gift-cards.css | 3 ++ 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/static/scripts/rewards/gift-cards/gift-card.ts b/static/scripts/rewards/gift-cards/gift-card.ts index 79f4ab5a..cae42394 100644 --- a/static/scripts/rewards/gift-cards/gift-card.ts +++ b/static/scripts/rewards/gift-cards/gift-card.ts @@ -5,7 +5,7 @@ import { formatEther } from "ethers/lib/utils"; const html = String.raw; -export function getGiftCardHtml(giftCard: GiftCard, allowBuy: boolean, rewardAmount: BigNumberish) { +export function getGiftCardHtml(giftCard: GiftCard, rewardAmount: BigNumberish) { return html`
@@ -18,26 +18,24 @@ export function getGiftCardHtml(giftCard: GiftCard, allowBuy: boolean, rewardAmo - ${allowBuy - ? `` - : ``} +
diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index fb1314e4..9bf08e7a 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -47,7 +47,7 @@ export async function initClaimGiftCard(app: AppState) { let giftCardsHtml = `

Your gift card

`; giftCardsHtml += `
`; if (giftCard) { - giftCardsHtml += getGiftCardHtml(giftCard, false, app.reward.amount); + giftCardsHtml += getGiftCardHtml(giftCard, app.reward.amount); } giftCardsHtml += getRedeemCodeHtml(transaction); giftCardsHtml += `
`; @@ -65,7 +65,7 @@ export async function initClaimGiftCard(app: AppState) { let giftCardsHtml = `

Or claim in virtual visa/mastercard

`; giftCardsHtml += `
`; giftCards.forEach((giftCard: GiftCard) => { - giftCardsHtml += getGiftCardHtml(giftCard, true, app.reward.amount); + giftCardsHtml += getGiftCardHtml(giftCard, app.reward.amount); }); giftCardsHtml += `

`; giftCardsHtml += getDisclaimerHtml(); diff --git a/static/styles/rewards/gift-cards.css b/static/styles/rewards/gift-cards.css index 21c8a8c2..15441423 100644 --- a/static/styles/rewards/gift-cards.css +++ b/static/styles/rewards/gift-cards.css @@ -157,6 +157,9 @@ main:has(#gift-cards .gift-card) div:has(table.receipt) { .claim-gift-card-btn[data-loading="false"] > span.loading { display: none; } +.gift-cards-wrapper.purchased .claim-gift-card-btn { + display: none; +} #reveal-btn[data-loading-reveal="false"] .loading { display: none; From 77328666c611a1727dc00be0b084599151a35e21 Mon Sep 17 00:00:00 2001 From: EresDev Date: Sat, 1 Jun 2024 00:40:16 +0500 Subject: [PATCH 069/174] refactor: replace string concatination with array push --- .../rewards/gift-cards/list-gift-cards.ts | 43 ++++++++++--------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index 9bf08e7a..225c65fa 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -43,42 +43,43 @@ export async function initClaimGiftCard(app: AppState) { if (retrieveOrderResponse.status == 200) { const giftCard = giftCards.find((giftCard) => transaction.product.productId == giftCard.productId); - - let giftCardsHtml = `

Your gift card

`; - giftCardsHtml += `
`; + const giftCardsHtmlParts: string[] = []; + giftCardsHtmlParts.push(`

Your gift card

`); + giftCardsHtmlParts.push(`
`); if (giftCard) { - giftCardsHtml += getGiftCardHtml(giftCard, app.reward.amount); + giftCardsHtmlParts.push(getGiftCardHtml(giftCard, app.reward.amount)); } - giftCardsHtml += getRedeemCodeHtml(transaction); - giftCardsHtml += `
`; - giftCardsSection.innerHTML = giftCardsHtml; + giftCardsHtmlParts.push(getRedeemCodeHtml(transaction)); + giftCardsHtmlParts.push(`
`); + giftCardsSection.innerHTML = giftCardsHtmlParts.join(","); - let activateInfoHtml = ""; + const activateInfoHtmlParts: string[] = []; if (giftCard) { - activateInfoHtml += getGiftCardActivateInfoHtml(giftCard); + activateInfoHtmlParts.push(getGiftCardActivateInfoHtml(giftCard)); } - activateInfoSection.innerHTML = activateInfoHtml; + activateInfoSection.innerHTML = activateInfoHtmlParts.join(""); attachRevealAction(transaction, app); } else if (retrieveGiftCardsResponse.status == 200) { - let giftCardsHtml = `

Or claim in virtual visa/mastercard

`; - giftCardsHtml += `
`; + const giftCardsHtmlParts: string[] = []; + giftCardsHtmlParts.push(`

Or claim in virtual visa/mastercard

`); + giftCardsHtmlParts.push(`
`); giftCards.forEach((giftCard: GiftCard) => { - giftCardsHtml += getGiftCardHtml(giftCard, app.reward.amount); + giftCardsHtmlParts.push(getGiftCardHtml(giftCard, app.reward.amount)); }); - giftCardsHtml += `

`; - giftCardsHtml += getDisclaimerHtml(); - giftCardsHtml += `

`; - giftCardsHtml += `

`; + giftCardsHtmlParts.push(`

`); + giftCardsHtmlParts.push(getDisclaimerHtml()); + giftCardsHtmlParts.push(`

`); + giftCardsHtmlParts.push(`

`); - giftCardsSection.innerHTML = giftCardsHtml; + giftCardsSection.innerHTML = giftCardsHtmlParts.join(""); - let activateInfoHtml = ""; + const activateInfoHtmlParts: string[] = []; giftCards.forEach((giftCard: GiftCard) => { - activateInfoHtml += getGiftCardActivateInfoHtml(giftCard); + activateInfoHtmlParts.push(getGiftCardActivateInfoHtml(giftCard)); }); - activateInfoSection.innerHTML = activateInfoHtml; + activateInfoSection.innerHTML = activateInfoHtmlParts.join(""); attachClaimAction("claim-gift-card-btn", giftCards, app); } else if (retrieveGiftCardsResponse.status == 404) { From 70381cc8147020f1befdac0e17a2de32fafa977b Mon Sep 17 00:00:00 2001 From: EresDev Date: Sat, 1 Jun 2024 00:50:43 +0500 Subject: [PATCH 070/174] refactor: move disclaimer to static html --- static/index.html | 5 +++++ .../scripts/rewards/gift-cards/list-gift-cards.ts | 15 +-------------- static/styles/rewards/gift-cards.css | 5 +++++ 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/static/index.html b/static/index.html index 03231322..fc3baa2d 100644 --- a/static/index.html +++ b/static/index.html @@ -181,6 +181,11 @@
Loading...
+
+

Disclaimer

+

All Visa/Mastercard are non-exchangeable & non-refundable.

+

Exact value of a card can be slightly different due to exchange rate.

+
diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index 225c65fa..4d12b613 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -9,8 +9,6 @@ import { getGiftCardActivateInfoHtml } from "./activate/activate-html"; import { getGiftCardHtml } from "./gift-card"; import { getRedeemCodeHtml } from "./reveal/redeem-code-html"; -const html = String.raw; - export async function initClaimGiftCard(app: AppState) { const giftCardsSection = document.getElementById("gift-cards"); if (!giftCardsSection) { @@ -68,10 +66,7 @@ export async function initClaimGiftCard(app: AppState) { giftCards.forEach((giftCard: GiftCard) => { giftCardsHtmlParts.push(getGiftCardHtml(giftCard, app.reward.amount)); }); - giftCardsHtmlParts.push(`

`); - giftCardsHtmlParts.push(getDisclaimerHtml()); - giftCardsHtmlParts.push(`

`); - giftCardsHtmlParts.push(`

`); + giftCardsHtmlParts.push(`
`); giftCardsSection.innerHTML = giftCardsHtmlParts.join(""); @@ -90,11 +85,3 @@ export async function initClaimGiftCard(app: AppState) { attachActivateInfoAction(); } - -function getDisclaimerHtml() { - return html` -

Disclaimer

-

All Visa/Mastercard are non-exchangeable & non-refundable.

-

Exact value of a card can be slightly different due to exchange rate.

- `; -} diff --git a/static/styles/rewards/gift-cards.css b/static/styles/rewards/gift-cards.css index 15441423..6d4d72df 100644 --- a/static/styles/rewards/gift-cards.css +++ b/static/styles/rewards/gift-cards.css @@ -178,6 +178,11 @@ main:has(#gift-cards .gift-card) div:has(table.receipt) { #reveal-btn[data-loading-reveal="true"] .action { display: none; } +.disclaimer { + text-align: center; + padding-top: 24px; +} + @media (prefers-color-scheme: light) { .gift-card, .redeem-info-wrapper { From 2a2325a1959a2f2b07c6d52623dec3a6d50bbf9c Mon Sep 17 00:00:00 2001 From: EresDev Date: Sat, 1 Jun 2024 00:52:03 +0500 Subject: [PATCH 071/174] refactor: utilize run-s to run seq start scripts --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 1368d498..d45bbad7 100644 --- a/package.json +++ b/package.json @@ -9,13 +9,14 @@ "node": ">=20.10.0" }, "scripts": { - "start": "run-s start:sign && npx wrangler pages dev static --port 8080", + "start": "run-s start:sign serve", "watch": "nodemon -e ts,tsx --exec yarn start", "watch:ui": "nodemon -e ts,tsx --exec yarn start:ui", "format": "run-s format:lint format:prettier format:cspell", "build": "run-s utils:build", "start:ui": "tsx build/esbuild-server.ts", "start:sign": "tsx scripts/typescript/generate-permit2-url.ts", + "serve": "npx wrangler pages dev static --port 8080", "utils:build": "tsx build/esbuild-build.ts", "utils:get-invalidate-params": "forge script --via-ir scripts/solidity/GetInvalidateNonceParams.s.sol", "format:lint": "eslint --fix .", From 5ae08db462f2aff1dfdeb57427a0c1c341862ef9 Mon Sep 17 00:00:00 2001 From: EresDev Date: Sat, 1 Jun 2024 01:21:03 +0500 Subject: [PATCH 072/174] refactor: shorten the variable name --- .../rewards/gift-cards/list-gift-cards.ts | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index 4d12b613..6f20b8d7 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -41,15 +41,15 @@ export async function initClaimGiftCard(app: AppState) { if (retrieveOrderResponse.status == 200) { const giftCard = giftCards.find((giftCard) => transaction.product.productId == giftCard.productId); - const giftCardsHtmlParts: string[] = []; - giftCardsHtmlParts.push(`

Your gift card

`); - giftCardsHtmlParts.push(`
`); + const htmlParts: string[] = []; + htmlParts.push(`

Your gift card

`); + htmlParts.push(`
`); if (giftCard) { - giftCardsHtmlParts.push(getGiftCardHtml(giftCard, app.reward.amount)); + htmlParts.push(getGiftCardHtml(giftCard, app.reward.amount)); } - giftCardsHtmlParts.push(getRedeemCodeHtml(transaction)); - giftCardsHtmlParts.push(`
`); - giftCardsSection.innerHTML = giftCardsHtmlParts.join(","); + htmlParts.push(getRedeemCodeHtml(transaction)); + htmlParts.push(`
`); + giftCardsSection.innerHTML = htmlParts.join(","); const activateInfoHtmlParts: string[] = []; if (giftCard) { @@ -60,15 +60,15 @@ export async function initClaimGiftCard(app: AppState) { attachRevealAction(transaction, app); } else if (retrieveGiftCardsResponse.status == 200) { - const giftCardsHtmlParts: string[] = []; - giftCardsHtmlParts.push(`

Or claim in virtual visa/mastercard

`); - giftCardsHtmlParts.push(`
`); + const htmlParts: string[] = []; + htmlParts.push(`

Or claim in virtual visa/mastercard

`); + htmlParts.push(`
`); giftCards.forEach((giftCard: GiftCard) => { - giftCardsHtmlParts.push(getGiftCardHtml(giftCard, app.reward.amount)); + htmlParts.push(getGiftCardHtml(giftCard, app.reward.amount)); }); - giftCardsHtmlParts.push(`
`); + htmlParts.push(`
`); - giftCardsSection.innerHTML = giftCardsHtmlParts.join(""); + giftCardsSection.innerHTML = htmlParts.join(""); const activateInfoHtmlParts: string[] = []; giftCards.forEach((giftCard: GiftCard) => { From 4ec8c666ecb07cd2d532785ff11df752c12ee2de Mon Sep 17 00:00:00 2001 From: EresDev Date: Mon, 3 Jun 2024 16:51:21 +0500 Subject: [PATCH 073/174] fix: use fastest rpc from @ubiquity-dao/rpc-handler --- functions/helpers.ts | 3 +++ functions/post-order.ts | 17 ++++++----------- shared/helpers.ts | 17 +++++++++++++++++ 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/functions/helpers.ts b/functions/helpers.ts index 749ae2df..02d0be48 100644 --- a/functions/helpers.ts +++ b/functions/helpers.ts @@ -1,9 +1,12 @@ import { AccessToken } from "./types"; +export const allowedChainIds = [1, 5, 100, 31337]; + export const commonHeaders = { "Content-Type": "application/json", Accept: "application/com.reloadly.giftcards-v1+json", }; + export interface Env { USE_RELOADLY_SANDBOX: boolean; RELOADLY_API_CLIENT_ID: string; diff --git a/functions/post-order.ts b/functions/post-order.ts index 9ddb7bb4..55c8af64 100644 --- a/functions/post-order.ts +++ b/functions/post-order.ts @@ -2,22 +2,15 @@ import { TransactionReceipt, TransactionResponse } from "@ethersproject/provider import { JsonRpcProvider } from "@ethersproject/providers/lib/json-rpc-provider"; import { Interface, TransactionDescription } from "ethers/lib/utils"; import { Tokens, chainIdToRewardTokenMap, giftCardTreasuryAddress, permit2Address, permitTokenOwner } from "../shared/constants"; -import { getGiftCardOrderId } from "../shared/helpers"; +import { getFastestRpcUrl, getGiftCardOrderId } from "../shared/helpers"; import { getGiftCardValue, isClaimableForAmount } from "../shared/pricing"; import { ExchangeRate, GiftCard, OrderRequestParams } from "../shared/types"; import { permit2Abi } from "../static/scripts/rewards/abis/permit2Abi"; import { getTransactionFromOrderId } from "./get-order"; -import { commonHeaders, getAccessToken, getBaseUrl } from "./helpers"; +import { allowedChainIds, commonHeaders, getAccessToken, getBaseUrl } from "./helpers"; import { AccessToken, Context, ReloadlyFailureResponse, ReloadlyOrderResponse } from "./types"; import { validateEnvVars, validateRequestMethod } from "./validators"; -export const networkRpcs: Record = { - 1: ["https://gateway.tenderly.co/public/mainnet"], - 5: ["https://eth-goerli.public.blastapi.io"], - 100: ["https://rpc.gnosischain.com"], - 31337: ["http://127.0.0.1:8545"], -}; - export async function onRequest(ctx: Context): Promise { try { validateRequestMethod(ctx.request.method, "POST"); @@ -31,13 +24,15 @@ export async function onRequest(ctx: Context): Promise { throw new Error(`Invalid post parameters: ${JSON.stringify({ productId, txHash, chainId })}`); } - if (!networkRpcs[chainId]) { + if (!allowedChainIds.includes(chainId)) { throw new Error(`Unsupported chain: ${JSON.stringify({ chainId })}`); } + const fastestRpcUrl = await getFastestRpcUrl(chainId); + const provider = new JsonRpcProvider( { - url: networkRpcs[chainId][0], + url: fastestRpcUrl, skipFetchSetup: true, }, chainId diff --git a/shared/helpers.ts b/shared/helpers.ts index c22b2c50..76ab3609 100644 --- a/shared/helpers.ts +++ b/shared/helpers.ts @@ -1,4 +1,5 @@ import { ethers } from "ethers"; +import { RPCHandler } from "@ubiquity-dao/rpc-handler"; export function getGiftCardOrderId(rewardToAddress: string, signature: string) { const checksumAddress = ethers.utils.getAddress(rewardToAddress); @@ -13,3 +14,19 @@ export function getMessageToSign(transactionId: number) { transactionId: transactionId, }); } + +export async function getFastestRpcUrl(networkId: string | number) { + const config = { + networkId: networkId, + autoStorage: true, + cacheRefreshCycles: 5, + rpcTimeout: 1500, + networkName: null, + runtimeRpcs: null, + networkRpcs: null, + }; + + const handler = new RPCHandler(config); + const provider = await handler.getFastestRpcProvider(); + return provider.connection.url; +} From c4b1d6b48600185833f8c0e142aa4201ee31731d Mon Sep 17 00:00:00 2001 From: EresDev Date: Mon, 3 Jun 2024 17:00:48 +0500 Subject: [PATCH 074/174] fix: fork anvil network from fastest rpc --- cypress/scripts/anvil.ts | 146 ++++++++++++++++++++------------------- 1 file changed, 76 insertions(+), 70 deletions(-) diff --git a/cypress/scripts/anvil.ts b/cypress/scripts/anvil.ts index 54c532f8..f5553312 100644 --- a/cypress/scripts/anvil.ts +++ b/cypress/scripts/anvil.ts @@ -1,80 +1,86 @@ /* eslint-disable sonarjs/no-duplicate-string */ import { spawn } from "child_process"; +import { getFastestRpcUrl } from "../../shared/helpers"; -const url = "http://localhost:8545"; +async function forkNetwork() { + const fastestRpcUrl = await getFastestRpcUrl(100); + const url = "http://localhost:8545"; -const anvil = spawn("anvil", ["--chain-id", "31337", "--fork-url", "https://gnosis-pokt.nodies.app", "--host", "127.0.0.1", "--port", "8545"], { - stdio: "inherit", -}); + const anvil = spawn("anvil", ["--chain-id", "31337", "--fork-url", fastestRpcUrl, "--host", "127.0.0.1", "--port", "8545"], { + stdio: "inherit", + }); -setTimeout(() => { - console.log(`\n\n Anvil setup complete \n\n`); -}, 5000); + setTimeout(() => { + console.log(`\n\n Anvil setup complete \n\n`); + }, 5000); -// anvil --chain-id 31337 --fork-url https://eth.llamarpc.com --host 127.0.0.1 --port 8546 + // anvil --chain-id 31337 --fork-url https://eth.llamarpc.com --host 127.0.0.1 --port 8546 -spawn("cast", ["rpc", "--rpc-url", url, "anvil_impersonateAccount", "0xba12222222228d8ba445958a75a0704d566bf2c8"], { - stdio: "inherit", -}); -spawn( - "cast", - [ - "send", - "--rpc-url", - url, - "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d", - "--unlocked", - "--from", - "0xba12222222228d8ba445958a75a0704d566bf2c8", - "transfer(address,uint256)(bool)", - "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", - "337888400000000000000000", - ], - { - stdio: "inherit", - } -); -spawn( - "cast", - [ - "send", - "--rpc-url", - url, - "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d", - "--unlocked", - "--from", - "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "approve(address,uint256)(bool)", - "0x000000000022D473030F116dDEE9F6B43aC78BA3", - "9999999999999991111111119999999999999999", - ], - { + spawn("cast", ["rpc", "--rpc-url", url, "anvil_impersonateAccount", "0xba12222222228d8ba445958a75a0704d566bf2c8"], { stdio: "inherit", - } -); -spawn( - "cast", - [ - "send", - "--rpc-url", - url, - "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d", - "--unlocked", - "--from", - "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", - "approve(address,uint256)(bool)", - "0x000000000022D473030F116dDEE9F6B43aC78BA3", - "999999999999999111119999999999999999", - ], - { - stdio: "inherit", - } -); + }); + spawn( + "cast", + [ + "send", + "--rpc-url", + url, + "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d", + "--unlocked", + "--from", + "0xba12222222228d8ba445958a75a0704d566bf2c8", + "transfer(address,uint256)(bool)", + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "337888400000000000000000", + ], + { + stdio: "inherit", + } + ); + spawn( + "cast", + [ + "send", + "--rpc-url", + url, + "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d", + "--unlocked", + "--from", + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "approve(address,uint256)(bool)", + "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "9999999999999991111111119999999999999999", + ], + { + stdio: "inherit", + } + ); + spawn( + "cast", + [ + "send", + "--rpc-url", + url, + "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d", + "--unlocked", + "--from", + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "approve(address,uint256)(bool)", + "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "999999999999999111119999999999999999", + ], + { + stdio: "inherit", + } + ); + + anvil.on("close", (code) => { + console.log(`Anvil exited with code ${code}`); + }); -anvil.on("close", (code) => { - console.log(`Anvil exited with code ${code}`); -}); + anvil.on("error", (err) => { + console.error("Failed to start Anvil", err); + }); +} -anvil.on("error", (err) => { - console.error("Failed to start Anvil", err); -}); +forkNetwork().catch(console.error); From 76daaba643689a92351a8212a14c16b9cf9cb7da Mon Sep 17 00:00:00 2001 From: EresDev Date: Mon, 3 Jun 2024 23:16:12 +0500 Subject: [PATCH 075/174] fix: prevent nonce collision on fund Fixes "error code -32003: nonce too low" on yarn test:fund --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d45bbad7..d1443ac0 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "test:start": "yarn start", "test:run": "cypress run", "test:open": "cypress open", - "test:fund": "cast rpc --rpc-url http://127.0.0.1:8545 anvil_impersonateAccount 0xba12222222228d8ba445958a75a0704d566bf2c8 & cast send --rpc-url http://127.0.0.1:8545 0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d --unlocked --from 0xba12222222228d8ba445958a75a0704d566bf2c8 \"transfer(address,uint256)(bool)\" 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 337888400000000000000000 & cast send --rpc-url http://127.0.0.1:8545 0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d --unlocked --from 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 \"approve(address,uint256)(bool)\" 0x000000000022D473030F116dDEE9F6B43aC78BA3 9999999999999991111111119999999999999999 & cast send --rpc-url http://127.0.0.1:8545 0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d --unlocked --from 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 \"approve(address,uint256)(bool)\" 0x000000000022D473030F116dDEE9F6B43aC78BA3 999999999999999111119999999999999999 & cast send --rpc-url http://127.0.0.1:8545 0xfB9124a8Bd01c250942de7beeE1E50aB9Ce36493 --unlocked --from 0xba12222222228d8ba445958a75a0704d566bf2c8 --value 0.1ether" + "test:fund": "cast rpc --rpc-url http://127.0.0.1:8545 anvil_impersonateAccount 0xba12222222228d8ba445958a75a0704d566bf2c8 && cast send --rpc-url http://127.0.0.1:8545 0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d --unlocked --from 0xba12222222228d8ba445958a75a0704d566bf2c8 \"transfer(address,uint256)(bool)\" 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 337888400000000000000000 && cast send --rpc-url http://127.0.0.1:8545 0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d --unlocked --from 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 \"approve(address,uint256)(bool)\" 0x000000000022D473030F116dDEE9F6B43aC78BA3 9999999999999991111111119999999999999999 && cast send --rpc-url http://127.0.0.1:8545 0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d --unlocked --from 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 \"approve(address,uint256)(bool)\" 0x000000000022D473030F116dDEE9F6B43aC78BA3 999999999999999111119999999999999999 && cast send --rpc-url http://127.0.0.1:8545 0xfB9124a8Bd01c250942de7beeE1E50aB9Ce36493 --unlocked --from 0xba12222222228d8ba445958a75a0704d566bf2c8 --value 0.1ether" }, "keywords": [ "typescript", From 222bd0c9319c17537f05a1658a53bc781ed9f40b Mon Sep 17 00:00:00 2001 From: EresDev Date: Mon, 3 Jun 2024 23:18:17 +0500 Subject: [PATCH 076/174] refactor: remove unnecessary & error-prone code We have separate yarn test:fund command to do funding --- cypress/scripts/anvil.ts | 65 ---------------------------------------- 1 file changed, 65 deletions(-) diff --git a/cypress/scripts/anvil.ts b/cypress/scripts/anvil.ts index f5553312..a0272ca1 100644 --- a/cypress/scripts/anvil.ts +++ b/cypress/scripts/anvil.ts @@ -4,76 +4,11 @@ import { getFastestRpcUrl } from "../../shared/helpers"; async function forkNetwork() { const fastestRpcUrl = await getFastestRpcUrl(100); - const url = "http://localhost:8545"; const anvil = spawn("anvil", ["--chain-id", "31337", "--fork-url", fastestRpcUrl, "--host", "127.0.0.1", "--port", "8545"], { stdio: "inherit", }); - setTimeout(() => { - console.log(`\n\n Anvil setup complete \n\n`); - }, 5000); - - // anvil --chain-id 31337 --fork-url https://eth.llamarpc.com --host 127.0.0.1 --port 8546 - - spawn("cast", ["rpc", "--rpc-url", url, "anvil_impersonateAccount", "0xba12222222228d8ba445958a75a0704d566bf2c8"], { - stdio: "inherit", - }); - spawn( - "cast", - [ - "send", - "--rpc-url", - url, - "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d", - "--unlocked", - "--from", - "0xba12222222228d8ba445958a75a0704d566bf2c8", - "transfer(address,uint256)(bool)", - "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", - "337888400000000000000000", - ], - { - stdio: "inherit", - } - ); - spawn( - "cast", - [ - "send", - "--rpc-url", - url, - "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d", - "--unlocked", - "--from", - "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "approve(address,uint256)(bool)", - "0x000000000022D473030F116dDEE9F6B43aC78BA3", - "9999999999999991111111119999999999999999", - ], - { - stdio: "inherit", - } - ); - spawn( - "cast", - [ - "send", - "--rpc-url", - url, - "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d", - "--unlocked", - "--from", - "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", - "approve(address,uint256)(bool)", - "0x000000000022D473030F116dDEE9F6B43aC78BA3", - "999999999999999111119999999999999999", - ], - { - stdio: "inherit", - } - ); - anvil.on("close", (code) => { console.log(`Anvil exited with code ${code}`); }); From 68dfa237621935ed08906e4c2e2ca1f31465ee14 Mon Sep 17 00:00:00 2001 From: EresDev Date: Sat, 8 Jun 2024 05:15:04 +0500 Subject: [PATCH 077/174] fix: use new cloudflare deploy action --- .github/workflows/build.yml | 4 +++- .github/workflows/deploy.yml | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 525d591e..adf32dca 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -34,8 +34,10 @@ jobs: - name: Upload build artifact uses: actions/upload-artifact@v4 with: - name: static + name: full-stack-app path: | static functions shared + package.json + yarn.lock diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 09b6dad8..bbc464cc 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -17,13 +17,14 @@ jobs: with: repository: ${{ github.repository }} production_branch: ${{ github.event.repository.default_branch }} - build_artifact_name: "static" - output_directory: "static" + build_artifact_name: "full-stack-app" + output_directory: "full-stack-app" current_branch: ${{ github.event.workflow_run.head_branch }} cloudflare_account_id: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} cloudflare_api_token: ${{ secrets.CLOUDFLARE_API_TOKEN }} commit_sha: ${{ github.event.workflow_run.head_sha }} workflow_run_id: ${{ github.event.workflow_run.id }} + statics_directory: "static" - name: Check out repository uses: actions/checkout@v4 From d41e5100d41d914e07bc51e0ccd952305c6cf168 Mon Sep 17 00:00:00 2001 From: EresDev Date: Tue, 18 Jun 2024 00:44:51 +0500 Subject: [PATCH 078/174] fix: show purchased gift card without page reload Because the claim query var is not available anymore --- static/scripts/rewards/gift-cards/claim/claim-action.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/static/scripts/rewards/gift-cards/claim/claim-action.ts b/static/scripts/rewards/gift-cards/claim/claim-action.ts index 138483ee..0c778aed 100644 --- a/static/scripts/rewards/gift-cards/claim/claim-action.ts +++ b/static/scripts/rewards/gift-cards/claim/claim-action.ts @@ -9,6 +9,7 @@ import { getApiBaseUrl } from "../helpers"; import { isClaimableForAmount } from "../../../../../shared/pricing"; import { OrderRequestParams, GiftCard } from "../../../../../shared/types"; import { isErc20Permit } from "../../render-transaction/render-transaction"; +import { initClaimGiftCard } from "../list-gift-cards"; export function attachClaimAction(className: string, giftCards: GiftCard[], app: AppState) { const claimButtons: HTMLCollectionOf = document.getElementsByClassName(className); @@ -45,7 +46,7 @@ async function claimGiftCard(productId: number, app: AppState) { const tx = await transferFromPermit(permit2Contract, reward, "Processing... Please wait. Do not close this page."); if (!tx) return; - await waitForTransaction(tx, `Success. Refresh this page in a few minutes to get your card.`); + await waitForTransaction(tx, `Transaction confirmed. Loading your card now.`); const url = `${getApiBaseUrl()}/post-order`; @@ -68,7 +69,7 @@ async function claimGiftCard(productId: number, app: AppState) { } toaster.create("success", "Gift card claimed successfully."); - window.location.reload(); + await initClaimGiftCard(app); } else { toaster.create("error", "Connect your wallet to proceed."); } From 54d5bb976585c5c62b9aa3397ee6b04d0f4746c8 Mon Sep 17 00:00:00 2001 From: EresDev Date: Tue, 18 Jun 2024 01:37:48 +0500 Subject: [PATCH 079/174] fix: add 'blockscan' to cspell words list --- .cspell.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.cspell.json b/.cspell.json index 970c5b02..13316039 100644 --- a/.cspell.json +++ b/.cspell.json @@ -9,6 +9,7 @@ "Funder", "binkey", "binsec", + "blockscan", "chainlist", "cirip", "Claimability", From c7d44c99b1bf9afc6fd9658c71f187ac71360822 Mon Sep 17 00:00:00 2001 From: EresDev Date: Tue, 18 Jun 2024 02:09:55 +0500 Subject: [PATCH 080/174] fix: use correct env vars fixes broken test --- scripts/typescript/generate-erc20-permit-url.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/typescript/generate-erc20-permit-url.ts b/scripts/typescript/generate-erc20-permit-url.ts index eb12282f..f4a62912 100644 --- a/scripts/typescript/generate-erc20-permit-url.ts +++ b/scripts/typescript/generate-erc20-permit-url.ts @@ -19,7 +19,7 @@ async function createPermitTransferFromData(permitConfig: PermitConfig) { // get payment token decimals const { provider } = createProviderAndWallet(permitConfig); const erc20Abi = ["function decimals() public view returns (uint8)"]; - const tokenContract = new ethers.Contract(process.env.PAYMENT_TOKEN_ADDRESS, erc20Abi, provider); + const tokenContract = new ethers.Contract(permitConfig.PAYMENT_TOKEN_ADDRESS, erc20Abi, provider); const tokenDecimals = await tokenContract.decimals(); return { From 04950458832da91817427f1aba4c72710cf61b41 Mon Sep 17 00:00:00 2001 From: EresDev Date: Tue, 18 Jun 2024 02:13:44 +0500 Subject: [PATCH 081/174] fix: update test expected message --- cypress/e2e/claim-gift-card.cy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/e2e/claim-gift-card.cy.ts b/cypress/e2e/claim-gift-card.cy.ts index d4fef54c..dd17866c 100644 --- a/cypress/e2e/claim-gift-card.cy.ts +++ b/cypress/e2e/claim-gift-card.cy.ts @@ -68,7 +68,7 @@ describe("Gift Cards", () => { cy.intercept({ method: "GET", url: "/get-order**" }).as("getOrder"); cy.get(".gift-card .available").eq(0).parent().parent().find(".claim-gift-card-btn").invoke("click"); cy.get(".notifications", { timeout: 10000 }).should("contain.text", "Processing... Please wait. Do not close this page."); - cy.get(".notifications", { timeout: 10000 }).should("contain.text", "Success. Refresh this page in a few minutes to get your card."); + cy.get(".notifications", { timeout: 10000 }).should("contain.text", "Transaction confirmed. Loading your card now."); cy.wait("@getOrder", { timeout: 10000 }); cy.get("#gift-cards").should("exist").and("include.text", "Your gift card"); From c27597966c47ffee6ada7b7b47861941e2fe0e3b Mon Sep 17 00:00:00 2001 From: EresDev Date: Tue, 18 Jun 2024 02:33:15 +0500 Subject: [PATCH 082/174] fix: remove permit signer check Signer will be different partners addresses. No benefit in checking. --- functions/post-order.ts | 13 +------------ shared/constants.ts | 3 --- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/functions/post-order.ts b/functions/post-order.ts index 55c8af64..dd3f432c 100644 --- a/functions/post-order.ts +++ b/functions/post-order.ts @@ -1,7 +1,7 @@ import { TransactionReceipt, TransactionResponse } from "@ethersproject/providers"; import { JsonRpcProvider } from "@ethersproject/providers/lib/json-rpc-provider"; import { Interface, TransactionDescription } from "ethers/lib/utils"; -import { Tokens, chainIdToRewardTokenMap, giftCardTreasuryAddress, permit2Address, permitTokenOwner } from "../shared/constants"; +import { Tokens, chainIdToRewardTokenMap, giftCardTreasuryAddress, permit2Address } from "../shared/constants"; import { getFastestRpcUrl, getGiftCardOrderId } from "../shared/helpers"; import { getGiftCardValue, isClaimableForAmount } from "../shared/pricing"; import { ExchangeRate, GiftCard, OrderRequestParams } from "../shared/types"; @@ -236,15 +236,4 @@ function validateTransaction(txParsed: TransactionDescription, txReceipt: Transa ); return errorResponse; } - - if (txParsed.args.owner.toLowerCase() != permitTokenOwner.toLowerCase()) { - console.error( - "Given transaction hash has not a valid permit signer, and reward token owner.", - JSON.stringify({ - "txParsed.args.owner": txParsed.args.owner, - permitsTransferOwner: permitTokenOwner, - }) - ); - return errorResponse; - } } diff --git a/shared/constants.ts b/shared/constants.ts index 11e9d1a7..3eb6c46f 100644 --- a/shared/constants.ts +++ b/shared/constants.ts @@ -6,9 +6,6 @@ export enum Tokens { export const permit2Address = "0x000000000022D473030F116dDEE9F6B43aC78BA3"; export const giftCardTreasuryAddress = "0x3B47E3e4758E133acf72684727Dc10550C40e4B9"; -// Signer of the permit and owner of the tokens are same in SignatureTransfer -export const permitTokenOwner = "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"; - export const chainIdToRewardTokenMap = { 1: Tokens.DAI, 100: Tokens.WXDAI, From bf3b115032382af79153061adabb0d3e125e4035 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=A2=E3=83=AC=E3=82=AF=E3=82=B5=E3=83=B3=E3=83=80?= =?UTF-8?q?=E3=83=BC=2Eeth?= <4975670+0x4007@users.noreply.github.com> Date: Tue, 18 Jun 2024 18:29:23 +0900 Subject: [PATCH 083/174] chore: bump deploy --- yarn.lock | 1 - 1 file changed, 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index 71f5c945..3620e46f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,7 +1,6 @@ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 - "@actions/core@^1.10.1": version "1.10.1" resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.10.1.tgz#61108e7ac40acae95ee36da074fa5850ca4ced8a" From 8b8fead9e2dc3999b7fb6942251f759723b58758 Mon Sep 17 00:00:00 2001 From: EresDev Date: Tue, 18 Jun 2024 17:55:52 +0500 Subject: [PATCH 084/174] fix: trigger first deploy of beta branch --- .github/workflows/deploy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 1e62db8d..d25b8815 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -5,6 +5,7 @@ on: workflows: ["Build"] types: - completed + push: jobs: deploy-to-cloudflare: From a769fc66072c30a27d848faf974cfd1eb2f744e8 Mon Sep 17 00:00:00 2001 From: EresDev Date: Tue, 18 Jun 2024 18:03:37 +0500 Subject: [PATCH 085/174] fix: remove push deploy trigger This reverts commit 8b8fead9e2dc3999b7fb6942251f759723b58758. --- .github/workflows/deploy.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index d25b8815..1e62db8d 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -5,7 +5,6 @@ on: workflows: ["Build"] types: - completed - push: jobs: deploy-to-cloudflare: From e5fdf1dbee8bfa98edc6f969cd057846074f8cee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=A2=E3=83=AC=E3=82=AF=E3=82=B5=E3=83=B3=E3=83=80?= =?UTF-8?q?=E3=83=BC=2Eeth?= <4975670+0x4007@users.noreply.github.com> Date: Wed, 19 Jun 2024 18:01:54 +0900 Subject: [PATCH 086/174] chore: bump deploy --- yarn.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/yarn.lock b/yarn.lock index 3620e46f..71f5c945 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,6 +1,7 @@ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 + "@actions/core@^1.10.1": version "1.10.1" resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.10.1.tgz#61108e7ac40acae95ee36da074fa5850ca4ced8a" From f6b72782022da6d6be128cf264bdf544430fbb6f Mon Sep 17 00:00:00 2001 From: EresDev Date: Wed, 17 Jul 2024 23:24:26 +0500 Subject: [PATCH 087/174] fix: resolve footer conflict --- static/index.html | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/static/index.html b/static/index.html index e5e25a5b..1d2356e4 100644 --- a/static/index.html +++ b/static/index.html @@ -173,7 +173,6 @@
-<<<<<<< HEAD
-
- -======= -
From 743aac2cb635fe2319e60ac40472102a904f6072 Mon Sep 17 00:00:00 2001 From: EresDev Date: Wed, 17 Jul 2024 23:44:27 +0500 Subject: [PATCH 088/174] fix: change sandbox env var to string --- functions/helpers.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/functions/helpers.ts b/functions/helpers.ts index 02d0be48..a070c3e0 100644 --- a/functions/helpers.ts +++ b/functions/helpers.ts @@ -8,7 +8,7 @@ export const commonHeaders = { }; export interface Env { - USE_RELOADLY_SANDBOX: boolean; + USE_RELOADLY_SANDBOX: string; RELOADLY_API_CLIENT_ID: string; RELOADLY_API_CLIENT_SECRET: string; } @@ -21,7 +21,7 @@ export interface ReloadlyAuthResponse { } export async function getAccessToken(env: Env): Promise { - console.log("Using Reloadly Sandbox:", env.USE_RELOADLY_SANDBOX !== false); + console.log("Using Reloadly Sandbox:", env.USE_RELOADLY_SANDBOX !== "false"); const url = "https://auth.reloadly.com/oauth/token"; const options = { @@ -31,7 +31,7 @@ export async function getAccessToken(env: Env): Promise { client_id: env.RELOADLY_API_CLIENT_ID, client_secret: env.RELOADLY_API_CLIENT_SECRET, grant_type: "client_credentials", - audience: env.USE_RELOADLY_SANDBOX === false ? "https://giftcards.reloadly.com" : "https://giftcards-sandbox.reloadly.com", + audience: env.USE_RELOADLY_SANDBOX === "false" ? "https://giftcards.reloadly.com" : "https://giftcards-sandbox.reloadly.com", }), }; @@ -40,7 +40,7 @@ export async function getAccessToken(env: Env): Promise { const successResponse = (await res.json()) as ReloadlyAuthResponse; return { token: successResponse.access_token, - isSandbox: env.USE_RELOADLY_SANDBOX !== false, + isSandbox: env.USE_RELOADLY_SANDBOX !== "false", }; } throw `Getting access token failed: ${JSON.stringify(await res.json())}`; From 123d36ade426f38065453939ff6b56f2ba3b8c45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=A2=E3=83=AC=E3=82=AF=E3=82=B5=E3=83=B3=E3=83=80?= =?UTF-8?q?=E3=83=BC=2Eeth?= Date: Fri, 19 Jul 2024 14:29:15 +0900 Subject: [PATCH 089/174] chore: sync branch to template --- .cspell.json | 32 +- .eslintrc | 90 +- .github/knip.ts | 14 + .github/workflows/build.yml | 2 +- .github/workflows/cypress-testing.yml | 25 +- .github/workflows/deploy.yml | 4 +- .github/workflows/knip-reporter.yml | 38 + .github/workflows/knip.yml | 38 + .github/workflows/release-please.yml | 26 + .gitignore | 5 +- build/index.ts | 4 - cypress/e2e/main.cy.ts | 12 + functions/post-order.ts | 2 +- package.json | 22 +- .../typescript/generate-erc20-permit-url.ts | 6 +- .../typescript/generate-erc721-permit-url.ts | 2 +- scripts/typescript/generate-permit2-url.ts | 8 +- static/index.html | 10 +- .../abis/{erc20Abi.ts => erc20-abi.ts} | 0 static/scripts/rewards/abis/index.ts | 4 +- .../abis/{permit2Abi.ts => permit2-abi.ts} | 0 ...ttonController.ts => button-controller.ts} | 0 static/scripts/rewards/cirip/ens-lookup.ts | 4 +- .../rewards/cirip/query-reverse-ens.ts | 4 +- static/scripts/rewards/init.ts | 2 +- .../render-transaction/render-ens-name.ts | 8 +- .../render-transaction/render-token-symbol.ts | 2 +- .../render-transaction/render-transaction.ts | 10 +- static/scripts/rewards/toaster.ts | 2 +- static/styles/rewards/claim-table.css | 2 +- static/styles/rewards/light-mode.css | 2 +- static/styles/rewards/pay.css | 46 +- tsconfig.json | 14 +- yarn.lock | 2381 +++++++++++------ 34 files changed, 1915 insertions(+), 906 deletions(-) create mode 100644 .github/knip.ts create mode 100644 .github/workflows/knip-reporter.yml create mode 100644 .github/workflows/knip.yml create mode 100644 .github/workflows/release-please.yml delete mode 100644 build/index.ts create mode 100644 cypress/e2e/main.cy.ts rename static/scripts/rewards/abis/{erc20Abi.ts => erc20-abi.ts} (100%) rename static/scripts/rewards/abis/{permit2Abi.ts => permit2-abi.ts} (100%) rename static/scripts/rewards/{ButtonController.ts => button-controller.ts} (100%) diff --git a/.cspell.json b/.cspell.json index cf5b75d2..3e83029f 100644 --- a/.cspell.json +++ b/.cspell.json @@ -1,13 +1,16 @@ { "$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json", "version": "0.2", - "ignorePaths": ["**/*.json", "**/*.css", "node_modules", "**/*.log", "/lib"], + "ignorePaths": [ + "**/*.json", + "**/*.css", + "node_modules", + "**/*.log", + "/lib" + ], "useGitignore": true, "language": "en", "words": [ - "blockscan", - "funder", - "Funder", "binkey", "binsec", "blockscan", @@ -20,13 +23,17 @@ "fract", "giftcards", "gnosischain", + "funder", + "Funder", "gnosisscan", "godb", "greyscale", "IERC", "keccak", "keypair", + "Knip", "libsodium", + "mswjs", "Numberish", "outdir", "pageable", @@ -46,7 +53,18 @@ "XDAI", "xmark" ], - "dictionaries": ["typescript", "node", "software-terms", "html"], - "import": ["@cspell/dict-typescript/cspell-ext.json", "@cspell/dict-node/cspell-ext.json", "@cspell/dict-software-terms"], - "ignoreRegExpList": ["[0-9a-fA-F]{6}"] + "dictionaries": [ + "typescript", + "node", + "software-terms", + "html" + ], + "import": [ + "@cspell/dict-typescript/cspell-ext.json", + "@cspell/dict-node/cspell-ext.json", + "@cspell/dict-software-terms" + ], + "ignoreRegExpList": [ + "[0-9a-fA-F]{6}" + ] } diff --git a/.eslintrc b/.eslintrc index 5236ba3d..aa9629fb 100644 --- a/.eslintrc +++ b/.eslintrc @@ -2,32 +2,24 @@ "root": true, "parser": "@typescript-eslint/parser", "parserOptions": { - "project": ["./tsconfig.json"], + "project": "./tsconfig.json" }, - "plugins": ["@typescript-eslint", "sonarjs"], + "plugins": ["@typescript-eslint", "sonarjs", "filename-rules"], "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:sonarjs/recommended"], - "ignorePatterns": ["**/*.js"], + "ignorePatterns": ["**/*.js", ".github/knip.ts"], "rules": { - "prefer-arrow-callback": [ - "warn", - { - "allowNamedFunctions": true, - }, - ], - "func-style": [ - "warn", - "declaration", - { - "allowArrowFunctions": false, - }, - ], + "filename-rules/match": [2, "/^(e2e\\.ts$|.*/e2e\\.ts$|[a-z0-9]+(?:[-._a-z0-9]+)*\\.ts|\\.[a-z0-9]+)$/"], + "prefer-arrow-callback": ["warn", { "allowNamedFunctions": true }], + "func-style": ["warn", "declaration", { "allowArrowFunctions": false }], "@typescript-eslint/no-floating-promises": "error", "@typescript-eslint/no-non-null-assertion": "error", "constructor-super": "error", "no-invalid-this": "off", - "@typescript-eslint/no-invalid-this": ["error"], + "@typescript-eslint/no-invalid-this": ["error", { "capIsConstructor": false }], "no-restricted-syntax": ["error", "ForInStatement"], "use-isnan": "error", + "no-unneeded-ternary": "error", + "no-nested-ternary": "error", "@typescript-eslint/no-unused-vars": [ "error", { @@ -49,60 +41,16 @@ "sonarjs/no-identical-expressions": "error", "@typescript-eslint/naming-convention": [ "error", - { - "selector": "interface", - "format": ["PascalCase"], - "custom": { - "regex": "^I[A-Z]", - "match": false, - }, - }, - { - "selector": "memberLike", - "modifiers": ["private"], - "format": ["camelCase"], - "leadingUnderscore": "require", - }, - { - "selector": "typeLike", - "format": ["PascalCase"], - }, - { - "selector": "typeParameter", - "format": ["PascalCase"], - "prefix": ["T"], - }, - { - "selector": "variable", - "format": ["camelCase", "UPPER_CASE"], - "leadingUnderscore": "allow", - "trailingUnderscore": "allow", - }, - { - "selector": "variable", - "format": ["camelCase"], - "leadingUnderscore": "allow", - "trailingUnderscore": "allow", - }, - { - "selector": "variable", - "modifiers": ["destructured"], - "format": null, - }, - { - "selector": "variable", - "types": ["boolean"], - "format": ["PascalCase"], - "prefix": ["is", "should", "has", "can", "did", "will", "does"], - }, - { - "selector": "variableLike", - "format": ["camelCase"], - }, - { - "selector": ["function", "variable"], - "format": ["camelCase"], - }, + { "selector": "interface", "format": ["StrictPascalCase"], "custom": { "regex": "^I[A-Z]", "match": false } }, + { "selector": "memberLike", "modifiers": ["private"], "format": ["strictCamelCase"], "leadingUnderscore": "require" }, + { "selector": "typeLike", "format": ["StrictPascalCase"] }, + { "selector": "typeParameter", "format": ["StrictPascalCase"], "prefix": ["T"] }, + { "selector": "variable", "format": ["strictCamelCase", "UPPER_CASE"], "leadingUnderscore": "allow", "trailingUnderscore": "allow" }, + { "selector": "variable", "format": ["strictCamelCase"], "leadingUnderscore": "allow", "trailingUnderscore": "allow" }, + { "selector": "variable", "modifiers": ["destructured"], "format": null }, + { "selector": "variable", "types": ["boolean"], "format": ["StrictPascalCase"], "prefix": ["is", "should", "has", "can", "did", "will", "does"] }, + { "selector": "variableLike", "format": ["strictCamelCase"] }, + { "selector": ["function", "variable"], "format": ["strictCamelCase"] }, ], }, } diff --git a/.github/knip.ts b/.github/knip.ts new file mode 100644 index 00000000..05734a2c --- /dev/null +++ b/.github/knip.ts @@ -0,0 +1,14 @@ +import type { KnipConfig } from "knip"; + +const config: KnipConfig = { + entry: ["build/esbuild-build.ts", "static/scripts/rewards/init.ts"], + project: ["src/**/*.ts", "static/scripts/**/*.ts"], + ignore: ["src/types/config.ts", "**/__mocks__/**", "**/__fixtures__/**", "lib/**/*"], + ignoreExportsUsedInFile: true, + // eslint can also be safely ignored as per the docs: https://knip.dev/guides/handling-issues#eslint--jest + ignoreDependencies: ["eslint-config-prettier", "eslint-plugin-prettier"], + eslint: true, + ignoreBinaries: ["forge"], +}; + +export default config; diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index adf32dca..44a3ac15 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -34,7 +34,7 @@ jobs: - name: Upload build artifact uses: actions/upload-artifact@v4 with: - name: full-stack-app + name: static path: | static functions diff --git a/.github/workflows/cypress-testing.yml b/.github/workflows/cypress-testing.yml index 56f77824..2dfa3d2d 100644 --- a/.github/workflows/cypress-testing.yml +++ b/.github/workflows/cypress-testing.yml @@ -1,21 +1,13 @@ -name: test - +name: Run Cypress testing suite on: - push: - branches: - - main - - development - pull_request: - branches: - - main - - development - -env: - FOUNDRY_PROFILE: ci + workflow_dispatch: + workflow_run: + workflows: ["Build"] + types: + - completed jobs: - tests: - name: Cypress tests + cypress-run: runs-on: ubuntu-latest steps: - uses: actions/setup-node@v4 @@ -68,7 +60,8 @@ jobs: PAYMENT_TOKEN_ADDRESS: "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d" RPC_PROVIDER_URL: "http://localhost:8545" UBIQUIBOT_PRIVATE_KEY: "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d" - + CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - uses: actions/upload-artifact@v4 if: failure() with: diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 1e62db8d..bd7ee1e7 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -17,8 +17,8 @@ jobs: with: repository: ${{ github.repository }} production_branch: ${{ github.event.repository.default_branch }} - build_artifact_name: "full-stack-app" - output_directory: "full-stack-app" + build_artifact_name: "static" + output_directory: "static" current_branch: ${{ github.event.workflow_run.head_branch }} cloudflare_account_id: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} cloudflare_api_token: ${{ secrets.CLOUDFLARE_API_TOKEN }} diff --git a/.github/workflows/knip-reporter.yml b/.github/workflows/knip-reporter.yml new file mode 100644 index 00000000..282c9a88 --- /dev/null +++ b/.github/workflows/knip-reporter.yml @@ -0,0 +1,38 @@ +name: Knip-reporter + +on: + workflow_run: + workflows: ["Knip"] + types: + - completed + +jobs: + knip-reporter: + runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.conclusion != 'success' }} + steps: + - uses: actions/download-artifact@v4 + with: + name: knip-results + run-id: ${{ github.event.workflow_run.id }} + github-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Read pr number + id: pr-number + uses: juliangruber/read-file-action@v1 + with: + path: ./pr-number.txt + trim: true + + - name: Report knip results to pull request + uses: gitcoindev/knip-reporter@main + with: + verbose: true + comment_id: ${{ github.workflow }}-reporter + command_script_name: knip-ci + annotations: true + ignore_results: false + json_input: true + json_input_file_name: knip-results.json + pull_request_number: ${{ steps.pr-number.outputs.content }} + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/knip.yml b/.github/workflows/knip.yml new file mode 100644 index 00000000..809976bd --- /dev/null +++ b/.github/workflows/knip.yml @@ -0,0 +1,38 @@ +name: Knip + +on: + pull_request: + +jobs: + run-knip: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + # needed to use yarn v4 + - name: Enable corepack + run: corepack enable + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 20.10.0 + + - name: Install toolchain + run: yarn install + + - name: Store PR number + run: echo ${{ github.event.number }} > pr-number.txt + + - name: Run Knip + run: yarn knip || yarn knip --reporter json > knip-results.json + + - name: Upload knip result + if: failure() + uses: actions/upload-artifact@v4 + with: + name: knip-results + path: | + knip-results.json + pr-number.txt diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml new file mode 100644 index 00000000..5c626001 --- /dev/null +++ b/.github/workflows/release-please.yml @@ -0,0 +1,26 @@ +name: release-please + +on: + workflow_dispatch: + push: + branches: + - main + +permissions: + contents: write + pull-requests: write + +jobs: + release-please: + runs-on: ubuntu-latest + steps: + - uses: google-github-actions/release-please-action@v3 + with: + release-type: node + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: "20.10.0" + registry-url: https://registry.npmjs.org/ + - run: | + yarn install --immutable --immutable-cache --check-cache diff --git a/.gitignore b/.gitignore index 7f1b1d6f..1a9c4e92 100644 --- a/.gitignore +++ b/.gitignore @@ -10,8 +10,11 @@ commit.txt # yarn2 .pnp.cjs .pnp.loader.mjs +.env static/dist cypress/screenshots cypress/videos -.wrangler \ No newline at end of file +.wrangler +coverage +junit.xml diff --git a/build/index.ts b/build/index.ts deleted file mode 100644 index e1cf0b87..00000000 --- a/build/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import * as dotenv from "dotenv"; -// load environment variables (if you have them) -dotenv.config(); -console.log("Welcome to ts-template"); diff --git a/cypress/e2e/main.cy.ts b/cypress/e2e/main.cy.ts new file mode 100644 index 00000000..81df8c56 --- /dev/null +++ b/cypress/e2e/main.cy.ts @@ -0,0 +1,12 @@ +describe("Homepage tests", () => { + it("Console is cleared of errors and warnings", () => { + cy.visit("/", { + onBeforeLoad(win) { + cy.stub(win.console, "error").as("consoleError"); + }, + }); + cy.get("@consoleError").should("not.be.called"); + cy.get("body").should("exist"); + cy.get("h1").should("exist"); + }); +}); diff --git a/functions/post-order.ts b/functions/post-order.ts index dd3f432c..df7bd97d 100644 --- a/functions/post-order.ts +++ b/functions/post-order.ts @@ -5,7 +5,7 @@ import { Tokens, chainIdToRewardTokenMap, giftCardTreasuryAddress, permit2Addres import { getFastestRpcUrl, getGiftCardOrderId } from "../shared/helpers"; import { getGiftCardValue, isClaimableForAmount } from "../shared/pricing"; import { ExchangeRate, GiftCard, OrderRequestParams } from "../shared/types"; -import { permit2Abi } from "../static/scripts/rewards/abis/permit2Abi"; +import { permit2Abi } from "../static/scripts/rewards/abis/permit2-abi"; import { getTransactionFromOrderId } from "./get-order"; import { allowedChainIds, commonHeaders, getAccessToken, getBaseUrl } from "./helpers"; import { AccessToken, Context, ReloadlyFailureResponse, ReloadlyOrderResponse } from "./types"; diff --git a/package.json b/package.json index 757f4fb8..e558cef4 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,11 @@ "test:start": "yarn start", "test:run": "cypress run", "test:open": "cypress open", - "test:fund": "tsx cypress/scripts/funding.ts" + "test:fund": "tsx cypress/scripts/funding.ts", + "knip": "knip --config .github/knip.ts", + "knip-ci": "knip --no-exit-code --reporter json --config .github/knip.ts", + "cy:open": "cypress open", + "cy:run": "cypress run" }, "keywords": [ "typescript", @@ -39,10 +43,9 @@ ], "dependencies": { "@ethersproject/providers": "^5.7.2", - "@supabase/supabase-js": "^2.39.8", - "@ubiquibot/permit-generation": "1.2.2", + "@supabase/supabase-js": "^2.44.4", + "@ubiquibot/permit-generation": "^1.4.1", "@ubiquity-dao/rpc-handler": "^1.1.0", - "@uniswap/permit2-sdk": "^1.2.0", "dotenv": "^16.4.4", "ethers": "^5.7.2", "npm-run-all": "^4.1.5" @@ -58,10 +61,13 @@ "@types/node": "^20.11.19", "@typescript-eslint/eslint-plugin": "^7.0.1", "@typescript-eslint/parser": "^7.0.1", - "cspell": "^8.3.2", - "cypress": "13.7.0", - "esbuild": "^0.20.0", + "cspell": "^8.4.0", + "cypress": "^13.7.0", + "esbuild": "^0.20.1", "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-filename-rules": "^1.3.1", + "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-sonarjs": "^0.24.0", "husky": "^9.0.11", "knip": "^5.0.1", @@ -88,4 +94,4 @@ "@commitlint/config-conventional" ] } -} \ No newline at end of file +} diff --git a/scripts/typescript/generate-erc20-permit-url.ts b/scripts/typescript/generate-erc20-permit-url.ts index f4a62912..c1847747 100644 --- a/scripts/typescript/generate-erc20-permit-url.ts +++ b/scripts/typescript/generate-erc20-permit-url.ts @@ -63,7 +63,7 @@ function createTxData(myWallet: ethers.Wallet, permitTransferFromData: PermitTra }; } -export async function generateERC20Permit(permitConfig: PermitConfig) { +export async function generateErc20Permit(permitConfig: PermitConfig) { const { myWallet } = createProviderAndWallet(permitConfig); const permitTransferFromData = await createPermitTransferFromData(permitConfig); @@ -79,8 +79,8 @@ export async function generateERC20Permit(permitConfig: PermitConfig) { return `${permitConfig.FRONTEND_URL}?claim=${base64encodedTxData}`; } -export async function logERC20Permit(permitConfig: PermitConfig) { - const erc20Permit = await generateERC20Permit(permitConfig); +export async function logErc20Permit(permitConfig: PermitConfig) { + const erc20Permit = await generateErc20Permit(permitConfig); log.ok("ERC20 Local URL:"); log.info(erc20Permit); } diff --git a/scripts/typescript/generate-erc721-permit-url.ts b/scripts/typescript/generate-erc721-permit-url.ts index e8db332d..67a98658 100644 --- a/scripts/typescript/generate-erc721-permit-url.ts +++ b/scripts/typescript/generate-erc721-permit-url.ts @@ -118,7 +118,7 @@ function createTxData(myWallet: ethers.Wallet, erc721TransferFromData: PermitTra }; } -export async function generateERC721Permit() { +export async function generateErc721Permit() { const { myWallet } = createProviderAndWallet(); const GITHUB_ORGANIZATION_NAME = "ubiquity"; diff --git a/scripts/typescript/generate-permit2-url.ts b/scripts/typescript/generate-permit2-url.ts index d6336a01..6ac814b0 100644 --- a/scripts/typescript/generate-permit2-url.ts +++ b/scripts/typescript/generate-permit2-url.ts @@ -1,9 +1,9 @@ -import { logERC20Permit } from "./generate-erc20-permit-url"; -import { generateERC721Permit } from "./generate-erc721-permit-url"; +import { logErc20Permit } from "./generate-erc20-permit-url"; +import { generateErc721Permit } from "./generate-erc721-permit-url"; import { verifyEnvironmentVariables } from "./utils"; (async () => { verifyEnvironmentVariables(); - generateERC721Permit().catch(console.error); - logERC20Permit(process.env).catch(console.error); + generateErc721Permit().catch(console.error); + logErc20Permit(process.env).catch(console.error); })().catch(console.error); diff --git a/static/index.html b/static/index.html index 1d2356e4..5c936057 100644 --- a/static/index.html +++ b/static/index.html @@ -192,15 +192,15 @@

Disclaimer

- -
diff --git a/static/scripts/rewards/abis/erc20Abi.ts b/static/scripts/rewards/abis/erc20-abi.ts similarity index 100% rename from static/scripts/rewards/abis/erc20Abi.ts rename to static/scripts/rewards/abis/erc20-abi.ts diff --git a/static/scripts/rewards/abis/index.ts b/static/scripts/rewards/abis/index.ts index de30ac1b..4ea72ebe 100644 --- a/static/scripts/rewards/abis/index.ts +++ b/static/scripts/rewards/abis/index.ts @@ -1,2 +1,2 @@ -export * from "./erc20Abi"; -export * from "./permit2Abi"; +export * from "./erc20-abi"; +export * from "./permit2-abi"; diff --git a/static/scripts/rewards/abis/permit2Abi.ts b/static/scripts/rewards/abis/permit2-abi.ts similarity index 100% rename from static/scripts/rewards/abis/permit2Abi.ts rename to static/scripts/rewards/abis/permit2-abi.ts diff --git a/static/scripts/rewards/ButtonController.ts b/static/scripts/rewards/button-controller.ts similarity index 100% rename from static/scripts/rewards/ButtonController.ts rename to static/scripts/rewards/button-controller.ts diff --git a/static/scripts/rewards/cirip/ens-lookup.ts b/static/scripts/rewards/cirip/ens-lookup.ts index 31f53eb4..e0fece59 100644 --- a/static/scripts/rewards/cirip/ens-lookup.ts +++ b/static/scripts/rewards/cirip/ens-lookup.ts @@ -9,7 +9,7 @@ export const reverseEnsInterface = new ethers.utils.Interface(abi); // event.respondWith(handleRequest(event.request).catch(err => new Response(err.stack, { status: 500 }))); // }); -export async function ensLookup(addr: string, networkID: number) { +export async function ensLookup(addr: string, networkId: number) { const _address = "/".concat(addr); // quick adapter // try { @@ -23,7 +23,7 @@ export async function ensLookup(addr: string, networkID: number) { let reverseRecord = null as null | string; // let response = ""; try { - reverseRecord = await queryReverseEns(address, networkID); + reverseRecord = await queryReverseEns(address, networkId); const responseParsed = JSON.parse(reverseRecord).result; const _reverseRecord = ethers.utils.defaultAbiCoder.decode([ethers.utils.ParamType.from("string[]")], responseParsed); reverseRecord = _reverseRecord[0][0]; diff --git a/static/scripts/rewards/cirip/query-reverse-ens.ts b/static/scripts/rewards/cirip/query-reverse-ens.ts index 0dc09b22..b56c1256 100644 --- a/static/scripts/rewards/cirip/query-reverse-ens.ts +++ b/static/scripts/rewards/cirip/query-reverse-ens.ts @@ -2,13 +2,13 @@ import { app } from "../app-state"; import { useRpcHandler } from "../web3/use-rpc-handler"; import { reverseEnsInterface } from "./ens-lookup"; -export async function queryReverseEns(address: string, networkID: number) { +export async function queryReverseEns(address: string, networkId: number) { // Try to get the ENS name from localStorage const cachedEnsName = localStorage.getItem(address); const endpoint = app.provider?.connection.url || (await useRpcHandler(app)).connection.url; if (!endpoint) { - console.error("ENS lookup failed: No endpoint found for network ID", networkID); + console.error("ENS lookup failed: No endpoint found for network ID", networkId); if (cachedEnsName) return cachedEnsName; } diff --git a/static/scripts/rewards/init.ts b/static/scripts/rewards/init.ts index be53ff41..37952c0c 100644 --- a/static/scripts/rewards/init.ts +++ b/static/scripts/rewards/init.ts @@ -9,7 +9,7 @@ grid(document.getElementById("grid") as HTMLElement, gridLoadedCallback); // @DE readClaimDataFromUrl(app).catch(console.error); // @DEV: read claim data from URL const footer = document.querySelector(".footer") as Element; -footer.classList.add("animate"); +footer.classList.add("ready"); // cSpell:ignore llback function gridLoadedCallback() { diff --git a/static/scripts/rewards/render-transaction/render-ens-name.ts b/static/scripts/rewards/render-transaction/render-ens-name.ts index cbdf2722..810df96d 100644 --- a/static/scripts/rewards/render-transaction/render-ens-name.ts +++ b/static/scripts/rewards/render-transaction/render-ens-name.ts @@ -7,20 +7,20 @@ type EnsParams = address: string; tokenAddress: string; tokenView: true; - networkID: number; + networkId: number; } | { element: Element; address: string; tokenAddress?: undefined; tokenView?: false; - networkID: number; + networkId: number; }; -export async function renderEnsName({ element, address, tokenAddress, tokenView, networkID }: EnsParams): Promise { +export async function renderEnsName({ element, address, tokenAddress, tokenView, networkId }: EnsParams): Promise { let href: string = ""; try { - const resolved = await ensLookup(address, networkID); + const resolved = await ensLookup(address, networkId); let ensName: undefined | string; if (resolved.reverseRecord) { ensName = resolved.reverseRecord; diff --git a/static/scripts/rewards/render-transaction/render-token-symbol.ts b/static/scripts/rewards/render-transaction/render-token-symbol.ts index 6f12e106..f4ab43c7 100644 --- a/static/scripts/rewards/render-transaction/render-token-symbol.ts +++ b/static/scripts/rewards/render-transaction/render-token-symbol.ts @@ -1,5 +1,5 @@ import { BigNumberish, ethers, utils } from "ethers"; -import { erc20Abi } from "../abis/erc20Abi"; +import { erc20Abi } from "../abis/erc20-abi"; import { app } from "../app-state"; export async function renderTokenSymbol({ table, diff --git a/static/scripts/rewards/render-transaction/render-transaction.ts b/static/scripts/rewards/render-transaction/render-transaction.ts index 2d778a64..3ccd4da7 100644 --- a/static/scripts/rewards/render-transaction/render-transaction.ts +++ b/static/scripts/rewards/render-transaction/render-transaction.ts @@ -1,5 +1,6 @@ -import { app } from "../app-state"; +import { ERC20Permit, Permit, TokenType } from "@ubiquibot/permit-generation/types"; import { networkExplorers } from "@ubiquity-dao/rpc-handler"; +import { app } from "../app-state"; import { buttonController, getMakeClaimButton, viewClaimButton } from "../toaster"; import { checkRenderInvalidatePermitAdminControl, claimErc20PermitHandlerWrapper, fetchTreasury } from "../web3/erc20-permit"; import { claimErc721PermitHandler } from "../web3/erc721-permit"; @@ -7,7 +8,6 @@ import { verifyCurrentNetwork } from "../web3/verify-current-network"; import { insertErc20PermitTableData, insertErc721PermitTableData } from "./insert-table-data"; import { renderEnsName } from "./render-ens-name"; import { renderNftSymbol, renderTokenSymbol } from "./render-token-symbol"; -import { ERC20Permit, Permit, TokenType } from "@ubiquibot/permit-generation/types"; const carousel = document.getElementById("carousel") as Element; const table = document.querySelector(`table`) as HTMLTableElement; @@ -15,7 +15,7 @@ type Success = boolean; export async function renderTransaction(): Promise { if (app.claims && app.claims.length > 1) { - carousel.className = "flex"; + carousel.className = "ready"; const rewardsCount = document.getElementById("rewardsCount") as Element; rewardsCount.innerHTML = `${app.rewardIndex + 1}/${app.claims.length} reward`; } @@ -45,7 +45,7 @@ export async function renderTransaction(): Promise { }).catch(console.error); const toElement = document.getElementById(`rewardRecipient`) as Element; - renderEnsName({ element: toElement, address: app.reward.beneficiary, networkID: app.networkId }).catch(console.error); + renderEnsName({ element: toElement, address: app.reward.beneficiary, networkId: app.networkId }).catch(console.error); if (app.provider) { checkRenderInvalidatePermitAdminControl(app).catch(console.error); @@ -73,7 +73,7 @@ export async function renderTransaction(): Promise { }).catch(console.error); const toElement = document.getElementById(`rewardRecipient`) as Element; - renderEnsName({ element: toElement, address: app.reward.beneficiary, networkID: app.networkId }).catch(console.error); + renderEnsName({ element: toElement, address: app.reward.beneficiary, networkId: app.networkId }).catch(console.error); getMakeClaimButton().addEventListener("click", claimErc721PermitHandler(app.reward)); } diff --git a/static/scripts/rewards/toaster.ts b/static/scripts/rewards/toaster.ts index 3e455593..84089e42 100644 --- a/static/scripts/rewards/toaster.ts +++ b/static/scripts/rewards/toaster.ts @@ -1,4 +1,4 @@ -import { ButtonController } from "./ButtonController"; +import { ButtonController } from "./button-controller"; export const toaster = { create: createToast, diff --git a/static/styles/rewards/claim-table.css b/static/styles/rewards/claim-table.css index 3f22c00b..892120ce 100644 --- a/static/styles/rewards/claim-table.css +++ b/static/styles/rewards/claim-table.css @@ -64,7 +64,7 @@ table hr { height: 1px; border: none; } -table svg path { +svg path { fill: currentColor; } table td div { diff --git a/static/styles/rewards/light-mode.css b/static/styles/rewards/light-mode.css index eeda17de..5ceb56a8 100644 --- a/static/styles/rewards/light-mode.css +++ b/static/styles/rewards/light-mode.css @@ -16,7 +16,7 @@ #rewardAmount > a { color: #000; } - table svg path { + svg path { fill: #000; } #logo-icon > svg { diff --git a/static/styles/rewards/pay.css b/static/styles/rewards/pay.css index a53cfa1d..ed0ee90f 100644 --- a/static/styles/rewards/pay.css +++ b/static/styles/rewards/pay.css @@ -103,7 +103,7 @@ a { /* font-weight: 400; */ } -div#build { +div.footer > div { /* bottom: 48px; */ padding: 48px 0; text-align: center; @@ -113,15 +113,17 @@ div#build { /* font-weight: 100; */ /* width: 48px; */ margin: auto; + display: inline-block; + vertical-align: middle; } -div#build > a { +footer a { opacity: 0.25; font-size: 12px; color: #fff; } -div#build > a:hover { +footer a:hover { opacity: 1; } header a #logo { @@ -146,18 +148,21 @@ footer { /* height: 108px; */ /* width: 100%; */ /* padding-bottom: env(safe-area-inset-bottom); */ + width: 100%; + position: relative; } #carousel { flex-direction: row; align-items: center; align-self: center; - margin: 12px auto; + /* margin: 12px auto; */ /* opacity: 0.5; */ /* display: none; */ opacity: 0; transition: opacity 1s; - padding-top: 80px; + /* padding-top: 80px; */ + text-align: center; } #carousel > div { color: #808080; @@ -166,8 +171,7 @@ footer { #carousel > div:hover { color: #fff; } -#carousel.flex { - /* display: flex; */ +#carousel.ready { opacity: 1; } #carousel > #rewardsCount { @@ -196,28 +200,38 @@ footer { border-left-color: transparent; } -.faq-icon { - position: fixed; - right: 20px; - cursor: pointer; +#faq-icon > a { + /* position: fixed; */ + /* right: 20px; */ + /* cursor: pointer; */ } -a.faq-icon > div { +#faq-icon > a > div { font-size: 12px; color: #fff; } -a.faq-icon > div:hover { +#faq-icon > a > div:hover { opacity: 1; } .footer { - display: flex; - align-items: center; + /* display: flex; */ + /* align-items: center; */ opacity: 0; transition: opacity 1s; + text-align: center; } -.footer.animate { +.footer.ready { opacity: 1; } + +#faq-icon { + position: absolute; + /* right: 0; */ + /* height: 24px; */ + /* display: inline-block; */ + padding: 42px; + right: 0; +} diff --git a/tsconfig.json b/tsconfig.json index faf7a889..5f963f32 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,17 @@ { - "include": ["src", "static", "functions", "build", "scripts/typescript", "globals.d.ts", "cypress/**/*.ts", "cypress.config.ts"], + "include": [ + "src", + "static", + "functions", + "build", + "scripts/typescript", + "globals.d.ts", + "cypress/**/*.ts", + "cypress.config.ts", + "src/**/*.ts", + "tests/**/*.ts", + ".github/**/*.ts" + ], "compilerOptions": { /* Visit https://aka.ms/tsconfig to read more about this file */ /* Projects */ diff --git a/yarn.lock b/yarn.lock index 857371c3..3816e840 100644 --- a/yarn.lock +++ b/yarn.lock @@ -34,19 +34,19 @@ integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== "@babel/code-frame@^7.0.0": - 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== + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== dependencies: - "@babel/highlight" "^7.24.7" - picocolors "^1.0.0" + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" "@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/highlight@^7.24.7": +"@babel/highlight@^7.23.4": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== @@ -115,9 +115,9 @@ yargs "^17.0.0" "@commitlint/config-conventional@^18.6.2": - version "18.6.3" - resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-18.6.3.tgz#1b2740dbe325d76e05924c46bc1504340b701ca1" - integrity sha512-8ZrRHqF6je+TRaFoJVwszwnOXb/VeYrPmTwPhf0WxpzpGTcYy1p0SPyZ2eRn/sRi/obnWAcobtDAq6+gJQQNhQ== + version "18.6.2" + resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-18.6.2.tgz#617f3ee761578040cade530631058699642cbd78" + integrity sha512-PcgSYg1AKGQIwDQKbaHtJsfqYy4uJTC7crLVZ83lfjcPaec4Pry2vLeaWej7ao2KsT20l9dWoMPpEGg8LWdUuA== dependencies: "@commitlint/types" "^18.6.1" conventional-changelog-conventionalcommits "^7.0.2" @@ -256,99 +256,95 @@ dependencies: chalk "^4.1.0" -"@cspell/cspell-bundled-dicts@8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-8.11.0.tgz#eb7ef0918ccff344e7adc1ea03cd6857071361ee" - integrity sha512-SYAW1oT9jjnbwju5P6luTnKogEe8DGUVmUO0O02LxYNmgE2eJt8pKZcy3RtR9V7Q5WW8PWsXXq0Xvoseji0olg== +"@cspell/cspell-bundled-dicts@8.4.0": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-8.4.0.tgz#e027f5d45fb1563697a05de406956bbebad82423" + integrity sha512-eaDE8sen039fD8dCGQ3Hu6N4DWu/ZBuQocXhrx+8yfBEM1YaBsubKGdQUZrDGFcHenvaFJPq6aH84t3guYaVgA== dependencies: "@cspell/dict-ada" "^4.0.2" - "@cspell/dict-aws" "^4.0.3" + "@cspell/dict-aws" "^4.0.1" "@cspell/dict-bash" "^4.1.3" - "@cspell/dict-companies" "^3.1.2" - "@cspell/dict-cpp" "^5.1.10" + "@cspell/dict-companies" "^3.0.31" + "@cspell/dict-cpp" "^5.1.3" "@cspell/dict-cryptocurrencies" "^5.0.0" "@cspell/dict-csharp" "^4.0.2" "@cspell/dict-css" "^4.0.12" "@cspell/dict-dart" "^2.0.3" "@cspell/dict-django" "^4.1.0" "@cspell/dict-docker" "^1.1.7" - "@cspell/dict-dotnet" "^5.0.2" + "@cspell/dict-dotnet" "^5.0.0" "@cspell/dict-elixir" "^4.0.3" - "@cspell/dict-en-common-misspellings" "^2.0.3" + "@cspell/dict-en-common-misspellings" "^2.0.0" "@cspell/dict-en-gb" "1.1.33" - "@cspell/dict-en_us" "^4.3.23" - "@cspell/dict-filetypes" "^3.0.4" + "@cspell/dict-en_us" "^4.3.16" + "@cspell/dict-filetypes" "^3.0.3" "@cspell/dict-fonts" "^4.0.0" "@cspell/dict-fsharp" "^1.0.1" - "@cspell/dict-fullstack" "^3.1.8" + "@cspell/dict-fullstack" "^3.1.5" "@cspell/dict-gaming-terms" "^1.0.5" "@cspell/dict-git" "^3.0.0" - "@cspell/dict-golang" "^6.0.9" - "@cspell/dict-google" "^1.0.1" + "@cspell/dict-golang" "^6.0.5" "@cspell/dict-haskell" "^4.0.1" "@cspell/dict-html" "^4.0.5" "@cspell/dict-html-symbol-entities" "^4.0.0" - "@cspell/dict-java" "^5.0.7" - "@cspell/dict-julia" "^1.0.1" - "@cspell/dict-k8s" "^1.0.5" + "@cspell/dict-java" "^5.0.6" + "@cspell/dict-k8s" "^1.0.2" "@cspell/dict-latex" "^4.0.0" "@cspell/dict-lorem-ipsum" "^4.0.0" "@cspell/dict-lua" "^4.0.3" "@cspell/dict-makefile" "^1.0.0" - "@cspell/dict-monkeyc" "^1.0.6" - "@cspell/dict-node" "^5.0.1" - "@cspell/dict-npm" "^5.0.16" - "@cspell/dict-php" "^4.0.8" - "@cspell/dict-powershell" "^5.0.4" - "@cspell/dict-public-licenses" "^2.0.7" - "@cspell/dict-python" "^4.2.1" + "@cspell/dict-node" "^4.0.3" + "@cspell/dict-npm" "^5.0.15" + "@cspell/dict-php" "^4.0.6" + "@cspell/dict-powershell" "^5.0.3" + "@cspell/dict-public-licenses" "^2.0.5" + "@cspell/dict-python" "^4.1.11" "@cspell/dict-r" "^2.0.1" "@cspell/dict-ruby" "^5.0.2" - "@cspell/dict-rust" "^4.0.4" - "@cspell/dict-scala" "^5.0.2" - "@cspell/dict-software-terms" "^3.4.10" + "@cspell/dict-rust" "^4.0.2" + "@cspell/dict-scala" "^5.0.0" + "@cspell/dict-software-terms" "^3.3.18" "@cspell/dict-sql" "^2.1.3" "@cspell/dict-svelte" "^1.0.2" "@cspell/dict-swift" "^2.0.1" - "@cspell/dict-terraform" "^1.0.0" - "@cspell/dict-typescript" "^3.1.5" + "@cspell/dict-typescript" "^3.1.2" "@cspell/dict-vue" "^3.0.0" -"@cspell/cspell-json-reporter@8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@cspell/cspell-json-reporter/-/cspell-json-reporter-8.11.0.tgz#388685b82dfa1190777bd20b71de3043b409ba0d" - integrity sha512-GSk2dKZHak4EuRXRKpyW3EsxmJmirkcZoM6sJQh6ZaFXSffMPgydNNIeL2xH/2hnwE7yWcP0ryq8hOxlrl9mVw== +"@cspell/cspell-json-reporter@8.4.0": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@cspell/cspell-json-reporter/-/cspell-json-reporter-8.4.0.tgz#cc72f19740350f08e38ed5cf2861ac6679fdb226" + integrity sha512-JH2qufHilC6xduDONe1QKHwA3a1ST+Nz+q+Vd0nUHZ53OBgk59vH9YfNk90ikjm/Cfocs/Wrz7TX2di1n8bHsA== dependencies: - "@cspell/cspell-types" "8.11.0" + "@cspell/cspell-types" "8.4.0" -"@cspell/cspell-pipe@8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@cspell/cspell-pipe/-/cspell-pipe-8.11.0.tgz#a8fa766f47f6697f87a41711ed3896cb017a03c8" - integrity sha512-VNWoAb2Y5VO87O8FipQZfk7H5aDhjE2HbGInVWC1x+qNMyQvnh3WYexa5r0Z4g3WqdTPhhpZdeBHnEfcdBwmOw== +"@cspell/cspell-pipe@8.4.0": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@cspell/cspell-pipe/-/cspell-pipe-8.4.0.tgz#4ededc06eef69cee1307f6773c21ddf179ab1ea1" + integrity sha512-qHd01Lenjmipybt9CsfZcjEeU1aTsp0TpKmuxT+ixJ+fEYc/dfPyBxsCreKSo8jXw6GTkj86g3vcnhKc/QH5BQ== -"@cspell/cspell-resolver@8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@cspell/cspell-resolver/-/cspell-resolver-8.11.0.tgz#3d8fd59e148768c9515cd153a4f7390d6a562bcd" - integrity sha512-4qqYBct6wsdoDCnTvt7rfpBE3ARegLDTeYOxglZLE3xZj0vpI1LZiGc3jgroTql866Lqy+IeRCwnQd5GXrqtmg== +"@cspell/cspell-resolver@8.4.0": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@cspell/cspell-resolver/-/cspell-resolver-8.4.0.tgz#10793d7a21ac643a249882ab3de2ec1cadfb4628" + integrity sha512-2WOuYzroYxXbrosYcbu2xpJZQU7ILOj57/dmlFu/3Z+bNnao/CfJ5aiRarqQrwA8qvCqQbAZPjJwf725IiO0lA== dependencies: global-directory "^4.0.1" -"@cspell/cspell-service-bus@8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@cspell/cspell-service-bus/-/cspell-service-bus-8.11.0.tgz#ba9d3e0226b4363852a7930ba66d4682ec2183f0" - integrity sha512-W7BBouT5prXvvh9javWTzZN3vvnSujS3agrOjRQ5BuimOgLonUwydimuSTDFIkyvT6ZwzyIVO4r984w3OcYyzg== +"@cspell/cspell-service-bus@8.4.0": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@cspell/cspell-service-bus/-/cspell-service-bus-8.4.0.tgz#2a43d5f2d67a2e07c688263143004394dad17ec0" + integrity sha512-vl4iVrHW8kYa8LIDx7aMMX9q67w9Es4QiemWXlOObaOKNS95NBvQdE8r9x2wBKCGpZyMG5n6Nafla5mG9Bcpsg== -"@cspell/cspell-types@8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@cspell/cspell-types/-/cspell-types-8.11.0.tgz#34445f4381d242ffdc6c15937b9ad41190390d49" - integrity sha512-WNscRYt7MHhJhv2E8GbNoyUVZnRvWsz8O+OFrMjmGO6PxokQRnuKRp3rgHpZxL0NR4xw+2xyZKYC/9iOQ6yCnQ== +"@cspell/cspell-types@8.4.0": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@cspell/cspell-types/-/cspell-types-8.4.0.tgz#04cf3f69e101323623c6fee28e87d3e6e5719319" + integrity sha512-bxt1cX9hDiQ7E/ZvLv4Oq4jBPsEGzI5dH+EJ5NQOy64Edc92X7WLTYbMgu3t7cxkkwVnc7Iv48uBUdJrFsc9Ig== "@cspell/dict-ada@^4.0.2": version "4.0.2" resolved "https://registry.yarnpkg.com/@cspell/dict-ada/-/dict-ada-4.0.2.tgz#8da2216660aeb831a0d9055399a364a01db5805a" integrity sha512-0kENOWQeHjUlfyId/aCM/mKXtkEgV0Zu2RhUXCBr4hHo9F9vph+Uu8Ww2b0i5a4ZixoIkudGA+eJvyxrG1jUpA== -"@cspell/dict-aws@^4.0.3": +"@cspell/dict-aws@^4.0.1": version "4.0.3" resolved "https://registry.yarnpkg.com/@cspell/dict-aws/-/dict-aws-4.0.3.tgz#7d36d4d5439d1c39b815e0ae19f79e48a823e047" integrity sha512-0C0RQ4EM29fH0tIYv+EgDQEum0QI6OrmjENC9u98pB8UcnYxGG/SqinuPxo+TgcEuInj0Q73MsBpJ1l5xUnrsw== @@ -358,15 +354,15 @@ resolved "https://registry.yarnpkg.com/@cspell/dict-bash/-/dict-bash-4.1.3.tgz#25fba40825ac10083676ab2c777e471c3f71b36e" integrity sha512-tOdI3QVJDbQSwPjUkOiQFhYcu2eedmX/PtEpVWg0aFps/r6AyjUQINtTgpqMYnYuq8O1QUIQqnpx21aovcgZCw== -"@cspell/dict-companies@^3.1.2": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@cspell/dict-companies/-/dict-companies-3.1.2.tgz#b335fe5b8847a23673bc4b964ca584339ca669a2" - integrity sha512-OwR5i1xbYuJX7FtHQySmTy3iJtPV1rZQ3jFCxFGwrA1xRQ4rtRcDQ+sTXBCIAoJHkXa84f9J3zsngOKmMGyS/w== +"@cspell/dict-companies@^3.0.31": + version "3.0.31" + resolved "https://registry.yarnpkg.com/@cspell/dict-companies/-/dict-companies-3.0.31.tgz#f0dacabc5308096c0f12db8a8b802ece604d6bf7" + integrity sha512-hKVpV/lcGKP4/DpEPS8P4osPvFH/YVLJaDn9cBIOH6/HSmL5LbFgJNKpMGaYRbhm2FEX56MKE3yn/MNeNYuesQ== -"@cspell/dict-cpp@^5.1.10": - version "5.1.10" - resolved "https://registry.yarnpkg.com/@cspell/dict-cpp/-/dict-cpp-5.1.10.tgz#457881ad9425ea0af71e4c1f9b108677a555fe79" - integrity sha512-BmIF0sAz2BgGEOwzYIeEm9ALneDjd1tcTbFbo+A1Hcq3zOKP8yViSgxS9CEN30KOZIyph6Tldp531UPEpoEl0Q== +"@cspell/dict-cpp@^5.1.3": + version "5.1.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-cpp/-/dict-cpp-5.1.3.tgz#c0c34ccdecc3ff954877a56dbbf07a7bf53b218e" + integrity sha512-sqnriXRAInZH9W75C+APBh6dtben9filPqVbIsiRMUXGg+s02ekz0z6LbS7kXeJ5mD2qXoMLBrv13qH2eIwutQ== "@cspell/dict-cryptocurrencies@^5.0.0": version "5.0.0" @@ -403,7 +399,7 @@ resolved "https://registry.yarnpkg.com/@cspell/dict-docker/-/dict-docker-1.1.7.tgz#bcf933283fbdfef19c71a642e7e8c38baf9014f2" integrity sha512-XlXHAr822euV36GGsl2J1CkBIVg3fZ6879ZOg5dxTIssuhUOCiV2BuzKZmt6aIFmcdPmR14+9i9Xq+3zuxeX0A== -"@cspell/dict-dotnet@^5.0.2": +"@cspell/dict-dotnet@^5.0.0": version "5.0.2" resolved "https://registry.yarnpkg.com/@cspell/dict-dotnet/-/dict-dotnet-5.0.2.tgz#d89ca8fa2e546b5e1b1f1288746d26bb627d9f38" integrity sha512-UD/pO2A2zia/YZJ8Kck/F6YyDSpCMq0YvItpd4YbtDVzPREfTZ48FjZsbYi4Jhzwfvc6o8R56JusAE58P+4sNQ== @@ -413,7 +409,7 @@ resolved "https://registry.yarnpkg.com/@cspell/dict-elixir/-/dict-elixir-4.0.3.tgz#57c25843e46cf3463f97da72d9ef8e37c818296f" integrity sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q== -"@cspell/dict-en-common-misspellings@^2.0.3": +"@cspell/dict-en-common-misspellings@^2.0.0": version "2.0.3" resolved "https://registry.yarnpkg.com/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.0.3.tgz#705d7a271fbd35f9ee3ce5bd5ff0d38454a61927" integrity sha512-8nF1z9nUiSgMyikL66HTbDO7jCGtB24TxKBasXIBwkBKMDZgA2M883iXdeByy6m1JJUcCGFkSftVYp2W0bUgjw== @@ -423,12 +419,12 @@ resolved "https://registry.yarnpkg.com/@cspell/dict-en-gb/-/dict-en-gb-1.1.33.tgz#7f1fd90fc364a5cb77111b5438fc9fcf9cc6da0e" integrity sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g== -"@cspell/dict-en_us@^4.3.23": - version "4.3.23" - resolved "https://registry.yarnpkg.com/@cspell/dict-en_us/-/dict-en_us-4.3.23.tgz#3362b75a5051405816728ea1bb5ce997582ed383" - integrity sha512-l0SoEQBsi3zDSl3OuL4/apBkxjuj4hLIg/oy6+gZ7LWh03rKdF6VNtSZNXWAmMY+pmb1cGA3ouleTiJIglbsIg== +"@cspell/dict-en_us@^4.3.16": + version "4.3.16" + resolved "https://registry.yarnpkg.com/@cspell/dict-en_us/-/dict-en_us-4.3.16.tgz#b04fd49524db9fe6d8a3919881a525b073453c06" + integrity sha512-fyNuAvYpkllmsMpfAJaMip250LRAnEDp2EZbkjYwAJXXjtgQ4/1yh6sLityxPMDtJZN65Eko+8rJzGJHez4zbA== -"@cspell/dict-filetypes@^3.0.4": +"@cspell/dict-filetypes@^3.0.3": version "3.0.4" resolved "https://registry.yarnpkg.com/@cspell/dict-filetypes/-/dict-filetypes-3.0.4.tgz#aca71c7bb8c8805b54f382d98ded5ec75ebc1e36" integrity sha512-IBi8eIVdykoGgIv5wQhOURi5lmCNJq0we6DvqKoPQJHthXbgsuO1qrHSiUVydMiQl/XvcnUWTMeAlVUlUClnVg== @@ -443,7 +439,7 @@ resolved "https://registry.yarnpkg.com/@cspell/dict-fsharp/-/dict-fsharp-1.0.1.tgz#d62c699550a39174f182f23c8c1330a795ab5f53" integrity sha512-23xyPcD+j+NnqOjRHgW3IU7Li912SX9wmeefcY0QxukbAxJ/vAN4rBpjSwwYZeQPAn3fxdfdNZs03fg+UM+4yQ== -"@cspell/dict-fullstack@^3.1.8": +"@cspell/dict-fullstack@^3.1.5": version "3.1.8" resolved "https://registry.yarnpkg.com/@cspell/dict-fullstack/-/dict-fullstack-3.1.8.tgz#1bbfa0a165346f6eff9894cf965bf3ce26552797" integrity sha512-YRlZupL7uqMCtEBK0bDP9BrcPnjDhz7m4GBqCc1EYqfXauHbLmDT8ELha7T/E7wsFKniHSjzwDZzhNXo2lusRQ== @@ -458,16 +454,11 @@ resolved "https://registry.yarnpkg.com/@cspell/dict-git/-/dict-git-3.0.0.tgz#c275af86041a2b59a7facce37525e2af05653b95" integrity sha512-simGS/lIiXbEaqJu9E2VPoYW1OTC2xrwPPXNXFMa2uo/50av56qOuaxDrZ5eH1LidFXwoc8HROCHYeKoNrDLSw== -"@cspell/dict-golang@^6.0.9": +"@cspell/dict-golang@^6.0.5": version "6.0.9" resolved "https://registry.yarnpkg.com/@cspell/dict-golang/-/dict-golang-6.0.9.tgz#b26ee13fb34a8cd40fb22380de8a46b25739fcab" integrity sha512-etDt2WQauyEQDA+qPS5QtkYTb2I9l5IfQftAllVoB1aOrT6bxxpHvMEpJ0Hsn/vezxrCqa/BmtUbRxllIxIuSg== -"@cspell/dict-google@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@cspell/dict-google/-/dict-google-1.0.1.tgz#34701471a616011aeaaf480d4834436b6b6b1da5" - integrity sha512-dQr4M3n95uOhtloNSgB9tYYGXGGEGEykkFyRtfcp5pFuEecYUa0BSgtlGKx9RXVtJtKgR+yFT/a5uQSlt8WjqQ== - "@cspell/dict-haskell@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@cspell/dict-haskell/-/dict-haskell-4.0.1.tgz#e9fca7c452411ff11926e23ffed2b50bb9b95e47" @@ -483,17 +474,12 @@ resolved "https://registry.yarnpkg.com/@cspell/dict-html/-/dict-html-4.0.5.tgz#03a5182148d80e6c25f71339dbb2b7c5b9894ef8" integrity sha512-p0brEnRybzSSWi8sGbuVEf7jSTDmXPx7XhQUb5bgG6b54uj+Z0Qf0V2n8b/LWwIPJNd1GygaO9l8k3HTCy1h4w== -"@cspell/dict-java@^5.0.7": +"@cspell/dict-java@^5.0.6": version "5.0.7" resolved "https://registry.yarnpkg.com/@cspell/dict-java/-/dict-java-5.0.7.tgz#c0b32d3c208b6419a5eddd010e87196976be2694" integrity sha512-ejQ9iJXYIq7R09BScU2y5OUGrSqwcD+J5mHFOKbduuQ5s/Eh/duz45KOzykeMLI6KHPVxhBKpUPBWIsfewECpQ== -"@cspell/dict-julia@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@cspell/dict-julia/-/dict-julia-1.0.1.tgz#900001417f1c4ea689530adfcc034c848458a0aa" - integrity sha512-4JsCLCRhhLMLiaHpmR7zHFjj1qOauzDI5ZzCNQS31TUMfsOo26jAKDfo0jljFAKgw5M2fEG7sKr8IlPpQAYrmQ== - -"@cspell/dict-k8s@^1.0.5": +"@cspell/dict-k8s@^1.0.2": version "1.0.5" resolved "https://registry.yarnpkg.com/@cspell/dict-k8s/-/dict-k8s-1.0.5.tgz#4a4011d9f2f3ab628658573c5f16c0e6dbe30c29" integrity sha512-Cj+/ZV4S+MKlwfocSJZqe/2UAd/sY8YtlZjbK25VN1nCnrsKrBjfkX29vclwSj1U9aJg4Z9jw/uMjoaKu9ZrpQ== @@ -518,42 +504,32 @@ resolved "https://registry.yarnpkg.com/@cspell/dict-makefile/-/dict-makefile-1.0.0.tgz#5afb2910873ebbc01ab8d9c38661c4c93d0e5a40" integrity sha512-3W9tHPcSbJa6s0bcqWo6VisEDTSN5zOtDbnPabF7rbyjRpNo0uHXHRJQF8gAbFzoTzBBhgkTmrfSiuyQm7vBUQ== -"@cspell/dict-monkeyc@^1.0.6": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@cspell/dict-monkeyc/-/dict-monkeyc-1.0.6.tgz#042d042fc34a20194c8de032130808f44b241375" - integrity sha512-oO8ZDu/FtZ55aq9Mb67HtaCnsLn59xvhO/t2mLLTHAp667hJFxpp7bCtr2zOrR1NELzFXmKln/2lw/PvxMSvrA== - "@cspell/dict-node@^4.0.3": version "4.0.3" resolved "https://registry.yarnpkg.com/@cspell/dict-node/-/dict-node-4.0.3.tgz#5ae0222d72871e82978049f8e11ea627ca42fca3" integrity sha512-sFlUNI5kOogy49KtPg8SMQYirDGIAoKBO3+cDLIwD4MLdsWy1q0upc7pzGht3mrjuyMiPRUV14Bb0rkVLrxOhg== -"@cspell/dict-node@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@cspell/dict-node/-/dict-node-5.0.1.tgz#77e17c576a897a3391fce01c1cc5da60bb4c2268" - integrity sha512-lax/jGz9h3Dv83v8LHa5G0bf6wm8YVRMzbjJPG/9rp7cAGPtdrga+XANFq+B7bY5+jiSA3zvj10LUFCFjnnCCg== - -"@cspell/dict-npm@^5.0.16": - version "5.0.16" - resolved "https://registry.yarnpkg.com/@cspell/dict-npm/-/dict-npm-5.0.16.tgz#696883918a9876ffd20d5f975bde74a03d27d80e" - integrity sha512-ZWPnLAziEcSCvV0c8k9Qj88pfMu+wZwM5Qks87ShsfBgI8uLZ9tGHravA7gmjH1Gd7Bgxy2ulvXtSqIWPh1lew== +"@cspell/dict-npm@^5.0.15": + version "5.0.15" + resolved "https://registry.yarnpkg.com/@cspell/dict-npm/-/dict-npm-5.0.15.tgz#c1d1646011fd0eb8ee119b481818a92223c459d1" + integrity sha512-sX0X5YWNW54F4baW7b5JJB6705OCBIZtUqjOghlJNORS5No7QY1IX1zc5FxNNu4gsaCZITAmfMi4ityXEsEThA== -"@cspell/dict-php@^4.0.8": - version "4.0.8" - resolved "https://registry.yarnpkg.com/@cspell/dict-php/-/dict-php-4.0.8.tgz#fedce3109dff13a0f3d8d88ba604d6edd2b9fb70" - integrity sha512-TBw3won4MCBQ2wdu7kvgOCR3dY2Tb+LJHgDUpuquy3WnzGiSDJ4AVelrZdE1xu7mjFJUr4q48aB21YT5uQqPZA== +"@cspell/dict-php@^4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@cspell/dict-php/-/dict-php-4.0.6.tgz#fcdee4d850f279b2757eb55c4f69a3a221ac1f7e" + integrity sha512-ySAXisf7twoVFZqBV2o/DKiCLIDTHNqfnj0EfH9OoOUR7HL3rb6zJkm0viLUFDO2G/8SyIi6YrN/6KX+Scjjjg== -"@cspell/dict-powershell@^5.0.4": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@cspell/dict-powershell/-/dict-powershell-5.0.4.tgz#db2bc6a86700a2f829dc1b3b04f6cb3a916fd928" - integrity sha512-eosDShapDgBWN9ULF7+sRNdUtzRnUdsfEdBSchDm8FZA4HOqxUSZy3b/cX/Rdw0Fnw0AKgk0kzgXw7tS6vwJMQ== +"@cspell/dict-powershell@^5.0.3": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@cspell/dict-powershell/-/dict-powershell-5.0.5.tgz#3319d2fbad740e164a78386d711668bfe335c1f2" + integrity sha512-3JVyvMoDJesAATYGOxcUWPbQPUvpZmkinV3m8HL1w1RrjeMVXXuK7U1jhopSneBtLhkU+9HKFwgh9l9xL9mY2Q== -"@cspell/dict-public-licenses@^2.0.7": +"@cspell/dict-public-licenses@^2.0.5": version "2.0.7" resolved "https://registry.yarnpkg.com/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.7.tgz#ccd67a91a6bd5ed4b5117c2f34e9361accebfcb7" integrity sha512-KlBXuGcN3LE7tQi/GEqKiDewWGGuopiAD0zRK1QilOx5Co8XAvs044gk4MNIQftc8r0nHeUI+irJKLGcR36DIQ== -"@cspell/dict-python@^4.2.1": +"@cspell/dict-python@^4.1.11": version "4.2.1" resolved "https://registry.yarnpkg.com/@cspell/dict-python/-/dict-python-4.2.1.tgz#ef0c4cc1b6d096e8ff65faee3fe15eaf6457a92e" integrity sha512-9X2jRgyM0cxBoFQRo4Zc8oacyWnXi+0/bMI5FGibZNZV4y/o9UoFEr6agjU260/cXHTjIdkX233nN7eb7dtyRg== @@ -570,20 +546,20 @@ resolved "https://registry.yarnpkg.com/@cspell/dict-ruby/-/dict-ruby-5.0.2.tgz#cf1a71380c633dec0857143d3270cb503b10679a" integrity sha512-cIh8KTjpldzFzKGgrqUX4bFyav5lC52hXDKo4LbRuMVncs3zg4hcSf4HtURY+f2AfEZzN6ZKzXafQpThq3dl2g== -"@cspell/dict-rust@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@cspell/dict-rust/-/dict-rust-4.0.4.tgz#72f21d18aa46288b7da00e7d91b3ed4a23b386e8" - integrity sha512-v9/LcZknt/Xq7m1jdTWiQEtmkVVKdE1etAfGL2sgcWpZYewEa459HeWndNA0gfzQrpWX9sYay18mt7pqClJEdA== +"@cspell/dict-rust@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-rust/-/dict-rust-4.0.2.tgz#e9111f0105ee6d836a1be8314f47347fd9f8fc3a" + integrity sha512-RhziKDrklzOntxAbY3AvNR58wnFGIo3YS8+dNeLY36GFuWOvXDHFStYw5Pod4f/VXbO/+1tXtywCC4zWfB2p1w== -"@cspell/dict-scala@^5.0.2": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@cspell/dict-scala/-/dict-scala-5.0.2.tgz#d732ab24610cc9f6916fb8148f6ef5bdd945fc47" - integrity sha512-v97ClgidZt99JUm7OjhQugDHmhx4U8fcgunHvD/BsXWjXNj4cTr0m0YjofyZoL44WpICsNuFV9F/sv9OM5HUEw== +"@cspell/dict-scala@^5.0.0": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-scala/-/dict-scala-5.0.3.tgz#85a469b2d139766b6307befc89243928e3d82b39" + integrity sha512-4yGb4AInT99rqprxVNT9TYb1YSpq58Owzq7zi3ZS5T0u899Y4VsxsBiOgHnQ/4W+ygi+sp+oqef8w8nABR2lkg== -"@cspell/dict-software-terms@^3.3.18", "@cspell/dict-software-terms@^3.4.10": - version "3.4.10" - resolved "https://registry.yarnpkg.com/@cspell/dict-software-terms/-/dict-software-terms-3.4.10.tgz#1e461abf6a639b8771763a5953dbcfd611bc6dc0" - integrity sha512-S5S2sz98v4GWJ9TMo62Vp4L5RM/329e5UQfFn7yJfieTcrfXRH4IweVdz34rZcK9o5coGptgBUIv/Jcrd4cMpg== +"@cspell/dict-software-terms@^3.3.18": + version "3.3.18" + resolved "https://registry.yarnpkg.com/@cspell/dict-software-terms/-/dict-software-terms-3.3.18.tgz#f25863c316eea195d74b170d41711e2c7402e9ca" + integrity sha512-LJZGGMGqS8KzgXJrSMs3T+6GoqHG9z8Bc+rqLzLzbtoR3FbsMasE9U8oP2PmS3q7jJLFjQkzmg508DrcuZuo2g== "@cspell/dict-sql@^2.1.3": version "2.1.3" @@ -600,12 +576,7 @@ resolved "https://registry.yarnpkg.com/@cspell/dict-swift/-/dict-swift-2.0.1.tgz#06ec86e52e9630c441d3c19605657457e33d7bb6" integrity sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw== -"@cspell/dict-terraform@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@cspell/dict-terraform/-/dict-terraform-1.0.0.tgz#c7b073bb3a03683f64cc70ccaa55ce9742c46086" - integrity sha512-Ak+vy4HP/bOgzf06BAMC30+ZvL9mzv21xLM2XtfnBLTDJGdxlk/nK0U6QT8VfFLqJ0ZZSpyOxGsUebWDCTr/zQ== - -"@cspell/dict-typescript@^3.1.2", "@cspell/dict-typescript@^3.1.5": +"@cspell/dict-typescript@^3.1.2": version "3.1.5" resolved "https://registry.yarnpkg.com/@cspell/dict-typescript/-/dict-typescript-3.1.5.tgz#15bd74651fb2cf0eff1150f07afee9543206bfab" integrity sha512-EkIwwNV/xqEoBPJml2S16RXj65h1kvly8dfDLgXerrKw6puybZdvAHerAph6/uPTYdtLcsPyJYkPt5ISOJYrtw== @@ -615,22 +586,17 @@ resolved "https://registry.yarnpkg.com/@cspell/dict-vue/-/dict-vue-3.0.0.tgz#68ccb432ad93fcb0fd665352d075ae9a64ea9250" integrity sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A== -"@cspell/dynamic-import@8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@cspell/dynamic-import/-/dynamic-import-8.11.0.tgz#6ac3c8e9e1c39babcfed5c03aa1f4d87bb4b6f74" - integrity sha512-Xk5iQQZ23Q9IR9N5YQb4J0mXOegIBw2/aJ7mYjMQZ24I5fL47Ir45cd5a8m5UEMheZppfrolVsDoTEgXnAfPDQ== +"@cspell/dynamic-import@8.4.0": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@cspell/dynamic-import/-/dynamic-import-8.4.0.tgz#7b36724ff6671c4c51e821897e56c004adf95412" + integrity sha512-GV6LFOsNvtBpMLY5a087YyHqehe1+a3mH+LvAwYO5gBZvh9te/rHx14e6/shEYNh59mM24lm7MLCaHhmP8dhyQ== dependencies: - import-meta-resolve "^4.1.0" - -"@cspell/strong-weak-map@8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@cspell/strong-weak-map/-/strong-weak-map-8.11.0.tgz#6b5b7fa8c14e6148955ed42b3c064464b21d6e26" - integrity sha512-XumxAVA1Pi5U8d+qqo2//KPrsOINOHnHpal/yPu8FwfZhkRzpDnNPdgiMNKBVmZMFxmSCEJwc7AUUMnfyuGuLg== + import-meta-resolve "^4.0.0" -"@cspell/url@8.11.0": - version "8.11.0" - resolved "https://registry.yarnpkg.com/@cspell/url/-/url-8.11.0.tgz#f48874f8c77d6b2000a99bf72c1c73849ea7fecb" - integrity sha512-X0l/WJmavRqRKDgsgEjXHGizmvYt40omMTmNOLPHUa2jxL+a2ayuQD3GMFC8Omassjk3bSyFByftmgJDI+P2ZA== +"@cspell/strong-weak-map@8.4.0": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@cspell/strong-weak-map/-/strong-weak-map-8.4.0.tgz#5ec08fd969dea90fb2da4bda903e943f63740041" + integrity sha512-R/fWW9S3oypKOTkxRZeJqcWl4f+v5w8Bejaj5rcRwztwAM/xdOGSelGhPdNnTazciINegbmTa4XiurUCN9E8Mg== "@cspotcode/source-map-support@0.8.1": version "0.8.1" @@ -671,6 +637,31 @@ debug "^3.1.0" lodash.once "^4.1.1" +"@ericcornelissen/bash-parser@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@ericcornelissen/bash-parser/-/bash-parser-0.5.2.tgz#5eb3bc52020d97fbaebc63b5168ca0aa0b2e8418" + integrity sha512-4pIMTa1nEFfMXitv7oaNEWOdM+zpOZavesa5GaiWTgda6Zk32CFGxjUp/iIaN0PwgUW1yTq/fztSjbpE8SLGZQ== + dependencies: + array-last "^1.1.1" + babylon "^6.9.1" + compose-function "^3.0.3" + deep-freeze "0.0.1" + filter-iterator "0.0.1" + filter-obj "^1.1.0" + has-own-property "^0.1.0" + identity-function "^1.0.0" + is-iterable "^1.1.0" + iterable-lookahead "^1.0.0" + lodash.curry "^4.1.1" + magic-string "^0.16.0" + map-obj "^2.0.0" + object-pairs "^0.1.0" + object-values "^1.0.0" + reverse-arguments "^1.0.0" + shell-quote-word "^1.0.1" + to-pascal-case "^1.0.0" + unescape-js "^1.0.5" + "@esbuild-plugins/node-globals-polyfill@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz#0e4497a2b53c9e9485e149bc92ddb228438d6bcf" @@ -684,345 +675,345 @@ escape-string-regexp "^4.0.0" rollup-plugin-node-polyfills "^0.2.1" -"@esbuild/aix-ppc64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" - integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== +"@esbuild/aix-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" + integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== -"@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/aix-ppc64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz#eafa8775019b3650a77e8310ba4dbd17ca7af6d5" + integrity sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA== "@esbuild/android-arm64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd" integrity sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA== -"@esbuild/android-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" - integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== +"@esbuild/android-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" + integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== -"@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-arm64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz#68791afa389550736f682c15b963a4f37ec2f5f6" + integrity sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A== "@esbuild/android-arm@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.19.tgz#5898f7832c2298bc7d0ab53701c57beb74d78b4d" integrity sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A== -"@esbuild/android-arm@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" - integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== +"@esbuild/android-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" + integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== -"@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-arm@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.1.tgz#38c91d8ee8d5196f7fbbdf4f0061415dde3a473a" + integrity sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw== "@esbuild/android-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.19.tgz#658368ef92067866d95fb268719f98f363d13ae1" integrity sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww== -"@esbuild/android-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" - integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== +"@esbuild/android-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" + integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== -"@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/android-x64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.1.tgz#93f6190ce997b313669c20edbf3645fc6c8d8f22" + integrity sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA== "@esbuild/darwin-arm64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz#584c34c5991b95d4d48d333300b1a4e2ff7be276" integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg== -"@esbuild/darwin-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" - integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== +"@esbuild/darwin-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" + integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== -"@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-arm64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz#0d391f2e81fda833fe609182cc2fbb65e03a3c46" + integrity sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA== "@esbuild/darwin-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb" integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw== -"@esbuild/darwin-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" - integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== +"@esbuild/darwin-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" + integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== -"@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/darwin-x64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz#92504077424584684862f483a2242cfde4055ba2" + integrity sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA== "@esbuild/freebsd-arm64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz#cacd171665dd1d500f45c167d50c6b7e539d5fd2" integrity sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ== -"@esbuild/freebsd-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" - integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== +"@esbuild/freebsd-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" + integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== -"@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-arm64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz#a1646fa6ba87029c67ac8a102bb34384b9290774" + integrity sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw== "@esbuild/freebsd-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz#0769456eee2a08b8d925d7c00b79e861cb3162e4" integrity sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ== -"@esbuild/freebsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" - integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== +"@esbuild/freebsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" + integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== -"@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/freebsd-x64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz#41c9243ab2b3254ea7fb512f71ffdb341562e951" + integrity sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg== "@esbuild/linux-arm64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz#38e162ecb723862c6be1c27d6389f48960b68edb" integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg== -"@esbuild/linux-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" - integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== +"@esbuild/linux-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" + integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== -"@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-arm64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz#f3c1e1269fbc9eedd9591a5bdd32bf707a883156" + integrity sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w== "@esbuild/linux-arm@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz#1a2cd399c50040184a805174a6d89097d9d1559a" integrity sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA== -"@esbuild/linux-arm@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" - integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== +"@esbuild/linux-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" + integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== -"@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-arm@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz#4503ca7001a8ee99589c072801ce9d7540717a21" + integrity sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw== "@esbuild/linux-ia32@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz#e28c25266b036ce1cabca3c30155222841dc035a" integrity sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ== -"@esbuild/linux-ia32@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" - integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== +"@esbuild/linux-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" + integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== -"@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-ia32@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz#98c474e3e0cbb5bcbdd8561a6e65d18f5767ce48" + integrity sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw== "@esbuild/linux-loong64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz#0f887b8bb3f90658d1a0117283e55dbd4c9dcf72" integrity sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ== -"@esbuild/linux-loong64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" - integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== +"@esbuild/linux-loong64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" + integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== -"@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-loong64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz#a8097d28d14b9165c725fe58fc438f80decd2f33" + integrity sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA== "@esbuild/linux-mips64el@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz#f5d2a0b8047ea9a5d9f592a178ea054053a70289" integrity sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A== -"@esbuild/linux-mips64el@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" - integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== +"@esbuild/linux-mips64el@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" + integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== -"@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-mips64el@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz#c44f6f0d7d017c41ad3bb15bfdb69b690656b5ea" + integrity sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA== "@esbuild/linux-ppc64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz#876590e3acbd9fa7f57a2c7d86f83717dbbac8c7" integrity sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg== -"@esbuild/linux-ppc64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" - integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== +"@esbuild/linux-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" + integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== -"@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-ppc64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz#0765a55389a99237b3c84227948c6e47eba96f0d" + integrity sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw== "@esbuild/linux-riscv64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz#7f49373df463cd9f41dc34f9b2262d771688bf09" integrity sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA== -"@esbuild/linux-riscv64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" - integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== +"@esbuild/linux-riscv64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" + integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== -"@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-riscv64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz#e4153b032288e3095ddf4c8be07893781b309a7e" + integrity sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg== "@esbuild/linux-s390x@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz#e2afd1afcaf63afe2c7d9ceacd28ec57c77f8829" integrity sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q== -"@esbuild/linux-s390x@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" - integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== +"@esbuild/linux-s390x@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" + integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== -"@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-s390x@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz#b9ab8af6e4b73b26d63c1c426d7669a5d53eb5a7" + integrity sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ== "@esbuild/linux-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4" integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw== -"@esbuild/linux-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" - integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== +"@esbuild/linux-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" + integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== -"@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/linux-x64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.1.tgz#0b25da17ac38c3e11cdd06ca3691d4d6bef2755f" + integrity sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA== "@esbuild/netbsd-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz#c29fb2453c6b7ddef9a35e2c18b37bda1ae5c462" integrity sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q== -"@esbuild/netbsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" - integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== +"@esbuild/netbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" + integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== -"@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/netbsd-x64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz#3148e48406cd0d4f7ba1e0bf3f4d77d548c98407" + integrity sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg== "@esbuild/openbsd-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz#95e75a391403cb10297280d524d66ce04c920691" integrity sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g== -"@esbuild/openbsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" - integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== +"@esbuild/openbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" + integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== -"@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/openbsd-x64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz#7b73e852986a9750192626d377ac96ac2b749b76" + integrity sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw== "@esbuild/sunos-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz#722eaf057b83c2575937d3ffe5aeb16540da7273" integrity sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg== -"@esbuild/sunos-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" - integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== +"@esbuild/sunos-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" + integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== -"@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/sunos-x64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz#402a441cdac2eee98d8be378c7bc23e00c1861c5" + integrity sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q== "@esbuild/win32-arm64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz#9aa9dc074399288bdcdd283443e9aeb6b9552b6f" integrity sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag== -"@esbuild/win32-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" - integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== +"@esbuild/win32-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" + integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== -"@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-arm64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz#36c4e311085806a6a0c5fc54d1ac4d7b27e94d7b" + integrity sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A== "@esbuild/win32-ia32@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz#95ad43c62ad62485e210f6299c7b2571e48d2b03" integrity sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw== -"@esbuild/win32-ia32@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" - integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== +"@esbuild/win32-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" + integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== -"@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-ia32@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz#0cf933be3fb9dc58b45d149559fe03e9e22b54fe" + integrity sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw== "@esbuild/win32-x64@0.17.19": version "0.17.19" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz#8cfaf2ff603e9aabb910e9c0558c26cf32744061" integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA== -"@esbuild/win32-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" - integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== +"@esbuild/win32-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" + integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== -"@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== +"@esbuild/win32-x64@0.20.1": + version "0.20.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz#77583b6ea54cee7c1410ebbd54051b6a3fcbd8ba" + integrity sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" @@ -1031,7 +1022,7 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": version "4.11.0" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== @@ -1051,10 +1042,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@eslint/js@8.56.0": + version "8.56.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" + integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== "@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": version "5.7.0" @@ -1403,7 +1394,7 @@ resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== -"@humanwhocodes/config-array@^0.11.14": +"@humanwhocodes/config-array@^0.11.13": version "0.11.14" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== @@ -1422,6 +1413,18 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@jridgewell/resolve-uri@^3.0.3": version "3.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" @@ -1460,12 +1463,33 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" +"@nodelib/fs.scandir@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-3.0.0.tgz#91c0a33e1aeaedcd4bab2bf31be5d1962a55d2a7" + integrity sha512-ktI9+PxfHYtKjF3cLTUAh2N+b8MijCRPNwKJNqTVdL0gB0QxLU2rIRaZ1t71oEa3YBDE6bukH1sR0+CDnpp/Mg== + dependencies: + "@nodelib/fs.stat" "3.0.0" + run-parallel "^1.2.0" + "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@1.2.8", "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": +"@nodelib/fs.stat@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-3.0.0.tgz#ef6c829f2b05f42595d88854ebd777d4335ff0a9" + integrity sha512-2tQOI38s19P9i7X/Drt0v8iMA+KMsgdhB/dyPER+e+2Y8L1Z7QvnuRdW/uLuf5YRFUYmnj4bMA6qCuZHFI1GDQ== + +"@nodelib/fs.walk@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-2.0.0.tgz#10499ac2210f6399770b465ba728adafc7d44bb1" + integrity sha512-54voNDBobGdMl3BUXSu7UaDh1P85PGHWlJ5e0XhPugo1JulOyCtp2I+5ri4wplGDJ8QGwPEQW7/x3yTLU7yF1A== + dependencies: + "@nodelib/fs.scandir" "3.0.0" + fastq "^1.15.0" + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -1473,6 +1497,56 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@npmcli/git@^5.0.0": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-5.0.8.tgz#8ba3ff8724192d9ccb2735a2aa5380a992c5d3d1" + integrity sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ== + dependencies: + "@npmcli/promise-spawn" "^7.0.0" + ini "^4.1.3" + lru-cache "^10.0.1" + npm-pick-manifest "^9.0.0" + proc-log "^4.0.0" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^4.0.0" + +"@npmcli/map-workspaces@3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-3.0.4.tgz#15ad7d854292e484f7ba04bc30187a8320dba799" + integrity sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg== + dependencies: + "@npmcli/name-from-folder" "^2.0.0" + glob "^10.2.2" + minimatch "^9.0.0" + read-package-json-fast "^3.0.0" + +"@npmcli/name-from-folder@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz#c44d3a7c6d5c184bb6036f4d5995eee298945815" + integrity sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg== + +"@npmcli/package-json@5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-5.0.0.tgz#77d0f8b17096763ccbd8af03b7117ba6e34d6e91" + integrity sha512-OI2zdYBLhQ7kpNPaJxiflofYIpkNLi+lnGdzqUOfRmCF3r2l1nadcjtCYMJKv/Utm/ZtlffaUuTiAktPHbc17g== + dependencies: + "@npmcli/git" "^5.0.0" + glob "^10.2.2" + hosted-git-info "^7.0.0" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^6.0.0" + proc-log "^3.0.0" + semver "^7.5.3" + +"@npmcli/promise-spawn@^7.0.0": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz#1d53d34ffeb5d151bfa8ec661bcccda8bbdfd532" + integrity sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ== + dependencies: + which "^4.0.0" + "@octokit/auth-token@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-4.0.0.tgz#40d203ea827b9f17f42a29c6afb93b7745ef80c7" @@ -1620,6 +1694,123 @@ "@octokit/request-error" "^6.0.1" "@octokit/webhooks-methods" "^5.0.0" +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@pkgr/core@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" + integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== + +"@pnpm/constants@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@pnpm/constants/-/constants-7.1.1.tgz#3db261425fe15425aa213a2b003f4f60c9378b43" + integrity sha512-31pZqMtjwV+Vaq7MaPrT1EoDFSYwye3dp6BiHIGRJmVThCQwySRKM7hCvqqI94epNkqFAAYoWrNynWoRYosGdw== + +"@pnpm/core-loggers@9.0.6": + version "9.0.6" + resolved "https://registry.yarnpkg.com/@pnpm/core-loggers/-/core-loggers-9.0.6.tgz#59a65822cc5ef901dad5aca5b8f1f9562cf91e2a" + integrity sha512-iK67SGbp+06bA/elpg51wygPFjNA7JKHtKkpLxqXXHw+AjFFBC3f2OznJsCIuDK6HdGi5UhHLYqo5QxJ2gMqJQ== + dependencies: + "@pnpm/types" "9.4.2" + +"@pnpm/error@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@pnpm/error/-/error-5.0.2.tgz#153d18fe9eeaeb02e48e9dc45b042f4c962b3822" + integrity sha512-0TEm+tWNYm+9uh6DSKyRbv8pv/6b4NL0PastLvMxIoqZbBZ5Zj1cYi332R9xsSUi31ZOsu2wpgn/bC7DA9hrjg== + dependencies: + "@pnpm/constants" "7.1.1" + +"@pnpm/fetching-types@5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@pnpm/fetching-types/-/fetching-types-5.0.0.tgz#36807c4bea4697d5ad7519d80929666a91c0083d" + integrity sha512-o9gdO1v8Uc5P2fBBuW6GSpfTqIivQmQlqjQJdFiQX0m+tgxlrMRneIg392jZuc6fk7kFqjLheInlslgJfwY+4Q== + dependencies: + "@zkochan/retry" "^0.2.0" + node-fetch "3.0.0-beta.9" + +"@pnpm/graceful-fs@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@pnpm/graceful-fs/-/graceful-fs-3.2.0.tgz#241846c42c23feff7421b8bd97d4039891003f12" + integrity sha512-vRoXJxscDpHak7YE9SqCkzfrayn+Lw+YueOeHIPEqkgokrHeYgYeONoc2kGh0ObHaRtNSsonozVfJ456kxLNvA== + dependencies: + graceful-fs "^4.2.11" + +"@pnpm/logger@5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@pnpm/logger/-/logger-5.0.0.tgz#9ac8254d40d8d5b5e676742dc66b8cac1af380bf" + integrity sha512-YfcB2QrX+Wx1o6LD1G2Y2fhDhOix/bAY/oAnMpHoNLsKkWIRbt1oKLkIFvxBMzLwAEPqnYWguJrYC+J6i4ywbw== + dependencies: + bole "^5.0.0" + ndjson "^2.0.0" + +"@pnpm/npm-package-arg@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@pnpm/npm-package-arg/-/npm-package-arg-1.0.0.tgz#2a27938f4d38c6cce5f3695fd1e7d5ed8929645e" + integrity sha512-oQYP08exi6mOPdAZZWcNIGS+KKPsnNwUBzSuAEGWuCcqwMAt3k/WVCqVIXzBxhO5sP2b43og69VHmPj6IroKqw== + dependencies: + hosted-git-info "^4.0.1" + semver "^7.3.5" + validate-npm-package-name "^4.0.0" + +"@pnpm/npm-resolver@18.1.0": + version "18.1.0" + resolved "https://registry.yarnpkg.com/@pnpm/npm-resolver/-/npm-resolver-18.1.0.tgz#bbafcdf88391ee84e2dc78c2b599b54dbbc8f8e3" + integrity sha512-fUYKX/iHiHldL0VRVvkQI35YK2jWhZEkPO6rrGke8309+LKAo12v833nBttMDpQrtHefmqhB4mhCzQq6L2Xqmg== + dependencies: + "@pnpm/core-loggers" "9.0.6" + "@pnpm/error" "5.0.2" + "@pnpm/fetching-types" "5.0.0" + "@pnpm/graceful-fs" "3.2.0" + "@pnpm/resolve-workspace-range" "5.0.1" + "@pnpm/resolver-base" "11.1.0" + "@pnpm/types" "9.4.2" + "@zkochan/retry" "^0.2.0" + encode-registry "^3.0.1" + load-json-file "^6.2.0" + lru-cache "^10.0.2" + normalize-path "^3.0.0" + p-limit "^3.1.0" + p-memoize "4.0.1" + parse-npm-tarball-url "^3.0.0" + path-temp "^2.1.0" + ramda "npm:@pnpm/ramda@0.28.1" + rename-overwrite "^5.0.0" + semver "^7.5.4" + ssri "10.0.5" + version-selector-type "^3.0.0" + +"@pnpm/resolve-workspace-range@5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@pnpm/resolve-workspace-range/-/resolve-workspace-range-5.0.1.tgz#839179560fbf5e565234e5dd1d65b79765d86f4c" + integrity sha512-yQ0pMthlw8rTgS/C9hrjne+NEnnSNevCjtdodd7i15I59jMBYciHifZ/vjg0NY+Jl+USTc3dBE+0h/4tdYjMKg== + dependencies: + semver "^7.4.0" + +"@pnpm/resolver-base@11.1.0": + version "11.1.0" + resolved "https://registry.yarnpkg.com/@pnpm/resolver-base/-/resolver-base-11.1.0.tgz#e640ba9ae096bf05a0b905496a63509556322618" + integrity sha512-y2qKaj18pwe1VWc3YXEitdYFo+WqOOt60aqTUuOVkJAirUzz0DzuYh3Ifct4znYWPdgUXHaN5DMphNF5iL85rA== + dependencies: + "@pnpm/types" "9.4.2" + +"@pnpm/types@9.4.2": + version "9.4.2" + resolved "https://registry.yarnpkg.com/@pnpm/types/-/types-9.4.2.tgz#0a34c3c41d5452461d8d8958374a727f9c46cfb2" + integrity sha512-g1hcF8Nv4gd76POilz9gD4LITAPXOe5nX4ijgr8ixCbLQZfcpYiMfJ+C1RlMNRUDo8vhlNB4O3bUlxmT6EAQXA== + +"@pnpm/workspace.pkgs-graph@^2.0.14": + version "2.0.14" + resolved "https://registry.yarnpkg.com/@pnpm/workspace.pkgs-graph/-/workspace.pkgs-graph-2.0.14.tgz#3ea12b8d95987e64bc98876422ea7ad578cd022a" + integrity sha512-SBXXyWDkPEoaLTjLRyQzRHoBYH+P0NLcIjX1yPUxuJiMTvGOMzjpLWTuxYNVe/P0V0VQMrjpJFaJPjlViNLhzg== + dependencies: + "@pnpm/npm-package-arg" "^1.0.0" + "@pnpm/npm-resolver" "18.1.0" + "@pnpm/resolve-workspace-range" "5.0.1" + ramda "npm:@pnpm/ramda@0.28.1" + "@sinclair/typebox@^0.32.5": version "0.32.34" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.32.34.tgz#a1c59d4df30982263cc7aa64c2c853878050838d" @@ -1729,7 +1920,7 @@ "@supabase/realtime-js" "2.9.3" "@supabase/storage-js" "2.5.5" -"@supabase/supabase-js@^2.39.8": +"@supabase/supabase-js@^2.44.4": version "2.44.4" resolved "https://registry.yarnpkg.com/@supabase/supabase-js/-/supabase-js-2.44.4.tgz#60caa37e37a851cf880c0002eb800f461a41ceed" integrity sha512-vqtUp8umqcgj+RPUc7LiEcQmgsEWFDPJdJizRJF/5tf2zSlVB+3YbUwyQE/hLagYA8TLvGXe7oAqtYyFde6llw== @@ -1748,6 +1939,11 @@ dependencies: bignumber.js "7.2.1" +"@types/json-schema@^7.0.12": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + "@types/minimist@^1.2.0": version "1.2.5" resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" @@ -1760,10 +1956,10 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@^20.11.19": - version "20.14.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.11.tgz#09b300423343460455043ddd4d0ded6ac579b74b" - integrity sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA== +"@types/node@*": + version "20.11.24" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.24.tgz#cc207511104694e84e9fb17f9a0c4c42d4517792" + integrity sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long== dependencies: undici-types "~5.26.4" @@ -1772,6 +1968,13 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.13.tgz#f64277c341150c979e42b00e4ac289290c9df469" integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== +"@types/node@^20.11.19": + version "20.11.19" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.19.tgz#b466de054e9cb5b3831bee38938de64ac7f81195" + integrity sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ== + dependencies: + undici-types "~5.26.4" + "@types/normalize-package-data@^2.4.0": version "2.4.4" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" @@ -1782,6 +1985,16 @@ resolved "https://registry.yarnpkg.com/@types/phoenix/-/phoenix-1.6.5.tgz#5654e14ec7ad25334a157a20015996b6d7d2075e" integrity sha512-xegpDuR+z0UqG9fwHqNoy3rI7JDlvaPh2TY47Fl80oq6g+hXT+c/LEuE43X48clZ6lOfANl5WrPur9fYO1RJ/w== +"@types/picomatch@2.3.3": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@types/picomatch/-/picomatch-2.3.3.tgz#be60498568c19e989e43fb39aa84be1ed3655e92" + integrity sha512-Yll76ZHikRFCyz/pffKGjrCwe/le2CDwOP5F210KQo27kpRE46U2rDnzikNlVn6/ezH3Mhn46bJMTfeVTtcYMg== + +"@types/semver@^7.5.0": + version "7.5.7" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.7.tgz#326f5fdda70d13580777bcaa1bc6fa772a5aef0e" + integrity sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg== + "@types/sinonjs__fake-timers@8.1.1": version "8.1.1" resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" @@ -1807,90 +2020,95 @@ "@types/node" "*" "@typescript-eslint/eslint-plugin@^7.0.1": - version "7.16.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.1.tgz#f5f5da52db674b1f2cdb9d5f3644e5b2ec750465" - integrity sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A== - dependencies: - "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "7.16.1" - "@typescript-eslint/type-utils" "7.16.1" - "@typescript-eslint/utils" "7.16.1" - "@typescript-eslint/visitor-keys" "7.16.1" + version "7.0.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.0.1.tgz#407daffe09d964d57aceaf3ac51846359fbe61b0" + integrity sha512-OLvgeBv3vXlnnJGIAgCLYKjgMEU+wBGj07MQ/nxAaON+3mLzX7mJbhRYrVGiVvFiXtwFlkcBa/TtmglHy0UbzQ== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "7.0.1" + "@typescript-eslint/type-utils" "7.0.1" + "@typescript-eslint/utils" "7.0.1" + "@typescript-eslint/visitor-keys" "7.0.1" + debug "^4.3.4" graphemer "^1.4.0" - ignore "^5.3.1" + ignore "^5.2.4" natural-compare "^1.4.0" - ts-api-utils "^1.3.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" "@typescript-eslint/parser@^7.0.1": - version "7.16.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.16.1.tgz#84c581cf86c8b2becd48d33ddc41a6303d57b274" - integrity sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA== - dependencies: - "@typescript-eslint/scope-manager" "7.16.1" - "@typescript-eslint/types" "7.16.1" - "@typescript-eslint/typescript-estree" "7.16.1" - "@typescript-eslint/visitor-keys" "7.16.1" + version "7.0.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.0.1.tgz#e9c61d9a5e32242477d92756d36086dc40322eed" + integrity sha512-8GcRRZNzaHxKzBPU3tKtFNing571/GwPBeCvmAUw0yBtfE2XVd0zFKJIMSWkHJcPQi0ekxjIts6L/rrZq5cxGQ== + dependencies: + "@typescript-eslint/scope-manager" "7.0.1" + "@typescript-eslint/types" "7.0.1" + "@typescript-eslint/typescript-estree" "7.0.1" + "@typescript-eslint/visitor-keys" "7.0.1" debug "^4.3.4" -"@typescript-eslint/scope-manager@7.16.1": - version "7.16.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.16.1.tgz#2b43041caabf8ddd74512b8b550b9fc53ca3afa1" - integrity sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw== +"@typescript-eslint/scope-manager@7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.0.1.tgz#611ec8e78c70439b152a805e1b10aaac36de7c00" + integrity sha512-v7/T7As10g3bcWOOPAcbnMDuvctHzCFYCG/8R4bK4iYzdFqsZTbXGln0cZNVcwQcwewsYU2BJLay8j0/4zOk4w== dependencies: - "@typescript-eslint/types" "7.16.1" - "@typescript-eslint/visitor-keys" "7.16.1" + "@typescript-eslint/types" "7.0.1" + "@typescript-eslint/visitor-keys" "7.0.1" -"@typescript-eslint/type-utils@7.16.1": - version "7.16.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.16.1.tgz#4d7ae4f3d9e3c8cbdabae91609b1a431de6aa6ca" - integrity sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA== +"@typescript-eslint/type-utils@7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.0.1.tgz#0fba92c1f81cad561d7b3adc812aa1cc0e35cdae" + integrity sha512-YtT9UcstTG5Yqy4xtLiClm1ZpM/pWVGFnkAa90UfdkkZsR1eP2mR/1jbHeYp8Ay1l1JHPyGvoUYR6o3On5Nhmw== dependencies: - "@typescript-eslint/typescript-estree" "7.16.1" - "@typescript-eslint/utils" "7.16.1" + "@typescript-eslint/typescript-estree" "7.0.1" + "@typescript-eslint/utils" "7.0.1" debug "^4.3.4" - ts-api-utils "^1.3.0" + ts-api-utils "^1.0.1" -"@typescript-eslint/types@7.16.1": - version "7.16.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.16.1.tgz#bbab066276d18e398bc64067b23f1ce84dfc6d8c" - integrity sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ== +"@typescript-eslint/types@7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.0.1.tgz#dcfabce192db5b8bf77ea3c82cfaabe6e6a3c901" + integrity sha512-uJDfmirz4FHib6ENju/7cz9SdMSkeVvJDK3VcMFvf/hAShg8C74FW+06MaQPODHfDJp/z/zHfgawIJRjlu0RLg== -"@typescript-eslint/typescript-estree@7.16.1": - version "7.16.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.1.tgz#9b145ba4fd1dde1986697e1ce57dc501a1736dd3" - integrity sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ== +"@typescript-eslint/typescript-estree@7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.0.1.tgz#1d52ac03da541693fa5bcdc13ad655def5046faf" + integrity sha512-SO9wHb6ph0/FN5OJxH4MiPscGah5wjOd0RRpaLvuBv9g8565Fgu0uMySFEPqwPHiQU90yzJ2FjRYKGrAhS1xig== dependencies: - "@typescript-eslint/types" "7.16.1" - "@typescript-eslint/visitor-keys" "7.16.1" + "@typescript-eslint/types" "7.0.1" + "@typescript-eslint/visitor-keys" "7.0.1" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^1.3.0" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" -"@typescript-eslint/utils@7.16.1": - version "7.16.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.16.1.tgz#df42dc8ca5a4603016fd102db0346cdab415cdb7" - integrity sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA== +"@typescript-eslint/utils@7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.0.1.tgz#b8ceac0ba5fef362b4a03a33c0e1fedeea3734ed" + integrity sha512-oe4his30JgPbnv+9Vef1h48jm0S6ft4mNwi9wj7bX10joGn07QRfqIqFHoMiajrtoU88cIhXf8ahwgrcbNLgPA== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "7.16.1" - "@typescript-eslint/types" "7.16.1" - "@typescript-eslint/typescript-estree" "7.16.1" - -"@typescript-eslint/visitor-keys@7.16.1": - version "7.16.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.1.tgz#4287bcf44c34df811ff3bb4d269be6cfc7d8c74b" - integrity sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg== + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "7.0.1" + "@typescript-eslint/types" "7.0.1" + "@typescript-eslint/typescript-estree" "7.0.1" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.0.1.tgz#864680ac5a8010ec4814f8a818e57595f79f464e" + integrity sha512-hwAgrOyk++RTXrP4KzCg7zB2U0xt7RUU0ZdMSCsqF3eKUwkdXUMyTb0qdCuji7VIbcpG62kKTU9M1J1c9UpFBw== dependencies: - "@typescript-eslint/types" "7.16.1" - eslint-visitor-keys "^3.4.3" + "@typescript-eslint/types" "7.0.1" + eslint-visitor-keys "^3.4.1" -"@ubiquibot/permit-generation@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@ubiquibot/permit-generation/-/permit-generation-1.2.2.tgz#3493b4701e1d9deccd4e4d5c9aef4e3f7b76e4d8" - integrity sha512-782Pd5Ub7T5bjfsPGGhE1LVFWhhyAl20ZX1EgCltGzouHgXdha5NKWYh4aG1DIfx7EVJ/6lUAE2yb1PyqAlb5Q== +"@ubiquibot/permit-generation@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@ubiquibot/permit-generation/-/permit-generation-1.4.1.tgz#1492f2608e36bcd845cfb1574d20b044e5f25fc1" + integrity sha512-Ek9vw2Lsc+57rVh0bdA9fkwbE8dthqqQfyLV+sx6jCwUnqZvopKwJtDZuS2wL7Dkl1fIFodVxNo37biNu5gCpw== dependencies: "@actions/core" "^1.10.1" "@actions/github" "^6.0.0" @@ -1898,6 +2116,7 @@ "@octokit/webhooks" "^13.1.0" "@sinclair/typebox" "^0.32.5" "@supabase/supabase-js" "2.42.0" + "@ubiquity-dao/rpc-handler" "^1.1.0" "@uniswap/permit2-sdk" "^1.2.0" dotenv "^16.4.4" ethers "6.11.1" @@ -1925,6 +2144,18 @@ ethers "^5.7.0" tiny-invariant "^1.1.0" +"@zkochan/retry@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@zkochan/retry/-/retry-0.2.0.tgz#cb52c9fce1976f3eed7b1979b739e70706f4a3d2" + integrity sha512-WhB+2B/ZPlW2Xy/kMJBrMbqecWXcbDDgn0K0wKBAgO2OlBTz1iLJrRWduo+DGGn0Akvz1Lu4Xvls7dJojximWw== + +"@zkochan/rimraf@^2.1.2": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@zkochan/rimraf/-/rimraf-2.1.3.tgz#1074cb72d6e4997275285b04296a343b6ac7046b" + integrity sha512-mCfR3gylCzPC+iqdxEA6z5SxJeOgzgbwmyxanKriIne5qZLswDe/M43aD3p5MNzwzXRhbZg/OX+MpES6Zk1a6A== + dependencies: + rimraf "^3.0.2" + JSONStream@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -2029,7 +2260,7 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -ansi-styles@^6.0.0, ansi-styles@^6.2.1: +ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== @@ -2052,6 +2283,11 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +arity-n@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" + integrity sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ== + array-buffer-byte-length@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" @@ -2065,6 +2301,13 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== +array-last@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/array-last/-/array-last-1.3.0.tgz#7aa77073fec565ddab2493f5f88185f404a9d336" + integrity sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg== + dependencies: + is-number "^4.0.0" + array-timsort@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/array-timsort/-/array-timsort-1.0.3.tgz#3c9e4199e54fb2b9c3fe5976396a21614ef0d926" @@ -2146,9 +2389,9 @@ aws-sign2@~0.7.0: integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.0.tgz#d9b802e9bb9c248d7be5f7f5ef178dc3684e9dcc" - integrity sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g== + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== axios@^1.7.1: version "1.7.2" @@ -2159,6 +2402,11 @@ axios@^1.7.1: form-data "^4.0.0" proxy-from-env "^1.1.0" +babylon@^6.9.1: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -2221,6 +2469,14 @@ bn.js@^5.2.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== +bole@^5.0.0: + version "5.0.11" + resolved "https://registry.yarnpkg.com/bole/-/bole-5.0.11.tgz#c4a165975422daee6f576360e882a425c8e40617" + integrity sha512-KB0Ye0iMAW5BnNbnLfMSQcnI186hKUzE2fpkZWqcxsoTR7eqzlTidSOMYPHJOn/yR7VGH7uSZp37qH9q2Et0zQ== + dependencies: + fast-safe-stringify "^2.0.7" + individual "^3.0.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -2236,7 +2492,7 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.3, braces@~3.0.2: +braces@^3.0.2, 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== @@ -2261,6 +2517,13 @@ buffer@^5.7.1: base64-js "^1.3.1" ieee754 "^1.1.13" +builtins@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" + integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + dependencies: + semver "^7.0.0" + cachedir@^2.3.0: version "2.4.0" resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.4.0.tgz#7fef9cf7367233d7c88068fe6e34ed0d355a610d" @@ -2316,6 +2579,11 @@ chalk-template@^1.1.0: dependencies: chalk "^5.2.0" +chalk@5.3.0, chalk@^5.2.0, chalk@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -2333,11 +2601,6 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^5.2.0, chalk@^5.3.0, chalk@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" - integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== - check-more-types@^2.24.0: version "2.24.0" resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" @@ -2391,9 +2654,9 @@ cli-cursor@^4.0.0: restore-cursor "^4.0.0" cli-table3@~0.6.1: - version "0.6.5" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f" - integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== + version "0.6.3" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" + integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== dependencies: string-width "^4.2.0" optionalDependencies: @@ -2465,10 +2728,15 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^12.1.0, commander@~12.1.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" - integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== +commander@11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" + integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== + +commander@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.0.0.tgz#b929db6df8546080adfd004ab215ed48cf6f2592" + integrity sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA== commander@^4.1.1: version "4.1.1" @@ -2480,10 +2748,10 @@ commander@^6.2.1: resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== -comment-json@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/comment-json/-/comment-json-4.2.4.tgz#7d1cfe2e934f0c55ae3c2c2cc0436ba4e8901083" - integrity sha512-E5AjpSW+O+N5T2GsOQMHLLsJvrYw6G/AFt9GvU6NguEAfzKShh7hRiLtVo6S9KbRpFMGqE5ojo0/hE+sdteWvQ== +comment-json@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/comment-json/-/comment-json-4.2.3.tgz#50b487ebbf43abe44431f575ebda07d30d015365" + integrity sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw== dependencies: array-timsort "^1.0.3" core-util-is "^1.0.3" @@ -2504,11 +2772,29 @@ compare-func@^2.0.0: array-ify "^1.0.0" dot-prop "^5.1.0" +compose-function@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" + integrity sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg== + dependencies: + arity-n "^1.0.4" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +configstore@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-6.0.0.tgz#49eca2ebc80983f77e09394a1a56e0aca8235566" + integrity sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA== + dependencies: + dot-prop "^6.0.1" + graceful-fs "^4.2.6" + unique-string "^3.0.0" + write-file-atomic "^3.0.3" + xdg-basedir "^5.0.1" + consola@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/consola/-/consola-3.2.3.tgz#0741857aa88cfa0d6fd53f1cff0375136e98502f" @@ -2590,126 +2876,132 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -cspell-config-lib@8.11.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/cspell-config-lib/-/cspell-config-lib-8.11.0.tgz#33ef26fa2047939437436ade788213937a9834c3" - integrity sha512-8AE1qm/nuD+aiN+mZXQIGp0ESHyQ9uowbKaB5+qi261HEEhuFPceP/3u0yq0kc1YPtnKxEfYHrLukvQIMlDshA== +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +crypto-random-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" + integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== + dependencies: + type-fest "^1.0.1" + +cspell-config-lib@8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/cspell-config-lib/-/cspell-config-lib-8.4.0.tgz#f04a3451552803f8732d29aa5c7c46051ffbaa16" + integrity sha512-lgvQrsOKTPfwjtkkyPTPQ/oC1y80wdSRqW9aiDl5OGVr6sGZz5lUC5oIHcu6jUOfiR7/CNPhIlVQ01faIW/5IA== dependencies: - "@cspell/cspell-types" "8.11.0" - comment-json "^4.2.4" - yaml "^2.4.5" + "@cspell/cspell-types" "8.4.0" + comment-json "^4.2.3" + yaml "^2.3.4" -cspell-dictionary@8.11.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/cspell-dictionary/-/cspell-dictionary-8.11.0.tgz#61dffb48b793aa8aadda84e74c14a1e607c62596" - integrity sha512-h5AVFuTeP+NLBRZbaX6sFGZ/wnvnyeeGtnNiYU0f4dVB3Yq0K9c7QXM8PllIpcbe+SBDoQ15ZlbECzUlGt/Ysg== +cspell-dictionary@8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/cspell-dictionary/-/cspell-dictionary-8.4.0.tgz#f4fa1efe05db918949b6cafc4762ed8de9d79e2b" + integrity sha512-eibij29R+1IjdsFAkboMtcfiRxBc+uOcNevJNQmVkU8Mwlx2gUopG8e+a22P4b6ufFrBT6S+/UsGBZtHky+eew== dependencies: - "@cspell/cspell-pipe" "8.11.0" - "@cspell/cspell-types" "8.11.0" - cspell-trie-lib "8.11.0" + "@cspell/cspell-pipe" "8.4.0" + "@cspell/cspell-types" "8.4.0" + cspell-trie-lib "8.4.0" fast-equals "^5.0.1" - gensequence "^7.0.0" + gensequence "^6.0.0" -cspell-gitignore@8.11.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/cspell-gitignore/-/cspell-gitignore-8.11.0.tgz#912d303caf2e02aa7fa9b431eae65c71987f593d" - integrity sha512-r+buXvm3NqU/5N1zmiXSgo7DQLZyKR5sr6McepWlGBmT4DDm7s22yojS8LSusIthJ2k3tvLFDI9O4Rs0DnzK2Q== +cspell-gitignore@8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/cspell-gitignore/-/cspell-gitignore-8.4.0.tgz#dc3e09eab978f642fdaf1a29558103269a5ee05f" + integrity sha512-azFZRA04yXZlXUztgbtjhKk4ddKI3yEMz+wMN4yIhDYRG+rwQyng0tIv5b/Hw26ptDFBrW9Vnec9rnSXHzkVWA== dependencies: - "@cspell/url" "8.11.0" - cspell-glob "8.11.0" - cspell-io "8.11.0" + cspell-glob "8.4.0" find-up-simple "^1.0.0" -cspell-glob@8.11.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/cspell-glob/-/cspell-glob-8.11.0.tgz#2409e5ac9ed985756fee01aa5820974237ceb106" - integrity sha512-X0cEErrQdrVLXDMse84QH/iV2Q+f7AsXxIjlSt+6PPEoDz8yRO8xD71iaaeE/8+cMFrKMl0uDpIpBQ5OlvcIyQ== - dependencies: - "@cspell/url" "8.11.0" - micromatch "^4.0.7" - -cspell-grammar@8.11.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/cspell-grammar/-/cspell-grammar-8.11.0.tgz#be28c816e78e2cb6c36cd8c48e13916d0170d8cb" - integrity sha512-fIq7/KDjNMfBBqKTnnp4dhjNmbvnl019bPwecddkQOpx5H9Vn4WVDTiAZbI6/5Li/VU+h1Ld2+pIOKYql/7DBg== - dependencies: - "@cspell/cspell-pipe" "8.11.0" - "@cspell/cspell-types" "8.11.0" - -cspell-io@8.11.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/cspell-io/-/cspell-io-8.11.0.tgz#f802f306d9a82e595fd2094262af79d61a7c8087" - integrity sha512-R6ZCNh2RrOkP3/OIpFHmtg6vztxMMsl6/t5kY1nTcmWv/1Ltw56G3q357KN6e+8epFiqFm4gMFmvzImFeR34Yw== - dependencies: - "@cspell/cspell-service-bus" "8.11.0" - "@cspell/url" "8.11.0" - -cspell-lib@8.11.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/cspell-lib/-/cspell-lib-8.11.0.tgz#e693dc84edffcfc74b70bca8638bb4bb5c7a917e" - integrity sha512-msdfqJLIhJE1whfGXC2J669dKWrnWdFI18nR2OTXipWdiwZDDQEFT3q2Pq56+bhxwtoqAZKrez/zhRB/JbpUuA== - dependencies: - "@cspell/cspell-bundled-dicts" "8.11.0" - "@cspell/cspell-pipe" "8.11.0" - "@cspell/cspell-resolver" "8.11.0" - "@cspell/cspell-types" "8.11.0" - "@cspell/dynamic-import" "8.11.0" - "@cspell/strong-weak-map" "8.11.0" - "@cspell/url" "8.11.0" +cspell-glob@8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/cspell-glob/-/cspell-glob-8.4.0.tgz#df91265911c96d6fba34e6a844717a2ad76fd225" + integrity sha512-3KuqpdiDkLCUdjCEyXhyUyFgRlrF/LbGoQO5J8ZnO8hLQDxyaW/3sDRCp0q9Ec6HF+0C1/ECOdulx7C0VRcOMw== + dependencies: + micromatch "^4.0.5" + +cspell-grammar@8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/cspell-grammar/-/cspell-grammar-8.4.0.tgz#a8ceddd17ae29e087b8c59989ae0e3c4cf4ff098" + integrity sha512-0p7E55v9C9El2/jKrenEtOYVj3Rl+FeEM9QcJBxQ6IYX/7QnoCLth09/BacaZmQfawxzkPtRoXbwhH5472vAgw== + dependencies: + "@cspell/cspell-pipe" "8.4.0" + "@cspell/cspell-types" "8.4.0" + +cspell-io@8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/cspell-io/-/cspell-io-8.4.0.tgz#19151e4732cbb2912476680016fdd9a4746c4e6c" + integrity sha512-CvC5XMJ4ENkdSZdhtJ6aJ7jez0PF9bAT0lGrSyGYId8fXS+lZ1jszllY3s4mSTdILVCDd8jVSSSogkqh6DKxUA== + dependencies: + "@cspell/cspell-service-bus" "8.4.0" + +cspell-lib@8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/cspell-lib/-/cspell-lib-8.4.0.tgz#4717aa292f9fb1b72e7a2934b2c56cb2c16f23f7" + integrity sha512-ZFd8a9NZXR0kGEIjMWoISXUj+buCaE9MGYbDi0sj1X1/YtHThC6nHWUwJvvT4fRa8iHT3fb6l5U0tyJFRV4Z7w== + dependencies: + "@cspell/cspell-bundled-dicts" "8.4.0" + "@cspell/cspell-pipe" "8.4.0" + "@cspell/cspell-resolver" "8.4.0" + "@cspell/cspell-types" "8.4.0" + "@cspell/dynamic-import" "8.4.0" + "@cspell/strong-weak-map" "8.4.0" clear-module "^4.1.2" - comment-json "^4.2.4" - cspell-config-lib "8.11.0" - cspell-dictionary "8.11.0" - cspell-glob "8.11.0" - cspell-grammar "8.11.0" - cspell-io "8.11.0" - cspell-trie-lib "8.11.0" - env-paths "^3.0.0" + comment-json "^4.2.3" + configstore "^6.0.0" + cspell-config-lib "8.4.0" + cspell-dictionary "8.4.0" + cspell-glob "8.4.0" + cspell-grammar "8.4.0" + cspell-io "8.4.0" + cspell-trie-lib "8.4.0" fast-equals "^5.0.1" - gensequence "^7.0.0" + gensequence "^6.0.0" import-fresh "^3.3.0" resolve-from "^5.0.0" vscode-languageserver-textdocument "^1.0.11" vscode-uri "^3.0.8" - xdg-basedir "^5.1.0" - -cspell-trie-lib@8.11.0: - version "8.11.0" - resolved "https://registry.yarnpkg.com/cspell-trie-lib/-/cspell-trie-lib-8.11.0.tgz#ebe8e3168e7be7bac5fa579dc8a13e79f4ca0fcc" - integrity sha512-PRW2ve2F3LBN1a/AwuuxHJ+VHPh9mN01qDAnyQojfqoF7ckRBe7+8Jb+7V9GonBS/oFQJ7AwObXtM2j0FP/DnQ== - dependencies: - "@cspell/cspell-pipe" "8.11.0" - "@cspell/cspell-types" "8.11.0" - gensequence "^7.0.0" - -cspell@^8.3.2: - version "8.11.0" - resolved "https://registry.yarnpkg.com/cspell/-/cspell-8.11.0.tgz#682090113986ad73e59d58011d5d7ccc1c8c021d" - integrity sha512-nyzeSk/Rj4dcuXIV9a3Ri9pJW5gAVDJtTUhyNW9a5rjNcQn+k8uxV8eBgx5s42ESSQrmUh3HhocYy2jLEolunw== - dependencies: - "@cspell/cspell-json-reporter" "8.11.0" - "@cspell/cspell-pipe" "8.11.0" - "@cspell/cspell-types" "8.11.0" - "@cspell/dynamic-import" "8.11.0" + +cspell-trie-lib@8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/cspell-trie-lib/-/cspell-trie-lib-8.4.0.tgz#428cab4962c6c7424a7a00701a9e825b8953fa35" + integrity sha512-hsldLrvXnkjTPbhN2isDpJv3qLFWpmt0S3CFpQMUVo10f2CVrcRRXMXXjXnrlHBkMSDLx2eewUjLP2RifXJJyQ== + dependencies: + "@cspell/cspell-pipe" "8.4.0" + "@cspell/cspell-types" "8.4.0" + gensequence "^6.0.0" + +cspell@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/cspell/-/cspell-8.4.0.tgz#c53bc4e30db57fed1bfa9b6ef3ff566fb8f0f8d2" + integrity sha512-1PW0w51V9n6NApf8Jbfji09jyRg7gHDm4acn1UbOd+v3gkefuaofYeMyLyupY5igloeIukTkvi3mxo+vu0hpxg== + dependencies: + "@cspell/cspell-json-reporter" "8.4.0" + "@cspell/cspell-pipe" "8.4.0" + "@cspell/cspell-types" "8.4.0" + "@cspell/dynamic-import" "8.4.0" chalk "^5.3.0" chalk-template "^1.1.0" - commander "^12.1.0" - cspell-gitignore "8.11.0" - cspell-glob "8.11.0" - cspell-io "8.11.0" - cspell-lib "8.11.0" + commander "^12.0.0" + cspell-gitignore "8.4.0" + cspell-glob "8.4.0" + cspell-io "8.4.0" + cspell-lib "8.4.0" fast-glob "^3.3.2" fast-json-stable-stringify "^2.1.0" file-entry-cache "^8.0.0" get-stdin "^9.0.0" - semver "^7.6.2" + semver "^7.6.0" strip-ansi "^7.1.0" vscode-uri "^3.0.8" -cypress@13.7.0: - version "13.7.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.7.0.tgz#19e53c0bd6eca5e3bde0d6ac9e98fbf1782e3a9e" - integrity sha512-UimjRSJJYdTlvkChcdcfywKJ6tUYuwYuk/n1uMMglrvi+ZthNhoRYcxnWgTqUtkl17fXrPAsD5XT2rcQYN1xKA== +cypress@^13.7.0: + version "13.13.1" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.13.1.tgz#860c1142a6e58ea412a764f0ce6ad07567721129" + integrity sha512-8F9UjL5MDUdgC/S5hr8CGLHbS5gGht5UOV184qc2pFny43fnkoaKxlzH/U6//zmGu/xRTaKimNfjknLT8+UDFg== dependencies: "@cypress/request" "^3.0.0" "@cypress/xvfb" "^1.2.4" @@ -2750,7 +3042,7 @@ cypress@13.7.0: request-progress "^3.0.0" semver "^7.5.3" supports-color "^8.1.1" - tmp "~0.2.1" + tmp "~0.2.3" untildify "^4.0.0" yauzl "^2.10.0" @@ -2771,6 +3063,11 @@ data-uri-to-buffer@^2.0.0: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz#d296973d5a4897a5dbe31716d118211921f04770" integrity sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA== +data-uri-to-buffer@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" + integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== + data-uri-to-buffer@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" @@ -2809,9 +3106,16 @@ date-fns@^3.6.0: integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== dayjs@^1.10.4: - version "1.11.11" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.11.tgz#dfe0e9d54c5f8b68ccf8ca5f72ac603e7e5ed59e" - integrity sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg== + version "1.11.10" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" + integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== + +debug@4.3.4, 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== + dependencies: + ms "2.1.2" debug@^3.1.0: version "3.2.7" @@ -2820,7 +3124,7 @@ debug@^3.1.0: dependencies: ms "^2.1.1" -debug@^4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.4: +debug@^4: version "4.3.5" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== @@ -2840,6 +3144,11 @@ decamelize@^1.1.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== +deep-freeze@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/deep-freeze/-/deep-freeze-0.0.1.tgz#3a0b0005de18672819dfd38cd31f91179c893e84" + integrity sha512-Z+z8HiAvsGwmjqlphnHW5oz6yWlOwu6EQfFTjmeTWlDeda3FS2yv3jhq35TX/ewmsnqB+RX2IdsIOyjJCQN5tg== + deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -2906,10 +3215,22 @@ dot-prop@^5.1.0: dependencies: is-obj "^2.0.0" +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== + dependencies: + is-obj "^2.0.0" + dotenv@^16.4.4: - version "16.4.5" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" - integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + version "16.4.4" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.4.tgz#a26e7bb95ebd36272ebb56edb80b826aecf224c1" + integrity sha512-XvPXc8XAQThSjAbY6cQ/9PcBXmFoWuw1sQ3b8HqUCR6ziGXjkTi//kB9SWa2UwqlgdAIuRqAa/9hVljzPehbYg== + +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== easy-table@1.2.0: version "1.2.0" @@ -2951,6 +3272,18 @@ 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== + +encode-registry@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/encode-registry/-/encode-registry-3.0.1.tgz#cb925d0db14ce59b18882b62c67133721b0846d1" + integrity sha512-6qOwkl1g0fv0DN3Y3ggr2EaZXN71aoAqPp3p/pVaWSBSIo+YjLOWN61Fva43oVyQNPf7kgm8lkudzlzojwE2jw== + dependencies: + mem "^8.0.0" + end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -2966,10 +3299,10 @@ enquirer@^2.3.6: ansi-colors "^4.1.1" strip-ansi "^6.0.1" -env-paths@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-3.0.0.tgz#2f1e89c2f6dbd3408e1b1711dd82d62e317f58da" - integrity sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A== +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== error-ex@^1.3.1: version "1.3.2" @@ -3095,63 +3428,63 @@ esbuild@0.17.19: "@esbuild/win32-ia32" "0.17.19" "@esbuild/win32-x64" "0.17.19" -esbuild@^0.20.0: - version "0.20.2" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" - integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== +esbuild@^0.20.1: + version "0.20.1" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.1.tgz#1e4cbb380ad1959db7609cb9573ee77257724a3e" + integrity sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA== optionalDependencies: - "@esbuild/aix-ppc64" "0.20.2" - "@esbuild/android-arm" "0.20.2" - "@esbuild/android-arm64" "0.20.2" - "@esbuild/android-x64" "0.20.2" - "@esbuild/darwin-arm64" "0.20.2" - "@esbuild/darwin-x64" "0.20.2" - "@esbuild/freebsd-arm64" "0.20.2" - "@esbuild/freebsd-x64" "0.20.2" - "@esbuild/linux-arm" "0.20.2" - "@esbuild/linux-arm64" "0.20.2" - "@esbuild/linux-ia32" "0.20.2" - "@esbuild/linux-loong64" "0.20.2" - "@esbuild/linux-mips64el" "0.20.2" - "@esbuild/linux-ppc64" "0.20.2" - "@esbuild/linux-riscv64" "0.20.2" - "@esbuild/linux-s390x" "0.20.2" - "@esbuild/linux-x64" "0.20.2" - "@esbuild/netbsd-x64" "0.20.2" - "@esbuild/openbsd-x64" "0.20.2" - "@esbuild/sunos-x64" "0.20.2" - "@esbuild/win32-arm64" "0.20.2" - "@esbuild/win32-ia32" "0.20.2" - "@esbuild/win32-x64" "0.20.2" - -esbuild@~0.21.5: - version "0.21.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" - integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== + "@esbuild/aix-ppc64" "0.20.1" + "@esbuild/android-arm" "0.20.1" + "@esbuild/android-arm64" "0.20.1" + "@esbuild/android-x64" "0.20.1" + "@esbuild/darwin-arm64" "0.20.1" + "@esbuild/darwin-x64" "0.20.1" + "@esbuild/freebsd-arm64" "0.20.1" + "@esbuild/freebsd-x64" "0.20.1" + "@esbuild/linux-arm" "0.20.1" + "@esbuild/linux-arm64" "0.20.1" + "@esbuild/linux-ia32" "0.20.1" + "@esbuild/linux-loong64" "0.20.1" + "@esbuild/linux-mips64el" "0.20.1" + "@esbuild/linux-ppc64" "0.20.1" + "@esbuild/linux-riscv64" "0.20.1" + "@esbuild/linux-s390x" "0.20.1" + "@esbuild/linux-x64" "0.20.1" + "@esbuild/netbsd-x64" "0.20.1" + "@esbuild/openbsd-x64" "0.20.1" + "@esbuild/sunos-x64" "0.20.1" + "@esbuild/win32-arm64" "0.20.1" + "@esbuild/win32-ia32" "0.20.1" + "@esbuild/win32-x64" "0.20.1" + +esbuild@~0.19.10: + version "0.19.12" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" + integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== optionalDependencies: - "@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" + "@esbuild/aix-ppc64" "0.19.12" + "@esbuild/android-arm" "0.19.12" + "@esbuild/android-arm64" "0.19.12" + "@esbuild/android-x64" "0.19.12" + "@esbuild/darwin-arm64" "0.19.12" + "@esbuild/darwin-x64" "0.19.12" + "@esbuild/freebsd-arm64" "0.19.12" + "@esbuild/freebsd-x64" "0.19.12" + "@esbuild/linux-arm" "0.19.12" + "@esbuild/linux-arm64" "0.19.12" + "@esbuild/linux-ia32" "0.19.12" + "@esbuild/linux-loong64" "0.19.12" + "@esbuild/linux-mips64el" "0.19.12" + "@esbuild/linux-ppc64" "0.19.12" + "@esbuild/linux-riscv64" "0.19.12" + "@esbuild/linux-s390x" "0.19.12" + "@esbuild/linux-x64" "0.19.12" + "@esbuild/netbsd-x64" "0.19.12" + "@esbuild/openbsd-x64" "0.19.12" + "@esbuild/sunos-x64" "0.19.12" + "@esbuild/win32-arm64" "0.19.12" + "@esbuild/win32-ia32" "0.19.12" + "@esbuild/win32-x64" "0.19.12" escalade@^3.1.1: version "3.1.2" @@ -3168,6 +3501,24 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +eslint-config-prettier@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" + integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== + +eslint-plugin-filename-rules@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-filename-rules/-/eslint-plugin-filename-rules-1.3.1.tgz#8fb769f2c19dc832b43c13d76c1442bca4a2f4a4" + integrity sha512-kBMxGFvK3QrRBHMurhFSNa+PFdszezVtBV6egg39TDzlj6D4jL3Xx6oyNjm5xE4C+TdQUBzWwymHJHBPyxOreA== + +eslint-plugin-prettier@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz#17cfade9e732cef32b5f5be53bd4e07afd8e67e1" + integrity sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw== + dependencies: + prettier-linter-helpers "^1.0.0" + synckit "^0.8.6" + eslint-plugin-sonarjs@^0.24.0: version "0.24.0" resolved "https://registry.yarnpkg.com/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.24.0.tgz#b594ccb9b1d6123edd3c3fe3a45b4392e14932d7" @@ -3187,15 +3538,15 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.56.0: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + version "8.56.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" + integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" + "@eslint/js" "8.56.0" + "@humanwhocodes/config-array" "^0.11.13" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" "@ungap/structured-clone" "^1.2.0" @@ -3347,6 +3698,21 @@ execa@4.1.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -3362,21 +3728,6 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -execa@~8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" - integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" - strip-final-newline "^3.0.0" - executable@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" @@ -3420,12 +3771,17 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + fast-equals@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-5.0.1.tgz#a4eefe3c5d1c0d021aeed0bc10ba5e0c12ee405d" integrity sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ== -fast-glob@^3.2.9, fast-glob@^3.3.2: +fast-glob@3.3.2, fast-glob@^3.2.9, fast-glob@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -3446,12 +3802,17 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-safe-stringify@^2.0.7: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + fast-uri@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== -fastq@^1.6.0: +fastq@^1.15.0, fastq@^1.6.0: version "1.17.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== @@ -3465,6 +3826,11 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" +fetch-blob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-2.1.2.tgz#a7805db1361bd44c1ef62bb57fb5fe8ea173ef3c" + integrity sha512-YKqtUDwqLyfyMnmbw8XD6Q8j9i/HggKtPEI+pZ1+8bvheBu78biSmNaXWusx1TauGqtUUGx/cBb1mKdq2rLYow== + fetch-blob@^3.1.2, fetch-blob@^3.1.4: version "3.2.0" resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" @@ -3501,6 +3867,16 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" +filter-iterator@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/filter-iterator/-/filter-iterator-0.0.1.tgz#0a2ecf07d6c06f96bdeb6846f8e88b57b8da1f37" + integrity sha512-v4lhL7Qa8XpbW3LN46CEnmhGk3eHZwxfNl5at20aEkreesht4YKb/Ba3BUIbnPhAC/r3dmu7ABaGk6MAvh2alA== + +filter-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" + integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== + find-up-simple@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/find-up-simple/-/find-up-simple-1.0.0.tgz#21d035fde9fdbd56c8f4d2f63f32fd93a1cfc368" @@ -3556,6 +3932,14 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" +foreground-child@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7" + integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -3586,6 +3970,15 @@ formdata-polyfill@^4.0.10: dependencies: fetch-blob "^3.1.2" +fs-extra@10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" @@ -3626,10 +4019,10 @@ functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -gensequence@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/gensequence/-/gensequence-7.0.0.tgz#bb6aedec8ff665e3a6c42f92823121e3a6ea7718" - integrity sha512-47Frx13aZh01afHJTB3zTtKIlFI6vWY+MYCN9Qpew6i52rfKjnhCF/l1YlC8UmEMvvntZZ6z4PiCcmyuedR2aQ== +gensequence@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gensequence/-/gensequence-6.0.0.tgz#ae46a0f89ebd7cc334e45cfb8f1c99a65248694e" + integrity sha512-8WwuywE9pokJRAcg2QFR/plk3cVPebSUqRPzpGQh3WQ0wIiHAw+HyOQj5IuHyUTQBHpBKFoB2JUMu9zT3vJ16Q== get-caller-file@^2.0.5: version "2.0.5" @@ -3691,10 +4084,10 @@ get-symbol-description@^1.0.2: es-errors "^1.3.0" get-intrinsic "^1.2.4" -get-tsconfig@^4.7.5: - version "4.7.5" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.5.tgz#5e012498579e9a6947511ed0cd403272c7acbbaf" - integrity sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw== +get-tsconfig@^4.7.2: + version "4.7.6" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.6.tgz#118fd5b7b9bae234cc7705a00cd771d7eb65d62a" + integrity sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA== dependencies: resolve-pkg-maps "^1.0.0" @@ -3742,6 +4135,17 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== +glob@^10.2.2: + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + glob@^7.1.3: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -3809,7 +4213,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: +graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.6: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -3844,6 +4248,11 @@ has-own-prop@^2.0.0: resolved "https://registry.yarnpkg.com/has-own-prop/-/has-own-prop-2.0.0.tgz#f0f95d58f65804f5d218db32563bb85b8e0417af" integrity sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ== +has-own-property@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-own-property/-/has-own-property-0.1.0.tgz#992b0f5bb3a25416f8d4d0cde53f497b9d7b1ea5" + integrity sha512-14qdBKoonU99XDhWcFKZTShK+QV47qU97u8zzoVo9cL5TZ3BmBHXogItSt9qJjR0KUMFRhcCW8uGIGl8nkl7Aw== + has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" @@ -3904,6 +4313,13 @@ hosted-git-info@^4.0.1: dependencies: lru-cache "^6.0.0" +hosted-git-info@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-7.0.2.tgz#9b751acac097757667f30114607ef7b661ff4f17" + integrity sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w== + dependencies: + lru-cache "^10.0.1" + http-signature@~1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" @@ -3929,9 +4345,14 @@ human-signals@^5.0.0: integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== husky@^9.0.11: - version "9.1.0" - resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.0.tgz#8a089536efb5736f1a48fa3b03e18168158d7269" - integrity sha512-8XCjbomYTGdNF2h50dio3T3zghmZ9f/ZNzr99YwSkvDdhEjJGs5qzy8tbFx+SG8yCx2wn9nMVfZxVrr/yT8gNQ== + version "9.0.11" + resolved "https://registry.yarnpkg.com/husky/-/husky-9.0.11.tgz#fc91df4c756050de41b3e478b2158b87c1e79af9" + integrity sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw== + +identity-function@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/identity-function/-/identity-function-1.0.0.tgz#bea1159f0985239be3ca348edf40ce2f0dd2c21d" + integrity sha512-kNrgUK0qI+9qLTBidsH85HjDLpZfrrS0ElquKKe/fJFdB3D7VeKdXXEvOPDUHSHOzdZKCAAaQIWWyp0l2yq6pw== ieee754@^1.1.13: version "1.2.1" @@ -3943,7 +4364,7 @@ ignore-by-default@^1.0.1: resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== -ignore@^5.1.8, ignore@^5.2.0, ignore@^5.3.1: +ignore@^5.1.8, ignore@^5.2.0, ignore@^5.2.4: version "5.3.1" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== @@ -3956,7 +4377,7 @@ import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0: parent-module "^1.0.0" resolve-from "^4.0.0" -import-meta-resolve@^4.1.0: +import-meta-resolve@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#f9db8bead9fafa61adb811db77a2bf22c5399706" integrity sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw== @@ -3971,6 +4392,11 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== +individual@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/individual/-/individual-3.0.0.tgz#e7ca4f85f8957b018734f285750dc22ec2f9862d" + integrity sha512-rUY5vtT748NMRbEMrTNiFfy29BgGZwGXUi2NFUVMWQrogSLzlJvQV9eeMWi+g1aVaQ53tpyLAQtd5x/JH0Nh1g== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -3999,6 +4425,11 @@ ini@^1.3.4: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +ini@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.3.tgz#4c359675a6071a46985eb39b14e4a2c0ec98a795" + integrity sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg== + internal-slot@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" @@ -4056,9 +4487,9 @@ is-ci@^3.0.1: ci-info "^3.2.0" is-core-module@^2.13.0, is-core-module@^2.5.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1" - integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A== + version "2.15.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.0.tgz#71c72ec5442ace7e76b306e9d48db361f22699ea" + integrity sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA== dependencies: hasown "^2.0.2" @@ -4113,6 +4544,11 @@ is-installed-globally@~0.4.0: global-dirs "^3.0.0" is-path-inside "^3.0.2" +is-iterable@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-iterable/-/is-iterable-1.1.1.tgz#71f9aa6f113e1d968ebe1d41cff4c8fb23a817bc" + integrity sha512-EdOZCr0NsGE00Pot+x1ZFx9MJK3C6wy91geZpXwvwexDLJvA4nzYyZf7r+EIwSeVsOLDdBz7ATg9NqKTzuNYuQ== + 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" @@ -4125,6 +4561,11 @@ is-number-object@^1.0.4: dependencies: has-tostringtag "^1.0.0" +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -4198,7 +4639,7 @@ is-typed-array@^1.1.13: dependencies: which-typed-array "^1.1.14" -is-typedarray@~1.0.0: +is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== @@ -4225,15 +4666,34 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isexe@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" + integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== -jiti@^1.19.1, jiti@^1.21.6: - version "1.21.6" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" - integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== +iterable-lookahead@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/iterable-lookahead/-/iterable-lookahead-1.0.0.tgz#896dfcb78680bdb50036e97edb034c8b68a9737f" + integrity sha512-hJnEP2Xk4+44DDwJqUQGdXal5VbyeWLaPyDl2AQc242Zr7iqz4DgpQOrEzglWVMGHMDCkguLHEKxd1+rOsmgSQ== + +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jiti@1.21.0, jiti@^1.19.1: + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== js-sha3@0.8.0: version "0.8.0" @@ -4245,7 +4705,7 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^4.1.0: +js-yaml@4.1.0, js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== @@ -4272,6 +4732,11 @@ json-parse-even-better-errors@^2.3.0: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-parse-even-better-errors@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz#b43d35e89c0f3be6b5fbbe9dc6c82467b30c28da" + integrity sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -4292,7 +4757,7 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stringify-safe@~5.0.1: +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== @@ -4334,26 +4799,33 @@ kind-of@^6.0.3: integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== knip@^5.0.1: - version "5.26.0" - resolved "https://registry.yarnpkg.com/knip/-/knip-5.26.0.tgz#52a063bc8ef107b79e96654fd72b34b3ebcc75c8" - integrity sha512-vOp+Wk86aqlPwElrUpxXyg6Q8w+j0j6wuzyu5p6k/mBWUI8iP91PCAz1Jzz9PGq5JYdptV7rFBYB9vHr7AFgqg== - dependencies: - "@nodelib/fs.walk" "1.2.8" + version "5.0.1" + resolved "https://registry.yarnpkg.com/knip/-/knip-5.0.1.tgz#8967bf4ba179f2c3227e87610ca9a73dd97212f4" + integrity sha512-rvZbe2JIpx+3i+ZC3XpLpKPp6oII9f5w1MOMsXwS1JnuYVuNd4R2i4eon2hFds9a+pf8F10DC1Gvt1W8SIBw3A== + dependencies: + "@ericcornelissen/bash-parser" "0.5.2" + "@nodelib/fs.walk" "2.0.0" + "@npmcli/map-workspaces" "3.0.4" + "@npmcli/package-json" "5.0.0" + "@pnpm/logger" "5.0.0" + "@pnpm/workspace.pkgs-graph" "^2.0.14" "@snyk/github-codeowners" "1.1.0" + "@types/picomatch" "2.3.3" easy-table "1.2.0" - fast-glob "^3.3.2" - jiti "^1.21.6" - js-yaml "^4.1.0" - minimist "^1.2.8" - picocolors "^1.0.0" - picomatch "^4.0.1" - pretty-ms "^9.0.0" - resolve "^1.22.8" - smol-toml "^1.1.4" + fast-glob "3.3.2" + jiti "1.21.0" + js-yaml "4.1.0" + micromatch "4.0.5" + minimist "1.2.8" + picocolors "1.0.0" + picomatch "4.0.1" + pretty-ms "9.0.0" + semver "7.6.0" + smol-toml "1.1.4" strip-json-comments "5.0.1" summary "2.1.0" - zod "^3.22.4" - zod-validation-error "^3.0.3" + zod "3.22.4" + zod-validation-error "3.0.0" lazy-ass@^1.6.0: version "1.6.0" @@ -4380,10 +4852,10 @@ libsodium@^0.7.14: resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.14.tgz#d9daace70dbc36051b947d37999bb6337c364c88" integrity sha512-/pOd7eO6oZrfORquRTC4284OUJFcMi8F3Vnc9xtRBT0teLfOUxWIItaBFF3odYjZ7nlJNwnLdUVEUFHxVyX/Sw== -lilconfig@~3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" - integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== +lilconfig@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.0.0.tgz#f8067feb033b5b74dab4602a5f5029420be749bc" + integrity sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g== lines-and-columns@^1.1.6: version "1.2.4" @@ -4391,20 +4863,32 @@ lines-and-columns@^1.1.6: integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== lint-staged@^15.2.2: - version "15.2.7" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.7.tgz#97867e29ed632820c0fb90be06cd9ed384025649" - integrity sha512-+FdVbbCZ+yoh7E/RosSdqKJyUM2OEjTciH0TFNkawKgvFp1zbGlEC39RADg+xKBG1R4mhoH2j85myBQZ5wR+lw== - dependencies: - chalk "~5.3.0" - commander "~12.1.0" - debug "~4.3.4" - execa "~8.0.1" - lilconfig "~3.1.1" - listr2 "~8.2.1" - micromatch "~4.0.7" - pidtree "~0.6.0" - string-argv "~0.3.2" - yaml "~2.4.2" + version "15.2.2" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.2.2.tgz#ad7cbb5b3ab70e043fa05bff82a09ed286bc4c5f" + integrity sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw== + dependencies: + chalk "5.3.0" + commander "11.1.0" + debug "4.3.4" + execa "8.0.1" + lilconfig "3.0.0" + listr2 "8.0.1" + micromatch "4.0.5" + pidtree "0.6.0" + string-argv "0.3.2" + yaml "2.3.4" + +listr2@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.0.1.tgz#4d3f50ae6cec3c62bdf0e94f5c2c9edebd4b9c34" + integrity sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA== + dependencies: + cli-truncate "^4.0.0" + colorette "^2.0.20" + eventemitter3 "^5.0.1" + log-update "^6.0.0" + rfdc "^1.3.0" + wrap-ansi "^9.0.0" listr2@^3.8.3: version "3.14.0" @@ -4420,18 +4904,6 @@ listr2@^3.8.3: through "^2.3.8" wrap-ansi "^7.0.0" -listr2@~8.2.1: - version "8.2.3" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.2.3.tgz#c494bb89b34329cf900e4e0ae8aeef9081d7d7a5" - integrity sha512-Lllokma2mtoniUOS94CcOErHWAug5iu7HOmDrvWgpw8jyQH2fomgB+7lZS4HWZxytUuQwkGOwe49FvwVaA85Xw== - dependencies: - cli-truncate "^4.0.0" - colorette "^2.0.20" - eventemitter3 "^5.0.1" - log-update "^6.0.0" - rfdc "^1.4.1" - wrap-ansi "^9.0.0" - load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -4442,6 +4914,16 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.0.0" +load-json-file@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-6.2.0.tgz#5c7770b42cafa97074ca2848707c61662f4251a1" + integrity sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ== + dependencies: + graceful-fs "^4.1.15" + parse-json "^5.0.0" + strip-bom "^4.0.0" + type-fest "^0.6.0" + locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -4461,6 +4943,11 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== +lodash.curry@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" + integrity sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA== + lodash.isfunction@^3.0.9: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" @@ -4545,6 +5032,16 @@ log-update@^6.0.0: strip-ansi "^7.1.0" wrap-ansi "^9.0.0" +lru-cache@^10.0.1, "lru-cache@^9.1.1 || ^10.0.0": + version "10.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + +lru-cache@^10.0.2: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -4552,6 +5049,13 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +magic-string@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.16.0.tgz#970ebb0da7193301285fb1aa650f39bdd81eb45a" + integrity sha512-c4BEos3y6G2qO0B9X7K0FVLOPT9uGrjYwYRLFmDqyl5YMboUviyecnXWp94fJTSMwPw2/sf+CEYt5AGpmklkkQ== + dependencies: + vlq "^0.2.1" + magic-string@^0.25.3: version "0.25.9" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" @@ -4559,16 +5063,44 @@ magic-string@^0.25.3: dependencies: sourcemap-codec "^1.4.8" +map-age-cleaner@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== +map-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" + integrity sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ== + map-obj@^4.0.0: version "4.3.0" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== +mem@^6.0.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/mem/-/mem-6.1.1.tgz#ea110c2ebc079eca3022e6b08c85a795e77f6318" + integrity sha512-Ci6bIfq/UgcxPTYa8dQQ5FY3BzKkT894bwXWXxC/zqs0XgMO2cT20CGkOqda7gZNkmK5VP4x89IGZ6K7hfbn3Q== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^3.0.0" + +mem@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/mem/-/mem-8.1.1.tgz#cf118b357c65ab7b7e0817bdf00c8062297c0122" + integrity sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^3.1.0" + memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" @@ -4606,7 +5138,15 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -micromatch@^4.0.4, micromatch@^4.0.7, micromatch@~4.0.7: +micromatch@4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.7" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== @@ -4636,6 +5176,11 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-fn@^3.0.0, mimic-fn@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" + integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== + mimic-fn@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" @@ -4674,6 +5219,13 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -4681,7 +5233,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.4: +minimatch@^9.0.0, minimatch@^9.0.1: version "9.0.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== @@ -4697,11 +5249,21 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.2.6, minimist@^1.2.8: +minimist@1.2.8, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" 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": + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + +minipass@^7.0.3: + 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" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -4727,6 +5289,17 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +ndjson@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ndjson/-/ndjson-2.0.0.tgz#320ac86f6fe53f5681897349b86ac6f43bfa3a19" + integrity sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ== + dependencies: + json-stringify-safe "^5.0.1" + minimist "^1.2.5" + readable-stream "^3.6.0" + split2 "^3.0.0" + through2 "^4.0.0" + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -4742,6 +5315,14 @@ node-fetch-native@^1.6.4: resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.6.4.tgz#679fc8fd8111266d47d7e72c379f1bed9acff06e" integrity sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ== +node-fetch@3.0.0-beta.9: + version "3.0.0-beta.9" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.0.0-beta.9.tgz#0a7554cfb824380dd6812864389923c783c80d9b" + integrity sha512-RdbZCEynH2tH46+tj0ua9caUHVWrd/RHnRfvly2EVdqGmI3ndS1Vn/xjm5KuGejDt2RNDQsVRLPNd2QPwcewVg== + dependencies: + data-uri-to-buffer "^3.0.1" + fetch-blob "^2.1.1" + node-fetch@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" @@ -4792,11 +5373,52 @@ normalize-package-data@^3.0.0: semver "^7.3.4" validate-npm-package-license "^3.0.1" +normalize-package-data@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-6.0.2.tgz#a7bc22167fe24025412bcff0a9651eb768b03506" + integrity sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g== + dependencies: + hosted-git-info "^7.0.0" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +npm-install-checks@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.3.0.tgz#046552d8920e801fa9f919cad569545d60e826fe" + integrity sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw== + dependencies: + semver "^7.1.1" + +npm-normalize-package-bin@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" + integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== + +npm-package-arg@^11.0.0: + version "11.0.2" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-11.0.2.tgz#1ef8006c4a9e9204ddde403035f7ff7d718251ca" + integrity sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw== + dependencies: + hosted-git-info "^7.0.0" + proc-log "^4.0.0" + semver "^7.3.5" + validate-npm-package-name "^5.0.0" + +npm-pick-manifest@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz#83562afde52b0b07cb6244361788d319ce7e8636" + integrity sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA== + dependencies: + npm-install-checks "^6.0.0" + npm-normalize-package-bin "^3.0.0" + npm-package-arg "^11.0.0" + semver "^7.3.5" + npm-run-all@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" @@ -4836,6 +5458,16 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== +object-pairs@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-pairs/-/object-pairs-0.1.0.tgz#8276eed81d60b8549d69c5f73a682ab9da4ff32f" + integrity sha512-3ECr6K831I4xX/Mduxr9UC+HPOz/d6WKKYj9p4cmC8Lg8p7g8gitzsxNX5IWlSIgFWN/a4JgrJaoAMKn20oKwA== + +object-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/object-values/-/object-values-1.0.0.tgz#72af839630119e5b98c3b02bb8c27e3237158105" + integrity sha512-+8hwcz/JnQ9EpLIXzN0Rs7DLsBpJNT/xYehtB/jU93tHYr5BFEO8E+JGQNOSqE7opVzz5cGksKFHt7uUJVLSjQ== + object.assign@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" @@ -4884,6 +5516,11 @@ ospath@^1.2.2: resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== + p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -4891,7 +5528,7 @@ p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.2: +p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -4919,6 +5556,14 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +p-memoize@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/p-memoize/-/p-memoize-4.0.1.tgz#6f4231857fec10de2504611fe820c808fa8c5f8b" + integrity sha512-km0sP12uE0dOZ5qP+s7kGVf07QngxyG0gS8sYFvFWhqlgzOsSy+m71aUejf/0akxj5W7gE//2G74qTv6b4iMog== + dependencies: + mem "^6.0.1" + mimic-fn "^3.0.0" + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -4961,6 +5606,13 @@ parse-ms@^4.0.0: resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-4.0.0.tgz#c0c058edd47c2a590151a718990533fd62803df4" integrity sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw== +parse-npm-tarball-url@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/parse-npm-tarball-url/-/parse-npm-tarball-url-3.0.0.tgz#4bcdd84b7eb824b9539182dea082f7bde2cbb24f" + integrity sha512-InpdgIdNe5xWMEUcrVQUniQKwnggBtJ7+SCwh7zQAZwbbIYZV9XdgJyhtmDSSvykFyQXoe4BINnzKTfCwWLs5g== + dependencies: + semver "^6.1.0" + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -4991,6 +5643,21 @@ 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.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-temp@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-temp/-/path-temp-2.1.0.tgz#cc68bb26d4fc301df799bb40b8c005cab0e62786" + integrity sha512-cMMJTAZlion/RWRRC48UbrDymEIt+/YSD/l8NqjneyDw2rDOBQcP5yRkMB4CYGn47KMhZvbblBP7Z79OsMw72w== + dependencies: + unique-string "^2.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" @@ -5023,31 +5690,31 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== -picocolors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== +picocolors@1.0.0, 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== + +picomatch@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.1.tgz#68c26c8837399e5819edce48590412ea07f17a07" + integrity sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -picomatch@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" - integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== +pidtree@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== pidtree@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== -pidtree@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" - integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== - pify@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -5068,17 +5735,24 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + prettier@^3.2.5: - version "3.3.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" - integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== + version "3.2.5" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" + integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== pretty-bytes@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== -pretty-ms@^9.0.0: +pretty-ms@9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-9.0.0.tgz#53c57f81171c53be7ce3fd20bdd4265422bc5929" integrity sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng== @@ -5090,11 +5764,34 @@ printable-characters@^1.0.42: resolved "https://registry.yarnpkg.com/printable-characters/-/printable-characters-1.0.42.tgz#3f18e977a9bd8eb37fcc4ff5659d7be90868b3d8" integrity sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ== +proc-log@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" + integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== + +proc-log@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-4.2.0.tgz#b6f461e4026e75fdfe228b265e9f7a00779d7034" + integrity sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA== + process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + proxy-from-env@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" @@ -5150,6 +5847,19 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== +"ramda@npm:@pnpm/ramda@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@pnpm/ramda/-/ramda-0.28.1.tgz#0f32abc5275d586a03e0dc1dd90a009ac668ff33" + integrity sha512-zcAG+lvU0fMziNeGXpPyCyCJYp5ZVrPElEE4t14jAmViaihohocZ+dDkcRIyAomox8pQsuZnv1EyHR+pOhmUWw== + +read-package-json-fast@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz#394908a9725dc7a5f14e70c8e7556dff1d2b1049" + integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== + dependencies: + json-parse-even-better-errors "^3.0.0" + npm-normalize-package-bin "^3.0.0" + read-pkg-up@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" @@ -5178,7 +5888,7 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readable-stream@3, readable-stream@^3.0.0: +readable-stream@3, readable-stream@^3.0.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== @@ -5212,6 +5922,14 @@ regexp.prototype.flags@^1.5.2: es-errors "^1.3.0" set-function-name "^2.0.1" +rename-overwrite@^5.0.0: + version "5.0.4" + resolved "https://registry.yarnpkg.com/rename-overwrite/-/rename-overwrite-5.0.4.tgz#f1a085c60c08f08a815c0decdb9c26ec4d58a85b" + integrity sha512-BOR/6Zr3F0vmTzwvkiCZaPrzv1NJZQVRhrWA4w2IQtj33owmh5Y4LRajsR4QrqdIgLlAqOLEEc1PiUf15ku9hQ== + dependencies: + "@zkochan/rimraf" "^2.1.2" + fs-extra "10.1.0" + repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" @@ -5291,12 +6009,22 @@ restore-cursor@^4.0.0: onetime "^5.1.0" signal-exit "^3.0.2" +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + 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== -rfdc@^1.3.0, rfdc@^1.4.1: +reverse-arguments@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/reverse-arguments/-/reverse-arguments-1.0.0.tgz#c28095a3a921ac715d61834ddece9027992667cd" + integrity sha512-/x8uIPdTafBqakK0TmPNJzgkLP+3H+yxpUJhCQHsLBg1rYEVNR2D8BRYNWQhVBjyOd7oo1dZRVzIkwMY2oqfYQ== + +rfdc@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== @@ -5331,7 +6059,7 @@ rollup-pluginutils@^2.8.1: dependencies: estree-walker "^0.6.1" -run-parallel@^1.1.9: +run-parallel@^1.1.9, run-parallel@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== @@ -5392,14 +6120,19 @@ selfsigned@^2.0.1: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@7.6.0: +semver@7.6.0, semver@^7.1.1, semver@^7.3.4, semver@^7.3.5, 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" -semver@^7.3.4, semver@^7.5.3, semver@^7.6.0, semver@^7.6.2: +semver@^6.1.0: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.0.0, semver@^7.3.2, semver@^7.4.0: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -5450,6 +6183,11 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote-word@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/shell-quote-word/-/shell-quote-word-1.0.1.tgz#e2bdfd22d599fd68886491677e38f560f9d469c9" + integrity sha512-lT297f1WLAdq0A4O+AknIFRP6kkiI3s8C913eJ0XqBxJbZPGWUNkRQk2u8zk4bEAjUJ5i+fSLwB6z1HzeT+DEg== + shell-quote@^1.6.1: version "1.8.1" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" @@ -5470,7 +6208,7 @@ signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^4.1.0: +signal-exit@^4.0.1, signal-exit@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== @@ -5521,10 +6259,10 @@ slice-ansi@^7.0.0: ansi-styles "^6.2.1" is-fullwidth-code-point "^5.0.0" -smol-toml@^1.1.4: - version "1.3.0" - resolved "https://registry.yarnpkg.com/smol-toml/-/smol-toml-1.3.0.tgz#5200e251fffadbb72570c84e9776d2a3eca48143" - integrity sha512-tWpi2TsODPScmi48b/OQZGi2lgUmBCHy6SZrhi/FdnnHiU1GwebbCfuQuxsC3nHaLwtYeJGPrDZDIeodDOc4pA== +smol-toml@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/smol-toml/-/smol-toml-1.1.4.tgz#08c23b105f56f17e57b0a77c7edcb10b75a62c5c" + integrity sha512-Y0OT8HezWsTNeEOSVxDnKOW/AyNXHQ4BwJNbAXlLTF5wWsBvrcHhIkE5Rf8kQMLmgf7nDX3PVOlgC6/Aiggu3Q== source-map@^0.6.1: version "0.6.1" @@ -5589,6 +6327,13 @@ sshpk@^1.14.1: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +ssri@10.0.5: + version "10.0.5" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.5.tgz#e49efcd6e36385196cb515d3a2ad6c3f0265ef8c" + integrity sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A== + dependencies: + minipass "^7.0.3" + stacktracey@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/stacktracey/-/stacktracey-2.1.8.tgz#bf9916020738ce3700d1323b32bd2c91ea71199d" @@ -5602,12 +6347,12 @@ stoppable@^1.1.0: resolved "https://registry.yarnpkg.com/stoppable/-/stoppable-1.1.0.tgz#32da568e83ea488b08e4d7ea2c3bcc9d75015d5b" integrity sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw== -string-argv@~0.3.2: +string-argv@0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 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== @@ -5616,6 +6361,15 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 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== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + string-width@^7.0.0: version "7.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" @@ -5625,6 +6379,11 @@ string-width@^7.0.0: get-east-asian-width "^1.0.0" strip-ansi "^7.1.0" +string.fromcodepoint@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string.fromcodepoint/-/string.fromcodepoint-0.2.1.tgz#8d978333c0bc92538f50f383e4888f3e5619d653" + integrity sha512-n69H31OnxSGSZyZbgBlvYIXlrMhJQ0dQAX1js1QDhpaUH6zmU3QYlj07bCwCNlPOu3oRXIubGPl2gDGnHsiCqg== + string.prototype.padend@^3.0.0: version "3.1.6" resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz#ba79cf8992609a91c872daa47c6bb144ee7f62a5" @@ -5670,14 +6429,14 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", 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== dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.1.0: +strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== @@ -5689,6 +6448,11 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" @@ -5747,6 +6511,14 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +synckit@^0.8.6: + version "0.8.8" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.8.tgz#fe7fe446518e3d3d49f5e429f443cf08b6edfcd7" + integrity sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ== + dependencies: + "@pkgr/core" "^0.1.0" + tslib "^2.6.2" + text-extensions@^2.0.0: version "2.4.0" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-2.4.0.tgz#a1cfcc50cf34da41bfd047cc744f804d1680ea34" @@ -5779,11 +6551,23 @@ tiny-invariant@^1.1.0: resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== -tmp@~0.2.1: +tmp@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== +to-no-case@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/to-no-case/-/to-no-case-1.0.2.tgz#c722907164ef6b178132c8e69930212d1b4aa16a" + integrity sha512-Z3g735FxuZY8rodxV4gH7LxClE4H0hTIyHNIHdk+vpQxjLm0cwnKXq/OFVZ76SOQmto7txVcwSCwkU5kqp+FKg== + +to-pascal-case@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-pascal-case/-/to-pascal-case-1.0.0.tgz#0bbdc8df448886ba01535e543327048d0aa1ce78" + integrity sha512-QGMWHqM6xPrcQW57S23c5/3BbYb0Tbe9p+ur98ckRnGDwD4wbbtDiYI38CfmMKNB5Iv0REjs5SNDntTwvDxzZA== + dependencies: + to-space-case "^1.0.0" + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -5791,15 +6575,22 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +to-space-case@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-space-case/-/to-space-case-1.0.0.tgz#b052daafb1b2b29dc770cea0163e5ec0ebc9fc17" + integrity sha512-rLdvwXZ39VOn1IxGL3V6ZstoTbwLRckQmn/U8ZDLuWwIXNpuZDhQ3AiRUlhTbOXFVE9C+dR51wM0CBDhk31VcA== + dependencies: + to-no-case "^1.0.0" + touch@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.1.tgz#097a23d7b161476435e5c1344a95c0f75b4a5694" integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA== tough-cookie@^4.1.3: - version "4.1.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" - integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== dependencies: psl "^1.1.33" punycode "^2.1.1" @@ -5816,7 +6607,7 @@ trim-newlines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== -ts-api-utils@^1.3.0: +ts-api-utils@^1.0.1: version "1.3.0" resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== @@ -5826,18 +6617,23 @@ tslib@2.4.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== -tslib@^2.1.0, tslib@^2.2.0: +tslib@^2.1.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.2.0: version "2.6.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== tsx@^4.7.1: - version "4.16.2" - resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.16.2.tgz#8722be119ae226ef0b4c6210d5ee90f3ba823f19" - integrity sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ== + version "4.7.1" + resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.7.1.tgz#27af6cbf4e1cdfcb9b5425b1c61bb7e668eb5e84" + integrity sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g== dependencies: - esbuild "~0.21.5" - get-tsconfig "^4.7.5" + esbuild "~0.19.10" + get-tsconfig "^4.7.2" optionalDependencies: fsevents "~2.3.3" @@ -5890,6 +6686,11 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^1.0.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== + 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" @@ -5934,10 +6735,17 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + typescript@^5.3.3: - version "5.5.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.3.tgz#e1b0a3c394190838a0b168e771b0ad56a0af0faa" - integrity sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ== + version "5.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== ufo@^1.5.3: version "1.5.4" @@ -5983,6 +6791,27 @@ undici@^5.25.4, undici@^5.28.4: pathe "^1.1.2" ufo "^1.5.3" +unescape-js@^1.0.5: + version "1.1.4" + resolved "https://registry.yarnpkg.com/unescape-js/-/unescape-js-1.1.4.tgz#4bc6389c499cb055a98364a0b3094e1c3d5da395" + integrity sha512-42SD8NOQEhdYntEiUQdYq/1V/YHwr1HLwlHuTJB5InVVdOSbgI6xu8jK5q65yIzuFCfczzyDF/7hbGzVbyCw0g== + dependencies: + string.fromcodepoint "^0.2.1" + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +unique-string@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-3.0.0.tgz#84a1c377aff5fd7a8bc6b55d8244b2bd90d75b9a" + integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== + dependencies: + crypto-random-string "^4.0.0" + universal-user-agent@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" @@ -6028,7 +6857,7 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -validate-npm-package-license@^3.0.1: +validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== @@ -6036,6 +6865,20 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +validate-npm-package-name@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz#fe8f1c50ac20afdb86f177da85b3600f0ac0d747" + integrity sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q== + dependencies: + builtins "^5.0.0" + +validate-npm-package-name@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz#f16afd48318e6f90a1ec101377fa0384cfc8c713" + integrity sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ== + dependencies: + builtins "^5.0.0" + verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -6045,6 +6888,18 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +version-selector-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/version-selector-type/-/version-selector-type-3.0.0.tgz#47c365fb4d9ca4a54e6dabcad6fb7a46265f7955" + integrity sha512-PSvMIZS7C1MuVNBXl/CDG2pZq8EXy/NW2dHIdm3bVP5N0PC8utDK8ttXLXj44Gn3J0lQE3U7Mpm1estAOd+eiA== + dependencies: + semver "^7.3.2" + +vlq@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" + integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== + vscode-languageserver-textdocument@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz#0822a000e7d4dc083312580d7575fe9e3ba2e2bf" @@ -6116,6 +6971,13 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +which@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" + integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== + dependencies: + isexe "^3.1.1" + word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" @@ -6156,6 +7018,15 @@ wrangler@^3.51.2: optionalDependencies: fsevents "~2.3.2" +"wrap-ansi-cjs@npm:wrap-ansi@^7.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== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -6165,14 +7036,14 @@ wrap-ansi@^6.2.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== +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" wrap-ansi@^9.0.0: version "9.0.0" @@ -6188,6 +7059,16 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +write-file-atomic@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + ws@7.4.6: version "7.4.6" resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" @@ -6203,7 +7084,7 @@ ws@^8.14.2, ws@^8.17.1: resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== -xdg-basedir@^5.1.0: +xdg-basedir@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== @@ -6223,7 +7104,12 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^2.4.5, yaml@~2.4.2: +yaml@2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" + integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== + +yaml@^2.3.4: version "2.4.5" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.5.tgz#60630b206dd6d84df97003d33fc1ddf6296cca5e" integrity sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg== @@ -6273,12 +7159,17 @@ youch@^3.2.2: mustache "^4.2.0" stacktracey "^2.1.8" -zod-validation-error@^3.0.3: - version "3.3.0" - resolved "https://registry.yarnpkg.com/zod-validation-error/-/zod-validation-error-3.3.0.tgz#2cfe81b62d044e0453d1aa3ae7c32a2f36dde9af" - integrity sha512-Syib9oumw1NTqEv4LT0e6U83Td9aVRk9iTXPUQr1otyV1PuXQKOvOwhMNqZIq5hluzHP2pMgnOmHEo7kPdI2mw== +zod-validation-error@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/zod-validation-error/-/zod-validation-error-3.0.0.tgz#69dee45a03ccf9739456bddb50b4d27f121c6f45" + integrity sha512-x+agsJJG9rvC7axF0xqTEdZhJkLHyIZkdOAWDJSmwGPzxNHMHwtU6w2yDOAAP6yuSfTAUhAMJRBfhVGY64ySEQ== + +zod@3.22.4: + version "3.22.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" + integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== -zod@^3.22.3, zod@^3.22.4: +zod@^3.22.3: version "3.23.8" resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== From 67dc2a6632ac8df361dd640bfe274b53f8fa9945 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=A2=E3=83=AC=E3=82=AF=E3=82=B5=E3=83=B3=E3=83=80?= =?UTF-8?q?=E3=83=BC=2Eeth?= Date: Fri, 19 Jul 2024 14:32:39 +0900 Subject: [PATCH 090/174] chore: remove unused file --- static/scripts/rewards/constants.ts | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 static/scripts/rewards/constants.ts diff --git a/static/scripts/rewards/constants.ts b/static/scripts/rewards/constants.ts deleted file mode 100644 index e69de29b..00000000 From e6f334a60131b720611035a70c174ae0cb37720c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=A2=E3=83=AC=E3=82=AF=E3=82=B5=E3=83=B3=E3=83=80?= =?UTF-8?q?=E3=83=BC=2Eeth?= Date: Mon, 22 Jul 2024 12:07:03 +0900 Subject: [PATCH 091/174] fix: static to full-stack-app --- .github/workflows/build.yml | 2 +- .github/workflows/deploy.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 44a3ac15..adf32dca 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -34,7 +34,7 @@ jobs: - name: Upload build artifact uses: actions/upload-artifact@v4 with: - name: static + name: full-stack-app path: | static functions diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index bd7ee1e7..1e62db8d 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -17,8 +17,8 @@ jobs: with: repository: ${{ github.repository }} production_branch: ${{ github.event.repository.default_branch }} - build_artifact_name: "static" - output_directory: "static" + build_artifact_name: "full-stack-app" + output_directory: "full-stack-app" current_branch: ${{ github.event.workflow_run.head_branch }} cloudflare_account_id: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} cloudflare_api_token: ${{ secrets.CLOUDFLARE_API_TOKEN }} From 8496d63311b51401fba335248d45d5265b097864 Mon Sep 17 00:00:00 2001 From: Keyrxng <106303466+Keyrxng@users.noreply.github.com> Date: Mon, 22 Jul 2024 19:01:40 +0100 Subject: [PATCH 092/174] chore: remove unused --- .cspell.json | 25 +- .github/workflows/kebab-case.yml | 15 - .github/workflows/release-please.yml | 26 -- .github/workflows/scripts/kebab-case.sh | 30 -- .github/workflows/scripts/kebabalize.sh | 31 -- .github/workflows/test.yml | 34 -- package.json | 2 +- scripts/solidity/test/Permit2.t.sol | 435 ------------------------ 8 files changed, 5 insertions(+), 593 deletions(-) delete mode 100644 .github/workflows/kebab-case.yml delete mode 100644 .github/workflows/release-please.yml delete mode 100755 .github/workflows/scripts/kebab-case.sh delete mode 100755 .github/workflows/scripts/kebabalize.sh delete mode 100644 .github/workflows/test.yml delete mode 100644 scripts/solidity/test/Permit2.t.sol diff --git a/.cspell.json b/.cspell.json index 3e83029f..1de3c234 100644 --- a/.cspell.json +++ b/.cspell.json @@ -1,13 +1,7 @@ { "$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json", "version": "0.2", - "ignorePaths": [ - "**/*.json", - "**/*.css", - "node_modules", - "**/*.log", - "/lib" - ], + "ignorePaths": ["**/*.json", "**/*.css", "node_modules", "**/*.log", "/lib"], "useGitignore": true, "language": "en", "words": [ @@ -53,18 +47,7 @@ "XDAI", "xmark" ], - "dictionaries": [ - "typescript", - "node", - "software-terms", - "html" - ], - "import": [ - "@cspell/dict-typescript/cspell-ext.json", - "@cspell/dict-node/cspell-ext.json", - "@cspell/dict-software-terms" - ], - "ignoreRegExpList": [ - "[0-9a-fA-F]{6}" - ] + "dictionaries": ["typescript", "node", "software-terms", "html"], + "import": ["@cspell/dict-typescript/cspell-ext.json", "@cspell/dict-node/cspell-ext.json", "@cspell/dict-software-terms"], + "ignoreRegExpList": ["[0-9a-fA-F]{6}"] } diff --git a/.github/workflows/kebab-case.yml b/.github/workflows/kebab-case.yml deleted file mode 100644 index 1adda494..00000000 --- a/.github/workflows/kebab-case.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: Enforce kebab-case - -on: - push: - pull_request: - -jobs: - check-filenames: - runs-on: ubuntu-latest - steps: - - name: Check out code - uses: actions/checkout@v4 - - - name: Check For Non Kebab-Cased TypeScript Files - run: .github/workflows/scripts/kebab-case.sh diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml deleted file mode 100644 index 5c626001..00000000 --- a/.github/workflows/release-please.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: release-please - -on: - workflow_dispatch: - push: - branches: - - main - -permissions: - contents: write - pull-requests: write - -jobs: - release-please: - runs-on: ubuntu-latest - steps: - - uses: google-github-actions/release-please-action@v3 - with: - release-type: node - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: "20.10.0" - registry-url: https://registry.npmjs.org/ - - run: | - yarn install --immutable --immutable-cache --check-cache diff --git a/.github/workflows/scripts/kebab-case.sh b/.github/workflows/scripts/kebab-case.sh deleted file mode 100755 index fa93d7fe..00000000 --- a/.github/workflows/scripts/kebab-case.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash -non_compliant_files=() -ignoreList=("^\.\/.git" "^\.\/\..*" "^\.\/[^\/]*$") -ignoreList+=("^\.\/node_modules") -while IFS= read -r line; do -ignoreList+=(".*$line") -done < .gitignore -while read -r file; do -basefile=$(basename "$file") -ignoreFile=false -for pattern in "${ignoreList[@]}"; do - if [[ "$file" =~ $pattern ]]; then - ignoreFile=true - break - fi -done -if $ignoreFile; then - continue -elif ! echo "$basefile" | grep -q -E "^([a-z0-9]+-)*[a-z0-9]+(\.[a-zA-Z0-9]+)?$|^([a-z0-9]+_)*[a-z0-9]+(\.[a-zA-Z0-9]+)?$"; then - non_compliant_files+=("$file") - echo "::warning file=$file::This file is not in kebab-case or snake_case" -fi -done < <(find . -type f -name '*.ts' -print | grep -E '/[a-z]+[a-zA-Z]*\.ts$') -if [ ${#non_compliant_files[@]} -ne 0 ]; then -echo "The following files are not in kebab-case or snake_case:" -for file in "${non_compliant_files[@]}"; do - echo " - $file" -done -exit 1 -fi \ No newline at end of file diff --git a/.github/workflows/scripts/kebabalize.sh b/.github/workflows/scripts/kebabalize.sh deleted file mode 100755 index 47892d48..00000000 --- a/.github/workflows/scripts/kebabalize.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -non_compliant_files=() -ignoreList=("^\.\/.git" "^\.\/\..*" "^\.\/[^\/]*$") -while IFS= read -r line; do -ignoreList+=(".*$line") -done < .gitignore -while read -r file; do -basefile=$(basename "$file") -ignoreFile=false -for pattern in "${ignoreList[@]}"; do - if [[ "$file" =~ $pattern ]]; then - ignoreFile=true - break - fi -done -if $ignoreFile; then - continue -elif ! echo "$basefile" | grep -q -E "^([a-z0-9]+-)*[a-z0-9]+(\.[a-zA-Z0-9]+)?$|^([a-z0-9]+_)*[a-z0-9]+(\.[a-zA-Z0-9]+)?$"; then - non_compliant_files+=("$file") - echo "::warning file=$file::This file is not in kebab-case or snake_case" - newfile=$(dirname "$file")/$(echo "$basefile" | sed -r 's/([a-z0-9])([A-Z])/\1-\2/g' | tr '[:upper:]' '[:lower:]' | sed 's/_/-/g') - mv "$file" "$newfile" -fi -done < <(find . -type f -name '*.ts' -print | grep -E '/[a-z]+[a-zA-Z]*\.ts$') -if [ ${#non_compliant_files[@]} -ne 0 ]; then -echo "The following files are not in kebab-case or snake_case:" -for file in "${non_compliant_files[@]}"; do - echo " - $file" -done -exit 1 -fi \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 09880b1d..00000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: test - -on: workflow_dispatch - -env: - FOUNDRY_PROFILE: ci - -jobs: - check: - strategy: - fail-fast: true - - name: Foundry project - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - with: - submodules: recursive - - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 - with: - version: nightly - - - name: Run Forge build - run: | - forge --version - forge build --sizes - id: build - - - name: Run Forge tests - run: | - forge test -vvv - id: test diff --git a/package.json b/package.json index e558cef4..d6d7ba99 100644 --- a/package.json +++ b/package.json @@ -94,4 +94,4 @@ "@commitlint/config-conventional" ] } -} +} \ No newline at end of file diff --git a/scripts/solidity/test/Permit2.t.sol b/scripts/solidity/test/Permit2.t.sol deleted file mode 100644 index 1a1c3a57..00000000 --- a/scripts/solidity/test/Permit2.t.sol +++ /dev/null @@ -1,435 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -import "forge-std/Test.sol"; -import "forge-std/console.sol"; -import "openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; -import "permit2/src/Permit2.sol"; -import "permit2/src/interfaces/ISignatureTransfer.sol"; - -contract Permit2Test is Test { - bytes32 constant TOKEN_PERMISSIONS_TYPEHASH = - keccak256("TokenPermissions(address token,uint256 amount)"); - bytes32 constant PERMIT_TRANSFER_FROM_TYPEHASH = keccak256( - "PermitTransferFrom(TokenPermissions permitted,address spender,uint256 nonce,uint256 deadline)TokenPermissions(address token,uint256 amount)" - ); - - string testMnemonic = "whale pepper wink eight disease negative renew volume dream forest clean rent"; - - // DAI address - // mainnet: 0x6b175474e89094c44da98b954eedeac495271d0f - // goerli: 0x11fE4B6AE13d2a6055C8D9cF65c55bac32B5d844 - IERC20 daiContract = IERC20(0x11fE4B6AE13d2a6055C8D9cF65c55bac32B5d844); - - // the same address on mainnet and goerli - Permit2 permit2Contract = Permit2(0x000000000022D473030F116dDEE9F6B43aC78BA3); - - address botAddress = 0xa701216C86b1fFC1F0E4D592DA4186eD519eaDf9; - address userAddress = 0x398cb4c0a4821667373DDEB713dd3371c968460b; - address userAddress2 = 0xe3E77B89CCa2A37d98359A3463822e8e888EB363; - - uint botPrivateKey = vm.deriveKey(testMnemonic, 0); - - function setUp() public { - // use goerli fork - vm.selectFork( - vm.createFork("https://goerli.infura.io/v3/42c7a210df614077867503863d375617") - ); - // bot allows permit2 to spend 1k DAI (this operation should run only once) - vm.prank(botAddress); - daiContract.approve(address(permit2Contract), 1000e18); - } - - function testPermitTransferFrom() public { - // bot (or admin) creates a signature for bounty hunter - ISignatureTransfer.PermitTransferFrom memory permitTransferFromData = ISignatureTransfer.PermitTransferFrom({ - permitted: ISignatureTransfer.TokenPermissions({ - token: address(daiContract), - amount: 1e18 - }), - nonce: 0, - deadline: block.timestamp - }); - bytes memory sig = _signPermit(permitTransferFromData, userAddress, botPrivateKey); - - // bounty hunter's balance before - uint userBalanceBefore = daiContract.balanceOf(userAddress); - - // bounty hunter calls permitTransferFrom and transfers reward - ISignatureTransfer.SignatureTransferDetails memory transferDetails = ISignatureTransfer.SignatureTransferDetails({ - to: userAddress, - requestedAmount: 1e18 - }); - vm.prank(userAddress); - permit2Contract.permitTransferFrom(permitTransferFromData, transferDetails, botAddress, sig); - - // bounty hunter's balance after - uint userBalanceAfter = daiContract.balanceOf(userAddress); - assertEq(userBalanceAfter, userBalanceBefore + 1 ether); - } - - function testPermitTransferFrom_ShouldRevert_IfNonceHasAlreadyBeenUsed() public { - // bot (or admin) creates a signature for bounty hunter - ISignatureTransfer.PermitTransferFrom memory permitTransferFromData = ISignatureTransfer.PermitTransferFrom({ - permitted: ISignatureTransfer.TokenPermissions({ - token: address(daiContract), - amount: 1e18 - }), - nonce: 0, - deadline: block.timestamp - }); - bytes memory sig = _signPermit(permitTransferFromData, userAddress, botPrivateKey); - - // bounty hunter calls permitTransferFrom and transfers reward - ISignatureTransfer.SignatureTransferDetails memory transferDetails = ISignatureTransfer.SignatureTransferDetails({ - to: userAddress, - requestedAmount: 1e18 - }); - vm.prank(userAddress); - permit2Contract.permitTransferFrom(permitTransferFromData, transferDetails, botAddress, sig); - - // bounty hunter tries to execute the same tx again - vm.prank(userAddress); - vm.expectRevert(); - permit2Contract.permitTransferFrom(permitTransferFromData, transferDetails, botAddress, sig); - } - - function testPermitTransferFrom_ShouldRevert_IfNonceIsNotValid() public { - // bot (or admin) creates a signature for bounty hunter - ISignatureTransfer.PermitTransferFrom memory permitTransferFromData = ISignatureTransfer.PermitTransferFrom({ - permitted: ISignatureTransfer.TokenPermissions({ - token: address(daiContract), - amount: 1e18 - }), - nonce: 0, - deadline: block.timestamp - }); - bytes memory sig = _signPermit(permitTransferFromData, userAddress, botPrivateKey); - - // bounty hunter calls permitTransferFrom and transfers reward - ISignatureTransfer.SignatureTransferDetails memory transferDetails = ISignatureTransfer.SignatureTransferDetails({ - to: userAddress, - requestedAmount: 1e18 - }); - permitTransferFromData.nonce = 1; - vm.prank(userAddress); - vm.expectRevert(); - permit2Contract.permitTransferFrom(permitTransferFromData, transferDetails, botAddress, sig); - } - - function testPermitTransferFrom_ShouldRevert_IfUserModifiedPermitAmount() public { - // bot (or admin) creates a signature for bounty hunter - ISignatureTransfer.PermitTransferFrom memory permitTransferFromData = ISignatureTransfer.PermitTransferFrom({ - permitted: ISignatureTransfer.TokenPermissions({ - token: address(daiContract), - amount: 1e18 - }), - nonce: 0, - deadline: block.timestamp - }); - bytes memory sig = _signPermit(permitTransferFromData, userAddress, botPrivateKey); - - // bounty hunter calls permitTransferFrom and transfers reward - ISignatureTransfer.SignatureTransferDetails memory transferDetails = ISignatureTransfer.SignatureTransferDetails({ - to: userAddress, - requestedAmount: 1e18 - }); - permitTransferFromData.permitted.amount = 2e18; - vm.prank(userAddress); - vm.expectRevert(); - permit2Contract.permitTransferFrom(permitTransferFromData, transferDetails, botAddress, sig); - } - - function testPermitTransferFrom_ShouldRevert_IfUserTriesToExecuteNotHisTx() public { - // bot (or admin) creates a signature for bounty hunter - ISignatureTransfer.PermitTransferFrom memory permitTransferFromData = ISignatureTransfer.PermitTransferFrom({ - permitted: ISignatureTransfer.TokenPermissions({ - token: address(daiContract), - amount: 1e18 - }), - nonce: 0, - deadline: block.timestamp - }); - bytes memory sig = _signPermit(permitTransferFromData, userAddress, botPrivateKey); - - // bounty hunter calls permitTransferFrom and transfers reward - ISignatureTransfer.SignatureTransferDetails memory transferDetails = ISignatureTransfer.SignatureTransferDetails({ - to: userAddress, - requestedAmount: 1e18 - }); - vm.prank(userAddress2); - vm.expectRevert(); - permit2Contract.permitTransferFrom(permitTransferFromData, transferDetails, botAddress, sig); - } - - function testPermitTransferFrom_ShouldSendRewardToAnotherAddress() public { - // bot (or admin) creates a signature for bounty hunter - ISignatureTransfer.PermitTransferFrom memory permitTransferFromData = ISignatureTransfer.PermitTransferFrom({ - permitted: ISignatureTransfer.TokenPermissions({ - token: address(daiContract), - amount: 1e18 - }), - nonce: 0, - deadline: block.timestamp - }); - bytes memory sig = _signPermit(permitTransferFromData, userAddress, botPrivateKey); - - uint user2BalanceBefore = daiContract.balanceOf(userAddress2); - - // bounty hunter calls permitTransferFrom and transfers reward - ISignatureTransfer.SignatureTransferDetails memory transferDetails = ISignatureTransfer.SignatureTransferDetails({ - to: userAddress2, - requestedAmount: 1e18 - }); - vm.prank(userAddress); - permit2Contract.permitTransferFrom(permitTransferFromData, transferDetails, botAddress, sig); - - uint user2BalanceAfter = daiContract.balanceOf(userAddress2); - assertEq(user2BalanceAfter, user2BalanceBefore + 1 ether); - } - - function testPermitTransferFrom_ShouldSendHalfOfTheReward() public { - // bot (or admin) creates a signature for bounty hunter - ISignatureTransfer.PermitTransferFrom memory permitTransferFromData = ISignatureTransfer.PermitTransferFrom({ - permitted: ISignatureTransfer.TokenPermissions({ - token: address(daiContract), - amount: 1e18 - }), - nonce: 0, - deadline: block.timestamp - }); - bytes memory sig = _signPermit(permitTransferFromData, userAddress, botPrivateKey); - - uint userBalanceBefore = daiContract.balanceOf(userAddress); - - // bounty hunter calls permitTransferFrom and transfers reward - ISignatureTransfer.SignatureTransferDetails memory transferDetails = ISignatureTransfer.SignatureTransferDetails({ - to: userAddress, - requestedAmount: 0.5 ether - }); - vm.prank(userAddress); - permit2Contract.permitTransferFrom(permitTransferFromData, transferDetails, botAddress, sig); - - uint userBalanceAfter = daiContract.balanceOf(userAddress); - assertEq(userBalanceAfter, userBalanceBefore + 0.5 ether); - } - - function testPermitTransferFrom_ShouldRevert_IfRequestedAmountIsGreaterThanPermitted() public { - // bot (or admin) creates a signature for bounty hunter - ISignatureTransfer.PermitTransferFrom memory permitTransferFromData = ISignatureTransfer.PermitTransferFrom({ - permitted: ISignatureTransfer.TokenPermissions({ - token: address(daiContract), - amount: 1e18 - }), - nonce: 0, - deadline: block.timestamp - }); - bytes memory sig = _signPermit(permitTransferFromData, userAddress, botPrivateKey); - - // bounty hunter calls permitTransferFrom and transfers reward - ISignatureTransfer.SignatureTransferDetails memory transferDetails = ISignatureTransfer.SignatureTransferDetails({ - to: userAddress, - requestedAmount: 2 ether - }); - vm.prank(userAddress); - vm.expectRevert(); - permit2Contract.permitTransferFrom(permitTransferFromData, transferDetails, botAddress, sig); - } - - function testPermitTransferFrom_ShouldRevert_IfOwnerAddressIsInvalid() public { - // bot (or admin) creates a signature for bounty hunter - ISignatureTransfer.PermitTransferFrom memory permitTransferFromData = ISignatureTransfer.PermitTransferFrom({ - permitted: ISignatureTransfer.TokenPermissions({ - token: address(daiContract), - amount: 1e18 - }), - nonce: 0, - deadline: block.timestamp - }); - bytes memory sig = _signPermit(permitTransferFromData, userAddress, botPrivateKey); - - // bounty hunter calls permitTransferFrom and transfers reward - ISignatureTransfer.SignatureTransferDetails memory transferDetails = ISignatureTransfer.SignatureTransferDetails({ - to: userAddress, - requestedAmount: 1 ether - }); - vm.prank(userAddress); - vm.expectRevert(); - permit2Contract.permitTransferFrom(permitTransferFromData, transferDetails, userAddress, sig); - } - - function testPermitTransferFrom_ShouldRevert_IfUserTriesToUseSignatureFromAlreadyPaidBounty() public { - // bot (or admin) creates a signature for bounty hunter - ISignatureTransfer.PermitTransferFrom memory permitTransferFromData = ISignatureTransfer.PermitTransferFrom({ - permitted: ISignatureTransfer.TokenPermissions({ - token: address(daiContract), - amount: 1e18 - }), - nonce: 0, - deadline: block.timestamp - }); - bytes memory sig = _signPermit(permitTransferFromData, userAddress, botPrivateKey); - - // bounty hunter calls permitTransferFrom and transfers reward - ISignatureTransfer.SignatureTransferDetails memory transferDetails = ISignatureTransfer.SignatureTransferDetails({ - to: userAddress, - requestedAmount: 1 ether - }); - vm.prank(userAddress); - permit2Contract.permitTransferFrom(permitTransferFromData, transferDetails, botAddress, sig); - - // bot (or admin) creates a 2nd signature for bounty hunter - ISignatureTransfer.PermitTransferFrom memory permitTransferFromData2 = ISignatureTransfer.PermitTransferFrom({ - permitted: ISignatureTransfer.TokenPermissions({ - token: address(daiContract), - amount: 1e18 - }), - nonce: 1, - deadline: block.timestamp - }); - - // bounty hunter calls 2nd permitTransferFrom with the old signature - ISignatureTransfer.SignatureTransferDetails memory transferDetails2 = ISignatureTransfer.SignatureTransferDetails({ - to: userAddress, - requestedAmount: 1 ether - }); - vm.prank(userAddress); - vm.expectRevert(); - permit2Contract.permitTransferFrom(permitTransferFromData2, transferDetails2, botAddress, sig); - } - - function testPermitTransferFrom_ShouldRevert_IfUserTriesToUseSignatureFromNotYetPaidBounty() public { - // bot (or admin) creates a signature for bounty hunter - ISignatureTransfer.PermitTransferFrom memory permitTransferFromData = ISignatureTransfer.PermitTransferFrom({ - permitted: ISignatureTransfer.TokenPermissions({ - token: address(daiContract), - amount: 1e18 - }), - nonce: 0, - deadline: block.timestamp - }); - bytes memory sig = _signPermit(permitTransferFromData, userAddress, botPrivateKey); - - // bot (or admin) creates a 2nd signature for bounty hunter - ISignatureTransfer.PermitTransferFrom memory permitTransferFromData2 = ISignatureTransfer.PermitTransferFrom({ - permitted: ISignatureTransfer.TokenPermissions({ - token: address(daiContract), - amount: 1e18 - }), - nonce: 1, - deadline: block.timestamp - }); - - // bounty hunter calls 2nd permitTransferFrom with the signature from tx with nonce 0 - ISignatureTransfer.SignatureTransferDetails memory transferDetails2 = ISignatureTransfer.SignatureTransferDetails({ - to: userAddress, - requestedAmount: 1 ether - }); - vm.prank(userAddress); - vm.expectRevert(); - permit2Contract.permitTransferFrom(permitTransferFromData2, transferDetails2, botAddress, sig); - } - - function testPermitTransferFrom_ShouldRevert_IfNonceHasBeenInvalidated() public { - // nonce we are invalidating - uint nonce = 999; - - // bot (or admin) creates a signature for bounty hunter - ISignatureTransfer.PermitTransferFrom memory permitTransferFromData = ISignatureTransfer.PermitTransferFrom({ - permitted: ISignatureTransfer.TokenPermissions({ - token: address(daiContract), - amount: 1e18 - }), - nonce: nonce, - deadline: block.timestamp - }); - bytes memory sig = _signPermit(permitTransferFromData, userAddress, botPrivateKey); - - // check that nonce is not used - assertFalse(_isNonceUsed(botAddress, nonce)); - - // invalidate nonce - (uint wordPos, uint mask) = _getParamsForNonceInvalidation(botAddress, nonce); - vm.prank(botAddress); - permit2Contract.invalidateUnorderedNonces(wordPos, mask); - - // check that nonce is marked as used - assertTrue(_isNonceUsed(botAddress, nonce)); - - // bounty hunter calls permitTransferFrom and transfers reward - ISignatureTransfer.SignatureTransferDetails memory transferDetails = ISignatureTransfer.SignatureTransferDetails({ - to: userAddress, - requestedAmount: 1e18 - }); - vm.prank(userAddress); - vm.expectRevert(); - permit2Contract.permitTransferFrom(permitTransferFromData, transferDetails, botAddress, sig); - } - - /** - * Helper functions - */ - - // Generate a signature for a permit message. - function _signPermit( - ISignatureTransfer.PermitTransferFrom memory permit, - address spender, - uint256 signerKey - ) - internal - view - returns (bytes memory sig) - { - (uint8 v, bytes32 r, bytes32 s) = - vm.sign(signerKey, _getEIP712Hash(permit, spender)); - return abi.encodePacked(r, s, v); - } - - // Compute the EIP712 hash of the permit object. - // Normally this would be implemented off-chain. - function _getEIP712Hash(ISignatureTransfer.PermitTransferFrom memory permit, address spender) - internal - view - returns (bytes32 h) - { - return keccak256(abi.encodePacked( - "\x19\x01", - permit2Contract.DOMAIN_SEPARATOR(), - keccak256(abi.encode( - PERMIT_TRANSFER_FROM_TYPEHASH, - keccak256(abi.encode( - TOKEN_PERMISSIONS_TYPEHASH, - permit.permitted.token, - permit.permitted.amount - )), - spender, - permit.nonce, - permit.deadline - )) - )); - } - - // Checks whether a permit nonce is used - function _isNonceUsed(address from, uint nonce) internal returns (bool) { - // find word position (first 248 bits of nonce) - uint wordPos = uint248(nonce >> 8); - // find bit position in bitmap - uint bitPos = uint8(nonce); - // prepare a mask for target bit - uint256 bit = 1 << bitPos; - // get bitmap with a flipped bit - uint sourceBitmap = permit2Contract.nonceBitmap(from, wordPos); - uint256 flipped = sourceBitmap ^= bit; - // check if any bit has been updated - return flipped & bit == 0; - } - - // Returns params to be used in "SignatureTransfer.invalidateUnorderedNonces()" - function _getParamsForNonceInvalidation(address from, uint nonce) internal returns(uint256 wordPos, uint256 mask) { - wordPos = uint248(nonce >> 8); - uint bitPos = uint8(nonce); - uint256 bit = 1 << bitPos; - uint sourceBitmap = permit2Contract.nonceBitmap(from, wordPos); - mask = sourceBitmap | bit; - } -} From a929739e4bb3dc0ef89dec43c6929111813049f1 Mon Sep 17 00:00:00 2001 From: Keyrxng <106303466+Keyrxng@users.noreply.github.com> Date: Tue, 23 Jul 2024 16:52:31 +0100 Subject: [PATCH 093/174] chore: tsconfig --- tsconfig.json | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index 5f963f32..0489e0f1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,17 +1,5 @@ { - "include": [ - "src", - "static", - "functions", - "build", - "scripts/typescript", - "globals.d.ts", - "cypress/**/*.ts", - "cypress.config.ts", - "src/**/*.ts", - "tests/**/*.ts", - ".github/**/*.ts" - ], + "include": ["functions", "build", "scripts/typescript", "globals.d.ts", "cypress/**/*.ts", "cypress.config.ts", "static/**/*.ts", ".github/**/*.ts"], "compilerOptions": { /* Visit https://aka.ms/tsconfig to read more about this file */ /* Projects */ From 28a63b5b527058394b054d8fcf44b29d6aa3d033 Mon Sep 17 00:00:00 2001 From: Keyrxng <106303466+Keyrxng@users.noreply.github.com> Date: Fri, 26 Jul 2024 10:16:17 +0100 Subject: [PATCH 094/174] chore: use blockcscan for multichain balance overview --- static/scripts/rewards/app-state.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/static/scripts/rewards/app-state.ts b/static/scripts/rewards/app-state.ts index d41cb885..3849aafa 100644 --- a/static/scripts/rewards/app-state.ts +++ b/static/scripts/rewards/app-state.ts @@ -43,9 +43,9 @@ export class AppState { get currentExplorerUrl(): string { if (!this.reward) { - return "https://etherscan.io"; + return "https://blockscan.io"; } - return networkExplorers[this.reward.networkId] || "https://etherscan.io"; + return networkExplorers[this.reward.networkId] || "https://blockscan.io"; } nextPermit(): Permit | null { From c054e2a20eab190ab1371bc6b7fcead8acb0414b Mon Sep 17 00:00:00 2001 From: Keyrxng <106303466+Keyrxng@users.noreply.github.com> Date: Fri, 26 Jul 2024 10:18:19 +0100 Subject: [PATCH 095/174] chore: fix typo --- static/scripts/rewards/app-state.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/static/scripts/rewards/app-state.ts b/static/scripts/rewards/app-state.ts index 3849aafa..54c0c354 100644 --- a/static/scripts/rewards/app-state.ts +++ b/static/scripts/rewards/app-state.ts @@ -43,9 +43,9 @@ export class AppState { get currentExplorerUrl(): string { if (!this.reward) { - return "https://blockscan.io"; + return "https://blockscan.com"; } - return networkExplorers[this.reward.networkId] || "https://blockscan.io"; + return networkExplorers[this.reward.networkId] || "https://blockscan.com"; } nextPermit(): Permit | null { From d522d96e41194c0cce92892359f5b846bd065851 Mon Sep 17 00:00:00 2001 From: EresDev Date: Sat, 27 Jul 2024 02:14:14 +0500 Subject: [PATCH 096/174] build: remove non existing kebab case scripts use --- package.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index d6d7ba99..3e667cc2 100644 --- a/package.json +++ b/package.json @@ -82,8 +82,7 @@ "lint-staged": { "*.ts": [ "yarn prettier --write", - "eslint --fix", - "bash .github/workflows/scripts/kebab-case.sh" + "eslint --fix" ], "src/**.{ts,json}": [ "cspell" @@ -94,4 +93,4 @@ "@commitlint/config-conventional" ] } -} \ No newline at end of file +} From 48f601991ecc7ef21c49f2c0129419166d203c8b Mon Sep 17 00:00:00 2001 From: EresDev Date: Sat, 27 Jul 2024 02:16:34 +0500 Subject: [PATCH 097/174] feat: list cards by user country --- functions/list-gift-cards.ts | 13 +++++-- package.json | 1 + .../rewards/gift-cards/list-gift-cards.ts | 6 +++- yarn.lock | 36 +++++++++++++++++-- 4 files changed, 49 insertions(+), 7 deletions(-) diff --git a/functions/list-gift-cards.ts b/functions/list-gift-cards.ts index 1446d82f..fc73cc32 100644 --- a/functions/list-gift-cards.ts +++ b/functions/list-gift-cards.ts @@ -8,8 +8,15 @@ export async function onRequest(ctx: Context): Promise { validateRequestMethod(ctx.request.method, "GET"); validateEnvVars(ctx); + const { searchParams } = new URL(ctx.request.url); + const country = searchParams.get("country"); + + if (!country) { + throw new Error(`Invalid query parameters: ${{ countrycode: country }}`); + } + const accessToken = await getAccessToken(ctx.env); - const [masterCards, visaCards] = await Promise.all([getGiftCards("mastercard", accessToken), getGiftCards("visa", accessToken)]); + const [masterCards, visaCards] = await Promise.all([getGiftCards("mastercard", country, accessToken), getGiftCards("visa", country, accessToken)]); const giftCards = [...masterCards, ...visaCards]; @@ -23,8 +30,8 @@ export async function onRequest(ctx: Context): Promise { } } -async function getGiftCards(productQuery: string, accessToken: AccessToken): Promise { - const url = `${getBaseUrl(accessToken.isSandbox)}/products?productName=${productQuery}`; +async function getGiftCards(productQuery: string, country: string, accessToken: AccessToken): Promise { + const url = `${getBaseUrl(accessToken.isSandbox)}/countries/${country}/products?productName=${productQuery}`; console.log(`Retrieving gift cards from ${url}`); const options = { method: "GET", diff --git a/package.json b/package.json index 3e667cc2..0ad8727b 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "@supabase/supabase-js": "^2.44.4", "@ubiquibot/permit-generation": "^1.4.1", "@ubiquity-dao/rpc-handler": "^1.1.0", + "countries-and-timezones": "^3.6.0", "dotenv": "^16.4.4", "ethers": "^5.7.2", "npm-run-all": "^4.1.5" diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index 6f20b8d7..d7e9abc3 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -8,6 +8,7 @@ import { getApiBaseUrl } from "./helpers"; import { getGiftCardActivateInfoHtml } from "./activate/activate-html"; import { getGiftCardHtml } from "./gift-card"; import { getRedeemCodeHtml } from "./reveal/redeem-code-html"; +import ct from "countries-and-timezones"; export async function initClaimGiftCard(app: AppState) { const giftCardsSection = document.getElementById("gift-cards"); @@ -25,7 +26,10 @@ export async function initClaimGiftCard(app: AppState) { activateInfoSection.innerHTML = ""; const retrieveOrderUrl = `${getApiBaseUrl()}/get-order?orderId=${getGiftCardOrderId(app.reward.beneficiary, app.reward.signature)}`; - const listGiftCardsUrl = `${getApiBaseUrl()}/list-gift-cards`; + + const localTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone; + const countries = ct.getCountriesForTimezone(localTimezone); + const listGiftCardsUrl = `${getApiBaseUrl()}/list-gift-cards?country=${countries[0].id}`; const requestInit = { method: "GET", diff --git a/yarn.lock b/yarn.lock index 3816e840..9c75a508 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2856,6 +2856,11 @@ cosmiconfig@^8.3.6: parse-json "^5.2.0" path-type "^4.0.0" +countries-and-timezones@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/countries-and-timezones/-/countries-and-timezones-3.6.0.tgz#80716f05ebef270842fd72010f9b33e2848e24c7" + integrity sha512-8/nHBCs1eKeQ1jnsZVGdqrLYxS8nPcfJn8PnmxdJXWRLZdXsGFR8gnVhRjatGDBjqmPm7H+FtYpBYTPWd0Eiqg== + cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -6352,7 +6357,16 @@ string-argv@0.3.2: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== -"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== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 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== @@ -6429,7 +6443,14 @@ 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@^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== @@ -7018,7 +7039,7 @@ wrangler@^3.51.2: optionalDependencies: fsevents "~2.3.2" -"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== @@ -7036,6 +7057,15 @@ wrap-ansi@^6.2.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== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From dc5af9865f5617d335659755ab3697bd92294173 Mon Sep 17 00:00:00 2001 From: EresDev Date: Mon, 29 Jul 2024 05:22:53 -0400 Subject: [PATCH 098/174] fix: correct type for virtual cards list response --- functions/list-gift-cards.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/functions/list-gift-cards.ts b/functions/list-gift-cards.ts index fc73cc32..c60be1ca 100644 --- a/functions/list-gift-cards.ts +++ b/functions/list-gift-cards.ts @@ -1,6 +1,6 @@ import { GiftCard } from "../shared/types"; import { commonHeaders, getAccessToken, getBaseUrl } from "./helpers"; -import { AccessToken, Context, ReloadlyFailureResponse, ReloadlyListGiftCardResponse } from "./types"; +import { AccessToken, Context, ReloadlyFailureResponse } from "./types"; import { validateEnvVars, validateRequestMethod } from "./validators"; export async function onRequest(ctx: Context): Promise { @@ -60,5 +60,5 @@ async function getGiftCards(productQuery: string, country: string, accessToken: ); } - return (responseJson as ReloadlyListGiftCardResponse).content; + return responseJson as GiftCard[]; } From 0a344d0422c4b042f9b2583ca39bad3a648cf0c1 Mon Sep 17 00:00:00 2001 From: EresDev Date: Mon, 29 Jul 2024 06:32:20 -0400 Subject: [PATCH 099/174] fix: offer only range price virtual cards excludes fixed price cards. --- functions/list-gift-cards.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/functions/list-gift-cards.ts b/functions/list-gift-cards.ts index c60be1ca..2ca15e99 100644 --- a/functions/list-gift-cards.ts +++ b/functions/list-gift-cards.ts @@ -21,8 +21,10 @@ export async function onRequest(ctx: Context): Promise { const giftCards = [...masterCards, ...visaCards]; if (giftCards.length) { - return Response.json(giftCards, { status: 200 }); + const giftCardsRangePriced = giftCards.filter((giftCard) => giftCard.denominationType == "RANGE"); + return Response.json(giftCardsRangePriced, { status: 200 }); } + return Response.json({ message: "There are no gift cards available." }, { status: 404 }); } catch (error) { console.error("There was an error while processing your request.", error); From c91b937313401d288e63b8a3b7888ce1d9ecc4b6 Mon Sep 17 00:00:00 2001 From: EresDev Date: Mon, 29 Jul 2024 06:51:18 -0400 Subject: [PATCH 100/174] fix: remove also available in price section --- .../scripts/rewards/gift-cards/gift-card.ts | 24 +++---------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/static/scripts/rewards/gift-cards/gift-card.ts b/static/scripts/rewards/gift-cards/gift-card.ts index cae42394..3294a8d2 100644 --- a/static/scripts/rewards/gift-cards/gift-card.ts +++ b/static/scripts/rewards/gift-cards/gift-card.ts @@ -1,6 +1,6 @@ import { BigNumberish } from "ethers"; import { GiftCard } from "../../../../shared/types"; -import { getFixedPriceToValueMap, getGiftCardValue, getRangePriceToValueMap, isRangePriceGiftCardClaimable } from "../../../../shared/pricing"; +import { getFixedPriceToValueMap, getGiftCardValue, isRangePriceGiftCardClaimable } from "../../../../shared/pricing"; import { formatEther } from "ethers/lib/utils"; const html = String.raw; @@ -88,27 +88,9 @@ function getRangePricesHtml(giftCard: GiftCard, rewardAmount: BigNumberish) {
${formatEther(rewardAmount)}${giftCard.senderCurrencyCode}
-
${giftCardValue.toFixed(2)}${giftCard.recipientCurrencyCode}

Also available in

`; +
${giftCardValue.toFixed(2)}${giftCard.recipientCurrencyCode}
+
`; } - const priceToValueMap = getRangePriceToValueMap(giftCard); - const prices = Object.keys(priceToValueMap); - - _html += html` -
-
Value
-
${giftCard.minRecipientDenomination.toFixed(0)}-${giftCard.maxRecipientDenomination.toFixed(0)}${giftCard.recipientCurrencyCode}
-
-
-
Price
-
${Number(prices[0]).toFixed(0)}-${Number(prices[1]).toFixed(0)}${giftCard.senderCurrencyCode}
-
- `; - return _html; } From eb72bc26c8004900c15961f21c126d63a2613da6 Mon Sep 17 00:00:00 2001 From: EresDev Date: Mon, 29 Jul 2024 15:51:35 -0400 Subject: [PATCH 101/174] Revert "fix: offer only range price virtual cards" This reverts commit 0a344d0422c4b042f9b2583ca39bad3a648cf0c1. --- functions/list-gift-cards.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/functions/list-gift-cards.ts b/functions/list-gift-cards.ts index 2ca15e99..c60be1ca 100644 --- a/functions/list-gift-cards.ts +++ b/functions/list-gift-cards.ts @@ -21,10 +21,8 @@ export async function onRequest(ctx: Context): Promise { const giftCards = [...masterCards, ...visaCards]; if (giftCards.length) { - const giftCardsRangePriced = giftCards.filter((giftCard) => giftCard.denominationType == "RANGE"); - return Response.json(giftCardsRangePriced, { status: 200 }); + return Response.json(giftCards, { status: 200 }); } - return Response.json({ message: "There are no gift cards available." }, { status: 404 }); } catch (error) { console.error("There was an error while processing your request.", error); From 5d8f4bc06414cd210b60c0f4d790e67c4394fb81 Mon Sep 17 00:00:00 2001 From: EresDev Date: Mon, 29 Jul 2024 17:11:53 -0400 Subject: [PATCH 102/174] fix: offer cards only in permit amount range --- functions/post-order.ts | 7 +- shared/helpers.ts | 8 +- .../rewards/gift-cards/list-gift-cards.ts | 86 ++++++++++++------- 3 files changed, 68 insertions(+), 33 deletions(-) diff --git a/functions/post-order.ts b/functions/post-order.ts index df7bd97d..f2f59154 100644 --- a/functions/post-order.ts +++ b/functions/post-order.ts @@ -2,7 +2,7 @@ import { TransactionReceipt, TransactionResponse } from "@ethersproject/provider import { JsonRpcProvider } from "@ethersproject/providers/lib/json-rpc-provider"; import { Interface, TransactionDescription } from "ethers/lib/utils"; import { Tokens, chainIdToRewardTokenMap, giftCardTreasuryAddress, permit2Address } from "../shared/constants"; -import { getFastestRpcUrl, getGiftCardOrderId } from "../shared/helpers"; +import { getFastestRpcUrl, getGiftCardOrderId, isGiftCardAvailable } from "../shared/helpers"; import { getGiftCardValue, isClaimableForAmount } from "../shared/pricing"; import { ExchangeRate, GiftCard, OrderRequestParams } from "../shared/types"; import { permit2Abi } from "../static/scripts/rewards/abis/permit2-abi"; @@ -66,6 +66,11 @@ export async function onRequest(ctx: Context): Promise { const exchangeRateResponse = await getExchangeRate(1, giftCard.recipientCurrencyCode, accessToken); exchangeRate = exchangeRateResponse.senderAmount; } + + if (!isGiftCardAvailable(giftCard, amountDaiWei)) { + throw new Error(`The ordered gift card does not meet available criteria: ${JSON.stringify(giftCard)}`); + } + const giftCardValue = getGiftCardValue(giftCard, amountDaiWei, exchangeRate); const orderId = getGiftCardOrderId(txReceipt.from, txParsed.args.signature); diff --git a/shared/helpers.ts b/shared/helpers.ts index 76ab3609..34fb0679 100644 --- a/shared/helpers.ts +++ b/shared/helpers.ts @@ -1,5 +1,7 @@ -import { ethers } from "ethers"; +import { BigNumberish, ethers } from "ethers"; import { RPCHandler } from "@ubiquity-dao/rpc-handler"; +import { GiftCard } from "./types"; +import { isRangePriceGiftCardClaimable } from "./pricing"; export function getGiftCardOrderId(rewardToAddress: string, signature: string) { const checksumAddress = ethers.utils.getAddress(rewardToAddress); @@ -30,3 +32,7 @@ export async function getFastestRpcUrl(networkId: string | number) { const provider = await handler.getFastestRpcProvider(); return provider.connection.url; } + +export function isGiftCardAvailable(giftCard: GiftCard, reward: BigNumberish): boolean { + return giftCard.denominationType == "RANGE" && isRangePriceGiftCardClaimable(giftCard, reward); +} diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index d7e9abc3..27f5bf51 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -1,4 +1,4 @@ -import { getGiftCardOrderId } from "../../../../shared/helpers"; +import { isGiftCardAvailable, getGiftCardOrderId } from "../../../../shared/helpers"; import { GiftCard, OrderTransaction } from "../../../../shared/types"; import { AppState } from "../app-state"; import { attachActivateInfoAction } from "./activate/activate-action"; @@ -45,47 +45,71 @@ export async function initClaimGiftCard(app: AppState) { if (retrieveOrderResponse.status == 200) { const giftCard = giftCards.find((giftCard) => transaction.product.productId == giftCard.productId); - const htmlParts: string[] = []; - htmlParts.push(`

Your gift card

`); - htmlParts.push(`
`); if (giftCard) { - htmlParts.push(getGiftCardHtml(giftCard, app.reward.amount)); + addPurchasedCardHtml(giftCard, transaction, app, giftCardsSection, activateInfoSection); } - htmlParts.push(getRedeemCodeHtml(transaction)); - htmlParts.push(`
`); - giftCardsSection.innerHTML = htmlParts.join(","); + } else if (retrieveGiftCardsResponse.status == 200) { + const availableGiftCards = giftCards.filter((giftCard: GiftCard) => { + return giftCard && isGiftCardAvailable(giftCard, app.reward.amount); + }); - const activateInfoHtmlParts: string[] = []; - if (giftCard) { - activateInfoHtmlParts.push(getGiftCardActivateInfoHtml(giftCard)); - } + addAvailableCardsHtml(availableGiftCards, app, giftCardsSection, activateInfoSection); + } else if (retrieveGiftCardsResponse.status == 404) { + giftCardsSection.innerHTML = "

There are no Visa/Mastercard available to claim at the moment.

"; + } else { + giftCardsSection.innerHTML = "

There was a problem in fetching gift cards. Try again later.

"; + } + + attachActivateInfoAction(); +} - activateInfoSection.innerHTML = activateInfoHtmlParts.join(""); +function addPurchasedCardHtml( + giftCard: GiftCard, + transaction: OrderTransaction, + app: AppState, + giftCardsSection: HTMLElement, + activateInfoSection: HTMLElement +) { + const htmlParts: string[] = []; + htmlParts.push(`

Your gift card

`); + htmlParts.push(`
`); - attachRevealAction(transaction, app); - } else if (retrieveGiftCardsResponse.status == 200) { - const htmlParts: string[] = []; - htmlParts.push(`

Or claim in virtual visa/mastercard

`); + htmlParts.push(getGiftCardHtml(giftCard, app.reward.amount)); + + htmlParts.push(getRedeemCodeHtml(transaction)); + htmlParts.push(`
`); + + giftCardsSection.innerHTML = htmlParts.join(""); + + const activateInfoHtmlParts: string[] = []; + + activateInfoHtmlParts.push(getGiftCardActivateInfoHtml(giftCard)); + + activateInfoSection.innerHTML = activateInfoHtmlParts.join(""); + + attachRevealAction(transaction, app); +} + +function addAvailableCardsHtml(giftCards: GiftCard[], app: AppState, giftCardsSection: HTMLElement, activateInfoSection: HTMLElement) { + const htmlParts: string[] = []; + htmlParts.push(`

Or claim in virtual visa/mastercard

`); + if (giftCards.length) { htmlParts.push(`
`); giftCards.forEach((giftCard: GiftCard) => { htmlParts.push(getGiftCardHtml(giftCard, app.reward.amount)); }); htmlParts.push(`
`); - - giftCardsSection.innerHTML = htmlParts.join(""); - - const activateInfoHtmlParts: string[] = []; - giftCards.forEach((giftCard: GiftCard) => { - activateInfoHtmlParts.push(getGiftCardActivateInfoHtml(giftCard)); - }); - activateInfoSection.innerHTML = activateInfoHtmlParts.join(""); - - attachClaimAction("claim-gift-card-btn", giftCards, app); - } else if (retrieveGiftCardsResponse.status == 404) { - giftCardsSection.innerHTML = "

There are no Visa/Mastercard available to claim at the moment.

"; } else { - giftCardsSection.innerHTML = "

There was a problem in fetching gift cards. Try again later.

"; + htmlParts.push(`

There are no Visa/Mastercard available to claim at the moment.

`); } - attachActivateInfoAction(); + giftCardsSection.innerHTML = htmlParts.join(""); + + const activateInfoHtmlParts: string[] = []; + giftCards.forEach((giftCard: GiftCard) => { + activateInfoHtmlParts.push(getGiftCardActivateInfoHtml(giftCard)); + }); + activateInfoSection.innerHTML = activateInfoHtmlParts.join(""); + + attachClaimAction("claim-gift-card-btn", giftCards, app); } From 937a08a4cafcc6722c53dccaf6a5547f3a85c831 Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 2 Aug 2024 07:49:45 -0400 Subject: [PATCH 103/174] fix: adjust overlapping UI elements --- static/styles/rewards/gift-cards.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/static/styles/rewards/gift-cards.css b/static/styles/rewards/gift-cards.css index 6d4d72df..321242d7 100644 --- a/static/styles/rewards/gift-cards.css +++ b/static/styles/rewards/gift-cards.css @@ -20,7 +20,8 @@ main:has(#gift-cards .gift-card) { } main:has(#gift-cards .gift-card) div:has(table.receipt) { - padding-top: 50px; + height: 120px; + margin-bottom: 32px; } .redeem-info-wrapper[data-show="false"] { display: none; From adacb7452a837e1313d673472534fcf4c08e012d Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 2 Aug 2024 07:54:53 -0400 Subject: [PATCH 104/174] fix: remove redundent code --- static/styles/rewards/pay.css | 1 - 1 file changed, 1 deletion(-) diff --git a/static/styles/rewards/pay.css b/static/styles/rewards/pay.css index ed0ee90f..79550a7c 100644 --- a/static/styles/rewards/pay.css +++ b/static/styles/rewards/pay.css @@ -161,7 +161,6 @@ footer { /* display: none; */ opacity: 0; transition: opacity 1s; - /* padding-top: 80px; */ text-align: center; } #carousel > div { From aba229363e39a898b23f1995dd156a7dba5f5eb4 Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 2 Aug 2024 08:08:48 -0400 Subject: [PATCH 105/174] fix: remove UI elements jump on cards load --- static/index.html | 2 +- static/scripts/rewards/gift-cards/list-gift-cards.ts | 2 +- static/styles/rewards/gift-cards.css | 8 -------- static/styles/rewards/pay.css | 6 +++++- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/static/index.html b/static/index.html index 5c936057..17f393b0 100644 --- a/static/index.html +++ b/static/index.html @@ -55,7 +55,7 @@
-
+
diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index 27f5bf51..6903e7e8 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -100,7 +100,7 @@ function addAvailableCardsHtml(giftCards: GiftCard[], app: AppState, giftCardsSe }); htmlParts.push(``); } else { - htmlParts.push(`

There are no Visa/Mastercard available to claim at the moment.

`); + htmlParts.push(`

There are no Visa/Mastercard available to claim at the moment.

`); } giftCardsSection.innerHTML = htmlParts.join(""); diff --git a/static/styles/rewards/gift-cards.css b/static/styles/rewards/gift-cards.css index 321242d7..329cefe1 100644 --- a/static/styles/rewards/gift-cards.css +++ b/static/styles/rewards/gift-cards.css @@ -15,14 +15,6 @@ text-align: center; } -main:has(#gift-cards .gift-card) { - height: auto; -} - -main:has(#gift-cards .gift-card) div:has(table.receipt) { - height: 120px; - margin-bottom: 32px; -} .redeem-info-wrapper[data-show="false"] { display: none; } diff --git a/static/styles/rewards/pay.css b/static/styles/rewards/pay.css index 79550a7c..15f8684f 100644 --- a/static/styles/rewards/pay.css +++ b/static/styles/rewards/pay.css @@ -136,7 +136,11 @@ header a:hover #logo { main { display: flex; flex-direction: column; - height: 100vh; /* adjust this according to your needs */ +} + +main div.receipt-container { + height: 120px; + margin-bottom: 32px; } header { From 393f139169085b1573d1a6964ec903d452e468fe Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 2 Aug 2024 08:14:25 -0400 Subject: [PATCH 106/174] fix: log correct variable name --- functions/list-gift-cards.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/list-gift-cards.ts b/functions/list-gift-cards.ts index c60be1ca..9c404382 100644 --- a/functions/list-gift-cards.ts +++ b/functions/list-gift-cards.ts @@ -12,7 +12,7 @@ export async function onRequest(ctx: Context): Promise { const country = searchParams.get("country"); if (!country) { - throw new Error(`Invalid query parameters: ${{ countrycode: country }}`); + throw new Error(`Invalid query parameters: ${{ country }}`); } const accessToken = await getAccessToken(ctx.env); From 80b429af5d1e6bcf1f118586fc985901b3c1dab2 Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 2 Aug 2024 13:55:25 -0400 Subject: [PATCH 107/174] fix: filter by product category should prevent mixing of other gift cards with keyhwords visa mastercard --- functions/list-gift-cards.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/functions/list-gift-cards.ts b/functions/list-gift-cards.ts index 9c404382..42726eb7 100644 --- a/functions/list-gift-cards.ts +++ b/functions/list-gift-cards.ts @@ -31,7 +31,9 @@ export async function onRequest(ctx: Context): Promise { } async function getGiftCards(productQuery: string, country: string, accessToken: AccessToken): Promise { - const url = `${getBaseUrl(accessToken.isSandbox)}/countries/${country}/products?productName=${productQuery}`; + // productCategoryId = 1 = Finance. + // This should prevent mixing of other gift cards with similar keywords + const url = `${getBaseUrl(accessToken.isSandbox)}/countries/${country}/products?productName=${productQuery}&productCategoryId=1`; console.log(`Retrieving gift cards from ${url}`); const options = { method: "GET", From b9fc842a73c3d683dbea8709ba0da893dedf0dd3 Mon Sep 17 00:00:00 2001 From: EresDev Date: Tue, 6 Aug 2024 10:55:24 +0000 Subject: [PATCH 108/174] feat: detect user country by ip & use country by timezone as fallback --- static/scripts/rewards/gift-cards/helpers.ts | 33 +++++++++++++++++++ .../rewards/gift-cards/list-gift-cards.ts | 14 ++++---- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/static/scripts/rewards/gift-cards/helpers.ts b/static/scripts/rewards/gift-cards/helpers.ts index 282f8a50..2ed223d7 100644 --- a/static/scripts/rewards/gift-cards/helpers.ts +++ b/static/scripts/rewards/gift-cards/helpers.ts @@ -1,4 +1,37 @@ +import ct from "countries-and-timezones"; + export function getApiBaseUrl() { // specify when backend functions and frontend are deployed to a different URL return ""; } + +async function getCountryCodeByIp() { + try { + const response = await fetch("https://ipinfo.io/json"); + if (!response.ok) { + throw new Error(`Response status: ${response.status}`); + } + const json = await response.json(); + return json.country; + } catch (error) { + console.error(error); + return null; + } +} + +async function getCountryCodeByTimezone() { + const localTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone; + const countries = ct.getCountriesForTimezone(localTimezone); + return countries[0]?.id; +} + +export async function getUserCountryCode() { + const methods = [getCountryCodeByIp, getCountryCodeByTimezone]; + for (let i = 0; i < methods.length; ++i) { + const countryCode = await methods[i](); + if (countryCode) { + return countryCode; + } + } + return null; +} diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index 6903e7e8..3b0d3f14 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -4,11 +4,10 @@ import { AppState } from "../app-state"; import { attachActivateInfoAction } from "./activate/activate-action"; import { attachClaimAction } from "./claim/claim-action"; import { attachRevealAction } from "./reveal/reveal-action"; -import { getApiBaseUrl } from "./helpers"; +import { getApiBaseUrl, getUserCountryCode } from "./helpers"; import { getGiftCardActivateInfoHtml } from "./activate/activate-html"; import { getGiftCardHtml } from "./gift-card"; import { getRedeemCodeHtml } from "./reveal/redeem-code-html"; -import ct from "countries-and-timezones"; export async function initClaimGiftCard(app: AppState) { const giftCardsSection = document.getElementById("gift-cards"); @@ -25,11 +24,14 @@ export async function initClaimGiftCard(app: AppState) { } activateInfoSection.innerHTML = ""; - const retrieveOrderUrl = `${getApiBaseUrl()}/get-order?orderId=${getGiftCardOrderId(app.reward.beneficiary, app.reward.signature)}`; + const country = await getUserCountryCode(); + if (!country) { + giftCardsSection.innerHTML = `

Failed to load suitable virtual cards for you. Refresh or try disabling adblocker.

`; + return; + } - const localTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone; - const countries = ct.getCountriesForTimezone(localTimezone); - const listGiftCardsUrl = `${getApiBaseUrl()}/list-gift-cards?country=${countries[0].id}`; + const retrieveOrderUrl = `${getApiBaseUrl()}/get-order?orderId=${getGiftCardOrderId(app.reward.beneficiary, app.reward.signature)}`; + const listGiftCardsUrl = `${getApiBaseUrl()}/list-gift-cards?country=${country}`; const requestInit = { method: "GET", From 276956e20bfcdf80117e6b96c474da77f54235f4 Mon Sep 17 00:00:00 2001 From: EresDev Date: Tue, 6 Aug 2024 16:02:45 +0500 Subject: [PATCH 109/174] chore: fix spells --- .cspell.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.cspell.json b/.cspell.json index 1de3c234..a89f082e 100644 --- a/.cspell.json +++ b/.cspell.json @@ -5,6 +5,7 @@ "useGitignore": true, "language": "en", "words": [ + "adblocker", "binkey", "binsec", "blockscan", From 8ad0c3642d6bb28320575bd3a454f586972601c8 Mon Sep 17 00:00:00 2001 From: rndquu Date: Wed, 7 Aug 2024 14:33:01 +0300 Subject: [PATCH 110/174] build: set USE_RELOADLY_SANDBOX to a string --- wrangler.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrangler.toml b/wrangler.toml index bfa42f37..2a55a33f 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -2,6 +2,6 @@ compatibility_flags = [ "nodejs_compat" ] compatibility_date = "2024-04-05" [vars] -USE_RELOADLY_SANDBOX = true +USE_RELOADLY_SANDBOX = "true" RELOADLY_API_CLIENT_ID = "" RELOADLY_API_CLIENT_SECRET = "" \ No newline at end of file From 4e757a6268d37ba700ecb4ee1564ff7f70d04de3 Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 16 Aug 2024 01:43:11 +0500 Subject: [PATCH 111/174] chore: add reloadly cards & countries lists --- functions/reloadly-lists.ts | 981 ++++++++++++++++++++++++++++++++++++ 1 file changed, 981 insertions(+) create mode 100644 functions/reloadly-lists.ts diff --git a/functions/reloadly-lists.ts b/functions/reloadly-lists.ts new file mode 100644 index 00000000..3136988e --- /dev/null +++ b/functions/reloadly-lists.ts @@ -0,0 +1,981 @@ +/* eslint-disable sonarjs/no-duplicate-string */ +// Keep duplicate country names in different lists + +export const fallbackInternationalMastercard = { + country: "United States", + countryCode: "US", + name: "Virtual MasterCard International USD US", + sku: 18597, +}; + +export const fallbackInternationalVisa = { + country: "United States", + countryCode: "US", + name: "Visa International USD (Virtual) US", + sku: 18598, +}; + +export const mastercardInternationalSkus = [ + { + country: "United States", + countryCode: "US", + name: "Virtual MasterCard International USD US", + sku: 18597, + }, + { + country: "Algeria", + countryCode: "DZ", + name: "Mastercard Prepaid USD Debit (Virtual only) DZ", + sku: 18630, + }, + { + country: "Australia", + countryCode: "AU", + name: "Mastercard Prepaid USD Debit (Virtual only) AU", + sku: 18631, + }, + { + country: "Austria", + countryCode: "AT", + name: "Mastercard Prepaid USD Debit (Virtual only) AT", + sku: 18632, + }, + { + country: "Bangladesh", + countryCode: "BD", + name: "Mastercard Prepaid USD Debit (Virtual only) BD", + sku: 18633, + }, + { + country: "Belgium", + countryCode: "BE", + name: "Mastercard Prepaid USD Debit (Virtual only) BE", + sku: 18634, + }, + { + country: "Brazil", + countryCode: "BR", + name: "Mastercard Prepaid USD Debit (Virtual only) BR", + sku: 18635, + }, + { + country: "Canada", + countryCode: "CA", + name: "Mastercard Prepaid USD Debit (Virtual only) CA", + sku: 18636, + }, + { + country: "Colombia", + countryCode: "CO", + name: "Mastercard Prepaid USD Debit (Virtual only) CO", + sku: 18637, + }, + { + country: "Dominica", + countryCode: "DM", + name: "Mastercard Prepaid USD Debit (Virtual only) DM", + sku: 18638, + }, + { + country: "Ecuador", + countryCode: "EC", + name: "Mastercard Prepaid USD Debit (Virtual only) EC", + sku: 18639, + }, + { + country: "Egypt", + countryCode: "EG", + name: "Mastercard Prepaid USD Debit (Virtual only) EG", + sku: 18640, + }, + { + country: "Finland", + countryCode: "FI", + name: "Mastercard Prepaid USD Debit (Virtual only) FI", + sku: 18641, + }, + { + country: "France", + countryCode: "FR", + name: "Mastercard Prepaid USD Debit (Virtual only) FR", + sku: 18642, + }, + { + country: "Germany", + countryCode: "DE", + name: "Mastercard Prepaid USD Debit (Virtual only) DE", + sku: 18643, + }, + { + country: "Greece", + countryCode: "GR", + name: "Mastercard Prepaid USD Debit (Virtual only) GR", + sku: 18644, + }, + { + country: "India", + countryCode: "IN", + name: "Mastercard Prepaid USD Debit (Virtual only) IN", + sku: 18645, + }, + { + country: "Indonesia", + countryCode: "ID", + name: "Mastercard Prepaid USD Debit (Virtual only) ID", + sku: 18646, + }, + { + country: "Ireland", + countryCode: "IE", + name: "Mastercard Prepaid USD Debit (Virtual only) IE", + sku: 18647, + }, + { + country: "Italy", + countryCode: "IT", + name: "Mastercard Prepaid USD Debit (Virtual only) IT", + sku: 18648, + }, + { + country: "Jamaica", + countryCode: "JM", + name: "Mastercard Prepaid USD Debit (Virtual only) JM", + sku: 18649, + }, + { + country: "Jordan", + countryCode: "JO", + name: "Mastercard Prepaid USD Debit (Virtual only) JO", + sku: 18650, + }, + { + country: "Malaysia", + countryCode: "MY", + name: "Mastercard Prepaid USD Debit (Virtual only) MY", + sku: 18651, + }, + { + country: "Mexico", + countryCode: "MX", + name: "Mastercard Prepaid USD Debit (Virtual only) MX", + sku: 18652, + }, + { + country: "Netherlands", + countryCode: "NL", + name: "Mastercard Prepaid USD Debit (Virtual only) NL", + sku: 18653, + }, + { + country: "Philippines", + countryCode: "PH", + name: "Mastercard Prepaid USD Debit (Virtual only) PH", + sku: 18654, + }, + { + country: "Poland", + countryCode: "PL", + name: "Mastercard Prepaid USD Debit (Virtual only) PL", + sku: 18655, + }, + { + country: "Portugal", + countryCode: "PT", + name: "Mastercard Prepaid USD Debit (Virtual only) PT", + sku: 18656, + }, + { + country: "Qatar", + countryCode: "QA", + name: "Mastercard Prepaid USD Debit (Virtual only) QA", + sku: 18657, + }, + { + country: "Saudi Arabia", + countryCode: "SA", + name: "Mastercard Prepaid USD Debit (Virtual only) SA", + sku: 18658, + }, + { + country: "Singapore", + countryCode: "SG", + name: "Mastercard Prepaid USD Debit (Virtual only) SG", + sku: 18659, + }, + { + country: "Spain", + countryCode: "ES", + name: "Mastercard Prepaid USD Debit (Virtual only) ES", + sku: 18660, + }, + { + country: "Thailand", + countryCode: "TH", + name: "Mastercard Prepaid USD Debit (Virtual only) TH", + sku: 18661, + }, + { + country: "United Arab Emirates", + countryCode: "AE", + name: "Mastercard Prepaid USD Debit (Virtual only) AE", + sku: 18662, + }, + { + country: "United Kingdom", + countryCode: "GB", + name: "Mastercard Prepaid USD Debit (Virtual only) GB", + sku: 18663, + }, + { + country: "United Arab Emirates", + countryCode: "AE", + name: "Mastercard Prepaid USD Debit (Virtual only) AE", + sku: 18674, + }, +]; + +export const visaInternationalSkus = [ + { + country: "United States", + countryCode: "US", + name: "Visa International USD (Virtual) US", + sku: 18598, + }, + { + country: "Algeria", + countryCode: "DZ", + name: "Virtual Promotional Prepaid Visa USD DZ", + sku: 18601, + }, + { + country: "Australia", + countryCode: "AU", + name: "Virtual Promotional Prepaid Visa USD AU", + sku: 18602, + }, + { + country: "Bangladesh", + countryCode: "BD", + name: "Virtual Promotional Prepaid Visa USD BD", + sku: 18603, + }, + { + country: "Belgium", + countryCode: "BE", + name: "Virtual Promotional Prepaid Visa USD BE", + sku: 18604, + }, + { + country: "Brazil", + countryCode: "BR", + name: "Virtual Promotional Prepaid Visa USD BR", + sku: 18605, + }, + { + country: "Canada", + countryCode: "CA", + name: "Virtual Promotional Prepaid Visa USD CA", + sku: 18606, + }, + { + country: "Dominica", + countryCode: "DM", + name: "Virtual Promotional Prepaid Visa USD DM", + sku: 18607, + }, + { + country: "Egypt", + countryCode: "EG", + name: "Virtual Promotional Prepaid Visa USD EG", + sku: 18608, + }, + { + country: "Finland", + countryCode: "FI", + name: "Virtual Promotional Prepaid Visa USD FI", + sku: 18609, + }, + { + country: "France", + countryCode: "FR", + name: "Virtual Promotional Prepaid Visa USD FR", + sku: 18610, + }, + { + country: "Georgia", + countryCode: "GE", + name: "Virtual Promotional Prepaid Visa USD GE", + sku: 18611, + }, + { + country: "Greece", + countryCode: "GR", + name: "Virtual Promotional Prepaid Visa USD GR", + sku: 18612, + }, + { + country: "India", + countryCode: "IN", + name: "Virtual Promotional Prepaid Visa USD IN", + sku: 18613, + }, + { + country: "Indonesia", + countryCode: "ID", + name: "Virtual Promotional Prepaid Visa USD ID", + sku: 18614, + }, + { + country: "Italy", + countryCode: "IT", + name: "Virtual Promotional Prepaid Visa USD IT", + sku: 18615, + }, + { + country: "Jamaica", + countryCode: "JM", + name: "Virtual Promotional Prepaid Visa USD JM", + sku: 18616, + }, + { + country: "Jordan", + countryCode: "JO", + name: "Virtual Promotional Prepaid Visa USD JO", + sku: 18617, + }, + { + country: "Mexico", + countryCode: "MX", + name: "Virtual Promotional Prepaid Visa USD MX", + sku: 18618, + }, + { + country: "Morocco", + countryCode: "MA", + name: "Virtual Promotional Prepaid Visa USD MA", + sku: 18619, + }, + { + country: "Netherlands", + countryCode: "NL", + name: "Virtual Promotional Prepaid Visa USD NL", + sku: 18620, + }, + { + country: "Philippines", + countryCode: "PH", + name: "Virtual Promotional Prepaid Visa USD PH", + sku: 18621, + }, + { + country: "Poland", + countryCode: "PL", + name: "Virtual Promotional Prepaid Visa USD PL", + sku: 18622, + }, + { + country: "Qatar", + countryCode: "QA", + name: "Virtual Promotional Prepaid Visa USD QA", + sku: 18623, + }, + { + country: "Saudi Arabia", + countryCode: "SA", + name: "Virtual Promotional Prepaid Visa USD SA", + sku: 18624, + }, + { + country: "Spain", + countryCode: "ES", + name: "Virtual Promotional Prepaid Visa USD ES", + sku: 18625, + }, + { + country: "Sri Lanka", + countryCode: "LK", + name: "Virtual Promotional Prepaid Visa USD LK", + sku: 18626, + }, + { + country: "Taiwan", + countryCode: "TW", + name: "Virtual Promotional Prepaid Visa USD TW", + sku: 18627, + }, + { + country: "United Arab Emirates", + countryCode: "AE", + name: "Virtual Promotional Prepaid Visa USD AE", + sku: 18628, + }, + { + country: "United Kingdom", + countryCode: "GB", + name: "Virtual Promotional Prepaid Visa USD GB", + sku: 18629, + }, +]; + +/** + * There are separate allow list for visa & mastercard + * But right now, both lists contain same countries + */ +export const countryAllowList = [ + { + code: "GP", + name: "Guadeloupe", + }, + { + code: "AO", + name: "Angola", + }, + { + code: "KI", + name: "Kiribati", + }, + { + code: "CA", + name: "Canada", + }, + { + code: "CM", + name: "Cameroon", + }, + { + code: "QA", + name: "Qatar", + }, + { + code: "VU", + name: "Vanuatu", + }, + { + code: "EC", + name: "Ecuador", + }, + { + code: "AE", + name: "United Arab Emirates", + }, + { + code: "KZ", + name: "Kazakhstan", + }, + { + code: "GI", + name: "Gibraltar", + }, + { + code: "ID", + name: "Indonesia", + }, + { + code: "BG", + name: "Bulgaria", + }, + { + code: "BE", + name: "Belgium", + }, + { + code: "CO", + name: "Colombia", + }, + { + code: "BR", + name: "Brazil", + }, + { + code: "IT", + name: "Italy", + }, + { + code: "EG", + name: "Egypt", + }, + { + code: "KR", + name: "South Korea", + }, + { + code: "ZA", + name: "South Africa", + }, + { + code: "OM", + name: "Oman", + }, + { + code: "NF", + name: "Norfolk Island", + }, + { + code: "SI", + name: "Slovak Republic", + }, + { + code: "SB", + name: "Solomon Islands", + }, + { + code: "LU", + name: "Luxembourg", + }, + { + code: "BV", + name: "Bouvet Island", + }, + { + code: "GG", + name: "Guernsey", + }, + { + code: "GD", + name: "Grenada", + }, + { + code: "AW", + name: "Aruba", + }, + { + code: "JM", + name: "Jamaica", + }, + { + code: "GF", + name: "French Guiana", + }, + { + code: "NO", + name: "Norway", + }, + { + code: "LI", + name: "Liechtenstein", + }, + { + code: "HK", + name: "Hong Kong", + }, + { + code: "HU", + name: "Hungary", + }, + { + code: "PE", + name: "Peru", + }, + { + code: "AM", + name: "Armenia", + }, + { + code: "NL", + name: "Netherlands", + }, + { + code: "BN", + name: "Brunei Darussalam", + }, + { + code: "BM", + name: "Bermuda", + }, + { + code: "VI", + name: "Virgin Islands (U.S.)", + }, + { + code: "MS", + name: "Montserrat", + }, + { + code: "GY", + name: "Guyana", + }, + { + code: "DJ", + name: "Djibouti", + }, + { + code: "PL", + name: "Poland", + }, + { + code: "DK", + name: "Denmark", + }, + { + code: "FM", + name: "Federated States of Micronesia", + }, + { + code: "GH", + name: "Ghana", + }, + { + code: "AD", + name: "Andorra", + }, + { + code: "PF", + name: "French Polynesia", + }, + { + code: "LV", + name: "Latvia", + }, + { + code: "AZ", + name: "Azerbaijan", + }, + { + code: "TO", + name: "Tonga", + }, + { + code: "CC", + name: "Cocos (Keeling) Islands", + }, + { + code: "MR", + name: "Mauritania", + }, + { + code: "IL", + name: "Israel", + }, + { + code: "GB", + name: "UK", + }, + { + code: "LT", + name: "Lithuania", + }, + { + code: "CL", + name: "Chile", + }, + { + code: "DE", + name: "Germany", + }, + { + code: "IN", + name: "India", + }, + { + code: "BW", + name: "Botswana", + }, + { + code: "IS", + name: "Iceland", + }, + { + code: "FI", + name: "Finland", + }, + { + code: "BH", + name: "Bahrain", + }, + { + code: "US", + name: "USA", + }, + { + code: "AI", + name: "Anguilla", + }, + { + code: "CZ", + name: "Czech Republic", + }, + { + code: "ES", + name: "Spain", + }, + { + code: "MT", + name: "Malta", + }, + { + code: "SG", + name: "Singapore", + }, + { + code: "DZ", + name: "Algeria", + }, + { + code: "CY", + name: "Cyprus", + }, + { + code: "YT", + name: "Mayotte", + }, + { + code: "MP", + name: "Northern Mariana Islands", + }, + { + code: "HR", + name: "Croatia", + }, + { + code: "CK", + name: "Cook Islands", + }, + { + code: "GL", + name: "Greenland", + }, + { + code: "SA", + name: "Saudi Arabia", + }, + { + code: "GT", + name: "Guatemala", + }, + { + code: "MY", + name: "Malaysia", + }, + { + code: "JO", + name: "Jordan", + }, + { + code: "IE", + name: "Ireland", + }, + { + code: "CX", + name: "Christmas Island", + }, + { + code: "RO", + name: "Romania", + }, + { + code: "NZ", + name: "New Zealand", + }, + { + code: "SV", + name: "El Salvador", + }, + { + code: "FR", + name: "France", + }, + { + code: "KE", + name: "Kenya", + }, + { + code: "DM", + name: "Dominica", + }, + { + code: "MA", + name: "Morocco", + }, + { + code: "TW", + name: "Taiwan", + }, + { + code: "NU", + name: "Niue", + }, + { + code: "JP", + name: "Japan", + }, + { + code: "PH", + name: "Philippines", + }, + { + code: "GE", + name: "Georgia", + }, + { + code: "GU", + name: "Guam", + }, + { + code: "PW", + name: "Palau", + }, + { + code: "AU", + name: "Australia", + }, + { + code: "AS", + name: "American Samoa", + }, + { + code: "CR", + name: "Costa Rica", + }, + { + code: "GM", + name: "Gambia", + }, + { + code: "TH", + name: "Thailand", + }, + { + code: "CW", + name: "Curaçao", + }, + { + code: "MQ", + name: "Martinique", + }, + { + code: "PR", + name: "Puerto Rico", + }, + { + code: "BQ", + name: "Caribbean Netherlands", + }, + { + code: "BZ", + name: "Belize", + }, + { + code: "MW", + name: "Malawi", + }, + { + code: "NE", + name: "Niger", + }, + { + code: "SI", + name: "Slovenia", + }, + { + code: "AT", + name: "Austria", + }, + { + code: "MX", + name: "Mexico", + }, + { + code: "LK", + name: "Sri lanka", + }, + { + code: "PT", + name: "Portugal", + }, + { + code: "FK", + name: "Falkland Islands", + }, + { + code: "UY", + name: "Uruguay", + }, + { + code: "IO", + name: "British Indian Ocean Territory", + }, + { + code: "GR", + name: "Greece", + }, + { + code: "VA", + name: "Vatican City", + }, + { + code: "AQ", + name: "Antarctica", + }, + { + code: "FO", + name: "Faroe Islands", + }, + { + code: "EE", + name: "Estonia", + }, + { + code: "TV", + name: "Tuvalu", + }, + { + code: "TF", + name: "French Southern Territories", + }, + { + code: "SE", + name: "Sweden", + }, + { + code: "AG", + name: "Antigua and Barbuda", + }, + { + code: "BO", + name: "Bolivia", + }, + { + code: "GA", + name: "Gabon", + }, + { + code: "TM", + name: "Turkmenistan", + }, + { + code: "AR", + name: "Argentina", + }, + { + code: "JE", + name: "Jersey", + }, + { + code: "CV", + name: "Cabo Verde", + }, + { + code: "HM", + name: "Heard Island and McDonald Islands", + }, + { + code: "BD", + name: "Bangladesh", + }, + { + code: "BT", + name: "Bhutan", + }, + { + code: "FJ", + name: "Fiji", + }, + { + code: "CH", + name: "Switzerland", + }, + { + code: "MC", + name: "Monaco", + }, +]; From a01ee9211d39a15a3c27b28d11fdf3b7af736b45 Mon Sep 17 00:00:00 2001 From: EresDev Date: Wed, 21 Aug 2024 16:35:49 -0400 Subject: [PATCH 112/174] feat: display single suitable virutal card to user --- functions/helpers.ts | 10 ++++++++++ functions/list-gift-cards.ts | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/functions/helpers.ts b/functions/helpers.ts index a070c3e0..378f619c 100644 --- a/functions/helpers.ts +++ b/functions/helpers.ts @@ -1,3 +1,5 @@ +import { GiftCard } from "../shared/types"; +import { mastercardInternationalSkus } from "./reloadly-lists"; import { AccessToken } from "./types"; export const allowedChainIds = [1, 5, 100, 31337]; @@ -52,3 +54,11 @@ export function getBaseUrl(isSandbox: boolean): string { } return "https://giftcards-sandbox.reloadly.com"; } + +export function pickBestCard(giftCards: GiftCard[], countryCode: string): GiftCard { + const sku = mastercardInternationalSkus.find((sku) => sku.countryCode == countryCode); + const giftCard = giftCards.find((giftCard) => giftCard.productId == sku.sku); + if (giftCard) { + return giftCard; + } +} diff --git a/functions/list-gift-cards.ts b/functions/list-gift-cards.ts index 42726eb7..e5eeb6ac 100644 --- a/functions/list-gift-cards.ts +++ b/functions/list-gift-cards.ts @@ -1,5 +1,5 @@ import { GiftCard } from "../shared/types"; -import { commonHeaders, getAccessToken, getBaseUrl } from "./helpers"; +import { commonHeaders, getAccessToken, getBaseUrl, pickBestCard } from "./helpers"; import { AccessToken, Context, ReloadlyFailureResponse } from "./types"; import { validateEnvVars, validateRequestMethod } from "./validators"; @@ -21,7 +21,7 @@ export async function onRequest(ctx: Context): Promise { const giftCards = [...masterCards, ...visaCards]; if (giftCards.length) { - return Response.json(giftCards, { status: 200 }); + return Response.json([pickBestCard(giftCards, country)], { status: 200 }); } return Response.json({ message: "There are no gift cards available." }, { status: 404 }); } catch (error) { From c281cbe7764448769d0061fd9b0bd10cf8dfb7ea Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 23 Aug 2024 03:55:01 +0900 Subject: [PATCH 113/174] fix: pick intl mastercard/visa for allowed countries when local intl card is unavailable --- functions/helpers.ts | 35 +++++++++++++++++++++++++++++++++-- functions/list-gift-cards.ts | 5 +++-- functions/post-order.ts | 2 +- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/functions/helpers.ts b/functions/helpers.ts index 378f619c..d069a1a8 100644 --- a/functions/helpers.ts +++ b/functions/helpers.ts @@ -1,5 +1,6 @@ import { GiftCard } from "../shared/types"; -import { mastercardInternationalSkus } from "./reloadly-lists"; +import { getGiftCardById } from "./post-order"; +import { countryAllowList, fallbackInternationalMastercard, fallbackInternationalVisa, mastercardInternationalSkus } from "./reloadly-lists"; import { AccessToken } from "./types"; export const allowedChainIds = [1, 5, 100, 31337]; @@ -55,10 +56,40 @@ export function getBaseUrl(isSandbox: boolean): string { return "https://giftcards-sandbox.reloadly.com"; } -export function pickBestCard(giftCards: GiftCard[], countryCode: string): GiftCard { +export async function pickBestCard(giftCards: GiftCard[], countryCode: string, accessToken: AccessToken): Promise { const sku = mastercardInternationalSkus.find((sku) => sku.countryCode == countryCode); const giftCard = giftCards.find((giftCard) => giftCard.productId == sku.sku); if (giftCard) { return giftCard; } + + const supportedCountry = countryAllowList.find((listItem) => listItem.code == countryCode); + if (supportedCountry) { + const intlMastercard = await getIntlMasteracrd(accessToken); + if (intlMastercard) { + return intlMastercard; + } + const intlVisa = await getIntlVisa(accessToken); + if (intlVisa) { + return intlVisa; + } + } +} + +async function getIntlMasteracrd(accessToken: AccessToken): Promise { + try { + return await getGiftCardById(fallbackInternationalMastercard.sku, accessToken); + } catch (e) { + console.log(`Failed to load international US mastercard: ${JSON.stringify(fallbackInternationalMastercard)}\n${JSON.stringify(JSON.stringify)}`); + return null; + } +} + +async function getIntlVisa(accessToken: AccessToken): Promise { + try { + return await getGiftCardById(fallbackInternationalVisa.sku, accessToken); + } catch (e) { + console.log(`Failed to load international US visa: ${JSON.stringify(fallbackInternationalVisa)}\n${JSON.stringify(JSON.stringify)}`); + return null; + } } diff --git a/functions/list-gift-cards.ts b/functions/list-gift-cards.ts index e5eeb6ac..50576f38 100644 --- a/functions/list-gift-cards.ts +++ b/functions/list-gift-cards.ts @@ -19,9 +19,10 @@ export async function onRequest(ctx: Context): Promise { const [masterCards, visaCards] = await Promise.all([getGiftCards("mastercard", country, accessToken), getGiftCards("visa", country, accessToken)]); const giftCards = [...masterCards, ...visaCards]; + const suitableCard = await pickBestCard(giftCards, country, accessToken); - if (giftCards.length) { - return Response.json([pickBestCard(giftCards, country)], { status: 200 }); + if (suitableCard) { + return Response.json([suitableCard], { status: 200 }); } return Response.json({ message: "There are no gift cards available." }, { status: 404 }); } catch (error) { diff --git a/functions/post-order.ts b/functions/post-order.ts index f2f59154..b4a18ac2 100644 --- a/functions/post-order.ts +++ b/functions/post-order.ts @@ -93,7 +93,7 @@ export async function onRequest(ctx: Context): Promise { } } -async function getGiftCardById(productId: number, accessToken: AccessToken): Promise { +export async function getGiftCardById(productId: number, accessToken: AccessToken): Promise { const url = `${getBaseUrl(accessToken.isSandbox)}/products/${productId}`; console.log(`Retrieving gift cards from ${url}`); const options = { From aa300f1676bfea2cbec901612ba9f4d825b33daa Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 23 Aug 2024 00:28:55 +0400 Subject: [PATCH 114/174] fix: pick local mastercard/visa as last option --- functions/helpers.ts | 55 +++++++++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 14 deletions(-) diff --git a/functions/helpers.ts b/functions/helpers.ts index d069a1a8..cecb1221 100644 --- a/functions/helpers.ts +++ b/functions/helpers.ts @@ -1,6 +1,6 @@ import { GiftCard } from "../shared/types"; import { getGiftCardById } from "./post-order"; -import { countryAllowList, fallbackInternationalMastercard, fallbackInternationalVisa, mastercardInternationalSkus } from "./reloadly-lists"; +import { countryAllowList, fallbackInternationalMastercard, fallbackInternationalVisa, mastercardInternationalSkus, visaIntlSkus } from "./reloadly-lists"; import { AccessToken } from "./types"; export const allowedChainIds = [1, 5, 100, 31337]; @@ -56,27 +56,54 @@ export function getBaseUrl(isSandbox: boolean): string { return "https://giftcards-sandbox.reloadly.com"; } -export async function pickBestCard(giftCards: GiftCard[], countryCode: string, accessToken: AccessToken): Promise { - const sku = mastercardInternationalSkus.find((sku) => sku.countryCode == countryCode); - const giftCard = giftCards.find((giftCard) => giftCard.productId == sku.sku); - if (giftCard) { - return giftCard; +export async function pickBestCard(giftCards: GiftCard[], countryCode: string, accessToken: AccessToken): Promise { + const supportedCountry = countryAllowList.find((listItem) => listItem.code == countryCode); + if (!supportedCountry) { + throw new Error(`Country ${countryCode} is not in the allowed country list.`); } - const supportedCountry = countryAllowList.find((listItem) => listItem.code == countryCode); - if (supportedCountry) { - const intlMastercard = await getIntlMasteracrd(accessToken); - if (intlMastercard) { - return intlMastercard; + const masterCardIntlSku = mastercardInternationalSkus.find((sku) => sku.countryCode == countryCode); + if (masterCardIntlSku) { + const tokenizedIntlMastercard = giftCards.find((giftCard) => giftCard.productId == masterCardIntlSku.sku); + if (tokenizedIntlMastercard) { + return tokenizedIntlMastercard; } - const intlVisa = await getIntlVisa(accessToken); + } + + const fallbackMastercard = await getFallbackIntlMasteracrd(accessToken); + if (fallbackMastercard) { + return fallbackMastercard; + } + + const visaIntlSku = visaIntlSkus.find((sku) => sku.countryCode == countryCode); + if (visaIntlSku) { + const intlVisa = giftCards.find((giftCard) => giftCard.productId == visaIntlSku.sku); if (intlVisa) { return intlVisa; } } + + const fallbackVisa = await getFallbackIntlVisa(accessToken); + if (fallbackVisa) { + return fallbackVisa; + } + + if (giftCards.length) { + const localMastercard = giftCards.find((giftCard) => giftCard.productName.toLocaleLowerCase().includes("mastercard")); + if (localMastercard) { + return localMastercard; + } + + const localVisa = giftCards.find((giftCard) => giftCard.productName.toLocaleLowerCase().includes("visa")); + if (localVisa) { + return localVisa; + } + } + + throw new Error(`No suitable card found for country code ${countryCode}`); } -async function getIntlMasteracrd(accessToken: AccessToken): Promise { +async function getFallbackIntlMasteracrd(accessToken: AccessToken): Promise { try { return await getGiftCardById(fallbackInternationalMastercard.sku, accessToken); } catch (e) { @@ -85,7 +112,7 @@ async function getIntlMasteracrd(accessToken: AccessToken): Promise { +async function getFallbackIntlVisa(accessToken: AccessToken): Promise { try { return await getGiftCardById(fallbackInternationalVisa.sku, accessToken); } catch (e) { From 632b8582f4a00c8d18f48eae555e85b7619b3ad9 Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 23 Aug 2024 00:39:35 +0400 Subject: [PATCH 115/174] refactor: shorten vars' names --- functions/helpers.ts | 12 ++++++------ functions/reloadly-lists.ts | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/functions/helpers.ts b/functions/helpers.ts index cecb1221..07051126 100644 --- a/functions/helpers.ts +++ b/functions/helpers.ts @@ -1,6 +1,6 @@ import { GiftCard } from "../shared/types"; import { getGiftCardById } from "./post-order"; -import { countryAllowList, fallbackInternationalMastercard, fallbackInternationalVisa, mastercardInternationalSkus, visaIntlSkus } from "./reloadly-lists"; +import { countryAllowList, fallbackIntlMastercard, fallbackIntlVisa, masterCardIntlSkus, visaIntlSkus } from "./reloadly-lists"; import { AccessToken } from "./types"; export const allowedChainIds = [1, 5, 100, 31337]; @@ -62,7 +62,7 @@ export async function pickBestCard(giftCards: GiftCard[], countryCode: string, a throw new Error(`Country ${countryCode} is not in the allowed country list.`); } - const masterCardIntlSku = mastercardInternationalSkus.find((sku) => sku.countryCode == countryCode); + const masterCardIntlSku = masterCardIntlSkus.find((sku) => sku.countryCode == countryCode); if (masterCardIntlSku) { const tokenizedIntlMastercard = giftCards.find((giftCard) => giftCard.productId == masterCardIntlSku.sku); if (tokenizedIntlMastercard) { @@ -105,18 +105,18 @@ export async function pickBestCard(giftCards: GiftCard[], countryCode: string, a async function getFallbackIntlMasteracrd(accessToken: AccessToken): Promise { try { - return await getGiftCardById(fallbackInternationalMastercard.sku, accessToken); + return await getGiftCardById(fallbackIntlMastercard.sku, accessToken); } catch (e) { - console.log(`Failed to load international US mastercard: ${JSON.stringify(fallbackInternationalMastercard)}\n${JSON.stringify(JSON.stringify)}`); + console.log(`Failed to load international US mastercard: ${JSON.stringify(fallbackIntlMastercard)}\n${JSON.stringify(JSON.stringify)}`); return null; } } async function getFallbackIntlVisa(accessToken: AccessToken): Promise { try { - return await getGiftCardById(fallbackInternationalVisa.sku, accessToken); + return await getGiftCardById(fallbackIntlVisa.sku, accessToken); } catch (e) { - console.log(`Failed to load international US visa: ${JSON.stringify(fallbackInternationalVisa)}\n${JSON.stringify(JSON.stringify)}`); + console.log(`Failed to load international US visa: ${JSON.stringify(fallbackIntlVisa)}\n${JSON.stringify(JSON.stringify)}`); return null; } } diff --git a/functions/reloadly-lists.ts b/functions/reloadly-lists.ts index 3136988e..ceea5627 100644 --- a/functions/reloadly-lists.ts +++ b/functions/reloadly-lists.ts @@ -1,21 +1,21 @@ /* eslint-disable sonarjs/no-duplicate-string */ // Keep duplicate country names in different lists -export const fallbackInternationalMastercard = { +export const fallbackIntlMastercard = { country: "United States", countryCode: "US", name: "Virtual MasterCard International USD US", sku: 18597, }; -export const fallbackInternationalVisa = { +export const fallbackIntlVisa = { country: "United States", countryCode: "US", name: "Visa International USD (Virtual) US", sku: 18598, }; -export const mastercardInternationalSkus = [ +export const masterCardIntlSkus = [ { country: "United States", countryCode: "US", @@ -234,7 +234,7 @@ export const mastercardInternationalSkus = [ }, ]; -export const visaInternationalSkus = [ +export const visaIntlSkus = [ { country: "United States", countryCode: "US", From 061bde2fc5d8bec067b6218731d486e3f0e16677 Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 23 Aug 2024 23:43:40 +0500 Subject: [PATCH 116/174] fix: load ordered card details with order as list card is not loading all cards anymore --- functions/get-order.ts | 4 +++- static/scripts/rewards/gift-cards/list-gift-cards.ts | 10 ++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/functions/get-order.ts b/functions/get-order.ts index e62f3a05..80da7acc 100644 --- a/functions/get-order.ts +++ b/functions/get-order.ts @@ -1,5 +1,6 @@ import { OrderTransaction } from "../shared/types"; import { commonHeaders, getAccessToken, getBaseUrl } from "./helpers"; +import { getGiftCardById } from "./post-order"; import { AccessToken, Context, ReloadlyFailureResponse, ReloadlyGetTransactionResponse } from "./types"; import { validateEnvVars, validateRequestMethod } from "./validators"; @@ -22,7 +23,8 @@ export async function onRequest(ctx: Context): Promise { if (!reloadlyTransaction) { return Response.json("Order not found.", { status: 404 }); } else if (reloadlyTransaction.status && reloadlyTransaction.status == "SUCCESSFUL") { - return Response.json(reloadlyTransaction, { status: 200 }); + const product = await getGiftCardById(reloadlyTransaction.product.productId, accessToken); + return Response.json({ transaction: reloadlyTransaction, product: product }, { status: 200 }); } else { return Response.json({ message: "There is no successful transaction for given order ID." }, { status: 404 }); } diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index 3b0d3f14..d32b3fe5 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -42,13 +42,15 @@ export async function initClaimGiftCard(app: AppState) { const [retrieveOrderResponse, retrieveGiftCardsResponse] = await Promise.all([fetch(retrieveOrderUrl, requestInit), fetch(listGiftCardsUrl, requestInit)]); - const transaction = (await retrieveOrderResponse.json()) as OrderTransaction; const giftCards = (await retrieveGiftCardsResponse.json()) as GiftCard[]; if (retrieveOrderResponse.status == 200) { - const giftCard = giftCards.find((giftCard) => transaction.product.productId == giftCard.productId); - if (giftCard) { - addPurchasedCardHtml(giftCard, transaction, app, giftCardsSection, activateInfoSection); + const { transaction, product } = (await retrieveOrderResponse.json()) as { + transaction: OrderTransaction; + product: GiftCard; + }; + if (product) { + addPurchasedCardHtml(product, transaction, app, giftCardsSection, activateInfoSection); } } else if (retrieveGiftCardsResponse.status == 200) { const availableGiftCards = giftCards.filter((giftCard: GiftCard) => { From 35dc73babd16f0135edefc6a4876f4e57ed66372 Mon Sep 17 00:00:00 2001 From: EresDev Date: Fri, 23 Aug 2024 15:20:46 -0400 Subject: [PATCH 117/174] fix: replace card list with single card in UI --- functions/list-gift-cards.ts | 2 +- .../rewards/gift-cards/claim/claim-action.ts | 18 ++++---- .../rewards/gift-cards/list-gift-cards.ts | 41 ++++++++----------- 3 files changed, 27 insertions(+), 34 deletions(-) diff --git a/functions/list-gift-cards.ts b/functions/list-gift-cards.ts index 50576f38..48257bd6 100644 --- a/functions/list-gift-cards.ts +++ b/functions/list-gift-cards.ts @@ -22,7 +22,7 @@ export async function onRequest(ctx: Context): Promise { const suitableCard = await pickBestCard(giftCards, country, accessToken); if (suitableCard) { - return Response.json([suitableCard], { status: 200 }); + return Response.json(suitableCard, { status: 200 }); } return Response.json({ message: "There are no gift cards available." }, { status: 404 }); } catch (error) { diff --git a/static/scripts/rewards/gift-cards/claim/claim-action.ts b/static/scripts/rewards/gift-cards/claim/claim-action.ts index 0c778aed..5bc9c82e 100644 --- a/static/scripts/rewards/gift-cards/claim/claim-action.ts +++ b/static/scripts/rewards/gift-cards/claim/claim-action.ts @@ -11,23 +11,21 @@ import { OrderRequestParams, GiftCard } from "../../../../../shared/types"; import { isErc20Permit } from "../../render-transaction/render-transaction"; import { initClaimGiftCard } from "../list-gift-cards"; -export function attachClaimAction(className: string, giftCards: GiftCard[], app: AppState) { +export function attachClaimAction(className: string, giftCard: GiftCard, app: AppState) { const claimButtons: HTMLCollectionOf = document.getElementsByClassName(className); Array.from(claimButtons).forEach((claimButton: Element) => { (claimButton as HTMLButtonElement).addEventListener("click", async () => { claimButton.setAttribute("data-loading", "true"); const productId = Number(claimButton.parentElement?.parentElement?.parentElement?.getAttribute("data-product-id")); - const product = giftCards.find((product: GiftCard) => product.productId == productId); - if (product) { - if (!isErc20Permit(app.reward)) { - toaster.create("error", "Only ERC20 permits are allowed to claim a card."); - } else if (!isClaimableForAmount(product, app.reward.amount)) { - toaster.create("error", "Your reward amount is not equal to the price of available card."); - } else { - await claimGiftCard(productId, app); - } + if (!isErc20Permit(app.reward)) { + toaster.create("error", "Only ERC20 permits are allowed to claim a card."); + } else if (!isClaimableForAmount(giftCard, app.reward.amount)) { + toaster.create("error", "Your reward amount is not equal to the price of available card."); + } else { + await claimGiftCard(productId, app); } + claimButton.setAttribute("data-loading", "false"); }); }); diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index d32b3fe5..ce924c44 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -40,9 +40,9 @@ export async function initClaimGiftCard(app: AppState) { }, }; - const [retrieveOrderResponse, retrieveGiftCardsResponse] = await Promise.all([fetch(retrieveOrderUrl, requestInit), fetch(listGiftCardsUrl, requestInit)]); + const [retrieveOrderResponse, retrieveGiftCardResponse] = await Promise.all([fetch(retrieveOrderUrl, requestInit), fetch(listGiftCardsUrl, requestInit)]); - const giftCards = (await retrieveGiftCardsResponse.json()) as GiftCard[]; + const giftCard = (await retrieveGiftCardResponse.json()) as GiftCard; if (retrieveOrderResponse.status == 200) { const { transaction, product } = (await retrieveOrderResponse.json()) as { @@ -52,13 +52,11 @@ export async function initClaimGiftCard(app: AppState) { if (product) { addPurchasedCardHtml(product, transaction, app, giftCardsSection, activateInfoSection); } - } else if (retrieveGiftCardsResponse.status == 200) { - const availableGiftCards = giftCards.filter((giftCard: GiftCard) => { - return giftCard && isGiftCardAvailable(giftCard, app.reward.amount); - }); + } else if (retrieveGiftCardResponse.status == 200) { + const availableGiftCard = isGiftCardAvailable(giftCard, app.reward.amount) ? giftCard : null; - addAvailableCardsHtml(availableGiftCards, app, giftCardsSection, activateInfoSection); - } else if (retrieveGiftCardsResponse.status == 404) { + addAvailableCardsHtml(availableGiftCard, app, giftCardsSection, activateInfoSection); + } else if (retrieveGiftCardResponse.status == 404) { giftCardsSection.innerHTML = "

There are no Visa/Mastercard available to claim at the moment.

"; } else { giftCardsSection.innerHTML = "

There was a problem in fetching gift cards. Try again later.

"; @@ -94,26 +92,23 @@ function addPurchasedCardHtml( attachRevealAction(transaction, app); } -function addAvailableCardsHtml(giftCards: GiftCard[], app: AppState, giftCardsSection: HTMLElement, activateInfoSection: HTMLElement) { +function addAvailableCardsHtml(giftCard: GiftCard | null, app: AppState, giftCardsSection: HTMLElement, activateInfoSection: HTMLElement) { const htmlParts: string[] = []; htmlParts.push(`

Or claim in virtual visa/mastercard

`); - if (giftCards.length) { - htmlParts.push(`
`); - giftCards.forEach((giftCard: GiftCard) => { - htmlParts.push(getGiftCardHtml(giftCard, app.reward.amount)); - }); + if (giftCard) { + htmlParts.push(`
`); + htmlParts.push(getGiftCardHtml(giftCard, app.reward.amount)); htmlParts.push(`
`); - } else { - htmlParts.push(`

There are no Visa/Mastercard available to claim at the moment.

`); - } - giftCardsSection.innerHTML = htmlParts.join(""); + giftCardsSection.innerHTML = htmlParts.join(""); - const activateInfoHtmlParts: string[] = []; - giftCards.forEach((giftCard: GiftCard) => { + const activateInfoHtmlParts: string[] = []; activateInfoHtmlParts.push(getGiftCardActivateInfoHtml(giftCard)); - }); - activateInfoSection.innerHTML = activateInfoHtmlParts.join(""); + activateInfoSection.innerHTML = activateInfoHtmlParts.join(""); - attachClaimAction("claim-gift-card-btn", giftCards, app); + attachClaimAction("claim-gift-card-btn", giftCard, app); + } else { + htmlParts.push(`

There are no Visa/Mastercard available to claim at the moment.

`); + giftCardsSection.innerHTML = htmlParts.join(""); + } } From 97c719898360645c715fbebcd7bb1187fd71e68f Mon Sep 17 00:00:00 2001 From: EresDev Date: Mon, 26 Aug 2024 14:34:40 -0400 Subject: [PATCH 118/174] fix: update UI for single virtual card --- .../scripts/rewards/gift-cards/gift-card.ts | 70 ++++++++-------- static/styles/rewards/gift-cards.css | 80 +++++++++++++++---- 2 files changed, 97 insertions(+), 53 deletions(-) diff --git a/static/scripts/rewards/gift-cards/gift-card.ts b/static/scripts/rewards/gift-cards/gift-card.ts index 3294a8d2..31885778 100644 --- a/static/scripts/rewards/gift-cards/gift-card.ts +++ b/static/scripts/rewards/gift-cards/gift-card.ts @@ -9,38 +9,36 @@ export function getGiftCardHtml(giftCard: GiftCard, rewardAmount: BigNumberish) return html`
-

${giftCard.productName.length > 16 ? giftCard.productName.substring(0, 16) + "..." : giftCard.productName}

-

- ${giftCard.productName} -

- -
- - -
- + ${giftCard.productName} +
+
+

${giftCard.productName}

${giftCard.denominationType == "FIXED" ? getFixedPricesHtml(giftCard, rewardAmount) : getRangePricesHtml(giftCard, rewardAmount)}
+
`; @@ -82,14 +80,14 @@ function getRangePricesHtml(giftCard: GiftCard, rewardAmount: BigNumberish) { const giftCardValue = getGiftCardValue(giftCard, rewardAmount); const isAvailable = isRangePriceGiftCardClaimable(giftCard, rewardAmount); if (isAvailable) { - _html += html`
-
Price
-
Value
+ _html += html`
+
+
${giftCardValue.toFixed(2)} ${giftCard.recipientCurrencyCode}
+
+
Value inside
+
-
-
${formatEther(rewardAmount)}${giftCard.senderCurrencyCode}
-
${giftCardValue.toFixed(2)}${giftCard.recipientCurrencyCode}
-
`; +
`; } return _html; diff --git a/static/styles/rewards/gift-cards.css b/static/styles/rewards/gift-cards.css index 329cefe1..cf784aad 100644 --- a/static/styles/rewards/gift-cards.css +++ b/static/styles/rewards/gift-cards.css @@ -44,12 +44,17 @@ .gift-card { background-color: var(--background-color-default); - margin-right: 10px; - padding: 12px 6px; - text-align: center; - min-width: 168px; - width: 168px; - height: fit-content; + display: flex; + padding: 24px; +} +@media screen and (max-width: 640px) { + .gift-card { + flex-direction: column; + text-align: center; + } + .gift-card .details { + margin-left: 0; + } } .redeem-code { width: 160px; @@ -61,9 +66,15 @@ } .gift-card h3 { - color: #fff; + padding: 8px; } +.gift-card .details { + display: flex; + flex-direction: column; + margin-left: 24px; + row-gap: 12px; +} .gift-card div.buttons { display: flex; flex-direction: row; @@ -98,12 +109,21 @@ flex-direction: column; } .gift-card .pricing .available { - color: #fff; + display: flex; + flex-direction: row; + justify-content: space-evenly; } -.gift-card .pricing div { +.gift-card .pricing .available div .currency { display: flex; flex-direction: row; - justify-content: space-between; + justify-content: center; +} +.gift-card .pricing .available div .currency div { + font-size: 8px; +} +.gift-card .pricing .available div .amount { + font-size: 24px; + color: #fff; } .redeem-info-wrapper { position: absolute; @@ -135,21 +155,47 @@ color: #fff; } -.claim-gift-card-btn[data-loading="true"] > span.action { +.claim-gift-card-btn { + width: 100%; + flex: 1; + padding: 0 24px; + background-color: var(--background-color-default); + border: none; + color: #808080; +} +.claim-gift-card-btn[data-loading="false"]:hover { + background-color: #80808020; + opacity: 1; + cursor: pointer; +} +.claim-gift-card-btn[data-loading="true"] > div.icon { display: none; } -.claim-gift-card-btn[data-loading="true"] > span.loading { - display: flex; +.claim-gift-card-btn[data-loading="true"] > div.claim-title { + display: none; +} +.claim-gift-card-btn[data-loading="true"] > div.loader { + display: block; } -.claim-gift-card-btn[data-loading="true"] > span.loading svg { +.claim-gift-card-btn[data-loading="true"] > div.loader svg { animation: rotate 1s linear infinite; } -.claim-gift-card-btn[data-loading="false"] > span.action { - display: flex; +.claim-gift-card-btn[data-loading="false"] > div.icon { + display: block; } -.claim-gift-card-btn[data-loading="false"] > span.loading { +.claim-gift-card-btn[data-loading="false"]:hover > div.icon { display: none; } +.claim-gift-card-btn[data-loading="false"] > div.claim-title { + display: none; +} +.claim-gift-card-btn[data-loading="false"]:hover > div.claim-title { + display: block; +} +.claim-gift-card-btn[data-loading="false"] > div.loader { + display: none; +} + .gift-cards-wrapper.purchased .claim-gift-card-btn { display: none; } From b07f8fdab42896b7e999496bc6f8a45c2122fad7 Mon Sep 17 00:00:00 2001 From: EresDev Date: Mon, 26 Aug 2024 16:45:45 -0400 Subject: [PATCH 119/174] fix: place redeem info in new UI --- .../gift-cards/activate/activate-html.ts | 27 +++------- static/styles/rewards/claim-table.css | 1 + static/styles/rewards/gift-cards.css | 50 ++++++------------- 3 files changed, 23 insertions(+), 55 deletions(-) diff --git a/static/scripts/rewards/gift-cards/activate/activate-html.ts b/static/scripts/rewards/gift-cards/activate/activate-html.ts index 3b3c3db7..a48f3adb 100644 --- a/static/scripts/rewards/gift-cards/activate/activate-html.ts +++ b/static/scripts/rewards/gift-cards/activate/activate-html.ts @@ -4,26 +4,15 @@ const html = String.raw; export function getGiftCardActivateInfoHtml(giftCard: GiftCard) { return html` -
+
-
- - - - - -
-
-

${giftCard.redeemInstruction.concise}

- ${giftCard.redeemInstruction.concise != giftCard.redeemInstruction.verbose ? `

${giftCard.redeemInstruction.verbose}

` : ``} -
+
+ How to use redeem code? +
+

${giftCard.redeemInstruction.concise}

+ ${giftCard.redeemInstruction.concise != giftCard.redeemInstruction.verbose ? `

${giftCard.redeemInstruction.verbose}

` : ``} +
+
`; diff --git a/static/styles/rewards/claim-table.css b/static/styles/rewards/claim-table.css index 892120ce..9c6dbde3 100644 --- a/static/styles/rewards/claim-table.css +++ b/static/styles/rewards/claim-table.css @@ -15,6 +15,7 @@ main > div { display: flex; flex-direction: column; justify-content: center; + align-items: center; } table { border-collapse: collapse; diff --git a/static/styles/rewards/gift-cards.css b/static/styles/rewards/gift-cards.css index cf784aad..b431c08b 100644 --- a/static/styles/rewards/gift-cards.css +++ b/static/styles/rewards/gift-cards.css @@ -15,27 +15,18 @@ text-align: center; } -.redeem-info-wrapper[data-show="false"] { - display: none; -} - .gift-cards-wrapper { display: flex; flex-direction: row; overflow-x: auto; max-width: 563px; width: 100vw; - transform: rotateX(180deg); - /* Because of rotateX, some properties like padding-bottom, align-items work in reverse. */ align-items: end; padding-bottom: 12px; } .gift-cards-wrapper.center { justify-content: center; } -.gift-cards-wrapper .gift-card { - transform: rotateX(180deg); -} .purchased { flex-direction: column; @@ -46,6 +37,7 @@ background-color: var(--background-color-default); display: flex; padding: 24px; + width: 100%; } @media screen and (max-width: 640px) { .gift-card { @@ -67,6 +59,7 @@ .gift-card h3 { padding: 8px; + text-align: center; } .gift-card .details { @@ -74,6 +67,7 @@ flex-direction: column; margin-left: 24px; row-gap: 12px; + flex: 1; } .gift-card div.buttons { display: flex; @@ -100,8 +94,7 @@ width: 100%; height: auto; border: 2px solid #80808020; - max-width: 168px; - height: 110px; + max-width: 200px; } .gift-card .pricing { @@ -125,34 +118,19 @@ font-size: 24px; color: #fff; } -.redeem-info-wrapper { - position: absolute; - z-index: 1000; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: var(--background-color-default); +.redeem-info-wrapper p { + text-transform: none; +} +.redeem-info-wrapper fieldset legend { + text-align: center; + padding: 0 4px; +} +.redeem-info-wrapper fieldset .instructions { + padding: 12px; } .redeem-info { - position: fixed; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); max-width: 563px; - padding: 24px; - border-collapse: collapse; - border-color: gray; - overflow-y: auto; - z-index: 1; -} - -.close-btn { - position: absolute; - top: 0; - right: 0; - cursor: pointer; - color: #fff; + border-color: var(--light-mode-border-color); } .claim-gift-card-btn { From e10871b8b206526abbf4e9841ece8dd32c979cbd Mon Sep 17 00:00:00 2001 From: EresDev Date: Tue, 27 Aug 2024 06:55:29 -0400 Subject: [PATCH 120/174] fix: update UI for purchased virtual card --- functions/get-order.ts | 8 ++- .../rewards/gift-cards/list-gift-cards.ts | 25 +++++----- .../gift-cards/reveal/redeem-code-html.ts | 50 ++++++++++++++++--- .../gift-cards/reveal/reveal-action.ts | 2 +- static/styles/rewards/gift-cards.css | 41 ++++++++++++--- 5 files changed, 98 insertions(+), 28 deletions(-) diff --git a/functions/get-order.ts b/functions/get-order.ts index 80da7acc..39f1f922 100644 --- a/functions/get-order.ts +++ b/functions/get-order.ts @@ -23,8 +23,12 @@ export async function onRequest(ctx: Context): Promise { if (!reloadlyTransaction) { return Response.json("Order not found.", { status: 404 }); } else if (reloadlyTransaction.status && reloadlyTransaction.status == "SUCCESSFUL") { - const product = await getGiftCardById(reloadlyTransaction.product.productId, accessToken); - return Response.json({ transaction: reloadlyTransaction, product: product }, { status: 200 }); + try { + const product = await getGiftCardById(reloadlyTransaction.product.productId, accessToken); + return Response.json({ transaction: reloadlyTransaction, product: product }, { status: 200 }); + } catch (error) { + return Response.json({ transaction: reloadlyTransaction, product: null }, { status: 200 }); + } } else { return Response.json({ message: "There is no successful transaction for given order ID." }, { status: 404 }); } diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index ce924c44..64b78e4d 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -47,11 +47,10 @@ export async function initClaimGiftCard(app: AppState) { if (retrieveOrderResponse.status == 200) { const { transaction, product } = (await retrieveOrderResponse.json()) as { transaction: OrderTransaction; - product: GiftCard; + product: GiftCard | null; }; - if (product) { - addPurchasedCardHtml(product, transaction, app, giftCardsSection, activateInfoSection); - } + + addPurchasedCardHtml(product, transaction, app, giftCardsSection, activateInfoSection); } else if (retrieveGiftCardResponse.status == 200) { const availableGiftCard = isGiftCardAvailable(giftCard, app.reward.amount) ? giftCard : null; @@ -66,28 +65,30 @@ export async function initClaimGiftCard(app: AppState) { } function addPurchasedCardHtml( - giftCard: GiftCard, + giftCard: GiftCard | null, transaction: OrderTransaction, app: AppState, giftCardsSection: HTMLElement, activateInfoSection: HTMLElement ) { const htmlParts: string[] = []; - htmlParts.push(`

Your gift card

`); + htmlParts.push(`

Your virtual visa/mastercard

`); htmlParts.push(`
`); - htmlParts.push(getGiftCardHtml(giftCard, app.reward.amount)); + if (giftCard) { + htmlParts.push(getGiftCardHtml(giftCard, app.reward.amount)); + } htmlParts.push(getRedeemCodeHtml(transaction)); htmlParts.push(`
`); giftCardsSection.innerHTML = htmlParts.join(""); - const activateInfoHtmlParts: string[] = []; - - activateInfoHtmlParts.push(getGiftCardActivateInfoHtml(giftCard)); - - activateInfoSection.innerHTML = activateInfoHtmlParts.join(""); + if (giftCard) { + const activateInfoHtmlParts: string[] = []; + activateInfoHtmlParts.push(getGiftCardActivateInfoHtml(giftCard)); + activateInfoSection.innerHTML = activateInfoHtmlParts.join(""); + } attachRevealAction(transaction, app); } diff --git a/static/scripts/rewards/gift-cards/reveal/redeem-code-html.ts b/static/scripts/rewards/gift-cards/reveal/redeem-code-html.ts index f1995b40..c861fe78 100644 --- a/static/scripts/rewards/gift-cards/reveal/redeem-code-html.ts +++ b/static/scripts/rewards/gift-cards/reveal/redeem-code-html.ts @@ -4,29 +4,65 @@ const html = String.raw; export function getRedeemCodeHtml(transaction: OrderTransaction) { return html` -
-

Your redeem code

+
+

Redeem code

xxxxxxxxxxxx

xxxxxxxxxxxx

xxxxxxxxxxxx

+
diff --git a/static/scripts/rewards/gift-cards/reveal/reveal-action.ts b/static/scripts/rewards/gift-cards/reveal/reveal-action.ts index d335cfbe..57d76697 100644 --- a/static/scripts/rewards/gift-cards/reveal/reveal-action.ts +++ b/static/scripts/rewards/gift-cards/reveal/reveal-action.ts @@ -47,7 +47,7 @@ async function revealRedeemCode(transactionId: number, signedMessage: string, ap const redeemCodeElements = document.getElementsByClassName("redeem-code"); if (redeemCodeElements && redeemCodeElements.length) { - let codesHtml = "

Your redeem code

"; + let codesHtml = "

Redeem code

"; responseJson.forEach((code) => { const keys = Object.keys(code); keys.forEach((key) => { diff --git a/static/styles/rewards/gift-cards.css b/static/styles/rewards/gift-cards.css index b431c08b..cfd603e6 100644 --- a/static/styles/rewards/gift-cards.css +++ b/static/styles/rewards/gift-cards.css @@ -28,11 +28,6 @@ justify-content: center; } -.purchased { - flex-direction: column; - align-items: center; -} - .gift-card { background-color: var(--background-color-default); display: flex; @@ -49,9 +44,12 @@ } } .redeem-code { - width: 160px; overflow-wrap: break-word; text-transform: none; + background-color: var(--background-color-default); + padding: 24px; + width: 100%; + text-align: center; } .redeem-code p { text-transform: none; @@ -178,16 +176,42 @@ display: none; } +#reveal-btn { + width: 100%; + padding: 12px; + background-color: var(--background-color-default); + border: none; + color: #808080; + cursor: pointer; +} +#reveal-btn:hover { + background-color: #80808020; + opacity: 1; + cursor: pointer; +} + #reveal-btn[data-loading-reveal="false"] .loading { display: none; } #reveal-btn[data-loading-reveal="false"] .action { + display: none; +} +#reveal-btn[data-loading-reveal="false"]:hover .icon { + display: none; +} +#reveal-btn[data-loading-reveal="false"]:hover .action { + display: block; + margin: 8px; +} + +#reveal-btn[data-loading-reveal="false"] .icon { display: block; } #reveal-btn[data-loading-reveal="true"] .loading { display: block; } + #reveal-btn[data-loading-reveal="true"] .loading svg { animation: rotate 1s linear infinite; } @@ -195,6 +219,11 @@ #reveal-btn[data-loading-reveal="true"] .action { display: none; } + +#reveal-btn[data-loading-reveal="true"] .icon { + display: none; +} + .disclaimer { text-align: center; padding-top: 24px; From 6bae6f4463f7f94c50f70ffdb4fcf5e6e354bbde Mon Sep 17 00:00:00 2001 From: EresDev Date: Tue, 27 Aug 2024 15:13:20 -0400 Subject: [PATCH 121/174] fix: improve ui --- .../scripts/rewards/gift-cards/gift-card.ts | 2 +- .../rewards/gift-cards/list-gift-cards.ts | 6 +- .../gift-cards/reveal/redeem-code-html.ts | 28 +-------- .../gift-cards/reveal/reveal-action.ts | 2 +- static/styles/rewards/gift-cards.css | 61 +++++++++---------- 5 files changed, 38 insertions(+), 61 deletions(-) diff --git a/static/scripts/rewards/gift-cards/gift-card.ts b/static/scripts/rewards/gift-cards/gift-card.ts index 31885778..edc37ed1 100644 --- a/static/scripts/rewards/gift-cards/gift-card.ts +++ b/static/scripts/rewards/gift-cards/gift-card.ts @@ -17,7 +17,7 @@ export function getGiftCardHtml(giftCard: GiftCard, rewardAmount: BigNumberish) ${giftCard.denominationType == "FIXED" ? getFixedPricesHtml(giftCard, rewardAmount) : getRangePricesHtml(giftCard, rewardAmount)}
- +
`; diff --git a/static/scripts/rewards/gift-cards/reveal/reveal-action.ts b/static/scripts/rewards/gift-cards/reveal/reveal-action.ts index 57d76697..7f5d5b4c 100644 --- a/static/scripts/rewards/gift-cards/reveal/reveal-action.ts +++ b/static/scripts/rewards/gift-cards/reveal/reveal-action.ts @@ -6,7 +6,7 @@ import { getApiBaseUrl } from "../helpers"; export function attachRevealAction(transaction: OrderTransaction, app: AppState) { const revealButton = document.getElementById("reveal-btn"); - const loaderAttribute = "data-loading-reveal"; + const loaderAttribute = "data-loading"; revealButton?.addEventListener("click", async () => { revealButton.setAttribute(loaderAttribute, "true"); const transactionId = document.getElementsByClassName("redeem-code")[0].getAttribute("data-transactionId"); diff --git a/static/styles/rewards/gift-cards.css b/static/styles/rewards/gift-cards.css index cfd603e6..abe098d7 100644 --- a/static/styles/rewards/gift-cards.css +++ b/static/styles/rewards/gift-cards.css @@ -17,15 +17,12 @@ .gift-cards-wrapper { display: flex; - flex-direction: row; + flex-direction: column; overflow-x: auto; max-width: 563px; width: 100vw; align-items: end; - padding-bottom: 12px; -} -.gift-cards-wrapper.center { - justify-content: center; + row-gap: 12px; } .gift-card { @@ -33,6 +30,7 @@ display: flex; padding: 24px; width: 100%; + box-sizing: border-box; } @media screen and (max-width: 640px) { .gift-card { @@ -50,6 +48,7 @@ padding: 24px; width: 100%; text-align: center; + box-sizing: border-box; } .redeem-code p { text-transform: none; @@ -133,56 +132,53 @@ .claim-gift-card-btn { width: 100%; - flex: 1; - padding: 0 24px; background-color: var(--background-color-default); border: none; color: #808080; + opacity: 0.5; + height: 48px; } .claim-gift-card-btn[data-loading="false"]:hover { background-color: #80808020; opacity: 1; cursor: pointer; } -.claim-gift-card-btn[data-loading="true"] > div.icon { +.claim-gift-card-btn[data-loading="true"] > .icon { display: none; } -.claim-gift-card-btn[data-loading="true"] > div.claim-title { +.claim-gift-card-btn[data-loading="true"] > .action { display: none; } -.claim-gift-card-btn[data-loading="true"] > div.loader { +.claim-gift-card-btn[data-loading="true"] > .loader { display: block; } -.claim-gift-card-btn[data-loading="true"] > div.loader svg { +.claim-gift-card-btn[data-loading="true"] > .loader svg { animation: rotate 1s linear infinite; } -.claim-gift-card-btn[data-loading="false"] > div.icon { +.claim-gift-card-btn[data-loading="false"] > .icon { display: block; } -.claim-gift-card-btn[data-loading="false"]:hover > div.icon { +.claim-gift-card-btn[data-loading="false"]:hover > .icon { display: none; } -.claim-gift-card-btn[data-loading="false"] > div.claim-title { +.claim-gift-card-btn[data-loading="false"] > .action { display: none; } -.claim-gift-card-btn[data-loading="false"]:hover > div.claim-title { +.claim-gift-card-btn[data-loading="false"]:hover > .action { display: block; } -.claim-gift-card-btn[data-loading="false"] > div.loader { - display: none; -} - -.gift-cards-wrapper.purchased .claim-gift-card-btn { +.claim-gift-card-btn[data-loading="false"] > .loader { display: none; } #reveal-btn { width: 100%; - padding: 12px; background-color: var(--background-color-default); border: none; color: #808080; cursor: pointer; + opacity: 0.5; + height: 48px; } #reveal-btn:hover { background-color: #80808020; @@ -190,37 +186,40 @@ cursor: pointer; } -#reveal-btn[data-loading-reveal="false"] .loading { +.action { + color: #fff; +} + +#reveal-btn[data-loading="false"] .loader { display: none; } -#reveal-btn[data-loading-reveal="false"] .action { +#reveal-btn[data-loading="false"] .action { display: none; } -#reveal-btn[data-loading-reveal="false"]:hover .icon { +#reveal-btn[data-loading="false"]:hover .icon { display: none; } -#reveal-btn[data-loading-reveal="false"]:hover .action { +#reveal-btn[data-loading="false"]:hover .action { display: block; - margin: 8px; } -#reveal-btn[data-loading-reveal="false"] .icon { +#reveal-btn[data-loading="false"] .icon { display: block; } -#reveal-btn[data-loading-reveal="true"] .loading { +#reveal-btn[data-loading="true"] .loader { display: block; } -#reveal-btn[data-loading-reveal="true"] .loading svg { +#reveal-btn[data-loading="true"] .loader svg { animation: rotate 1s linear infinite; } -#reveal-btn[data-loading-reveal="true"] .action { +#reveal-btn[data-loading="true"] .action { display: none; } -#reveal-btn[data-loading-reveal="true"] .icon { +#reveal-btn[data-loading="true"] .icon { display: none; } From dd9cf0da640dcd527140eaf06ecd9ffa03486800 Mon Sep 17 00:00:00 2001 From: EresDev Date: Tue, 27 Aug 2024 15:18:28 -0400 Subject: [PATCH 122/174] refactor: repalce term claim card with mint card --- .../scripts/rewards/gift-cards/gift-card.ts | 2 +- .../rewards/gift-cards/list-gift-cards.ts | 4 ++-- static/styles/rewards/gift-cards.css | 22 +++++++++---------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/static/scripts/rewards/gift-cards/gift-card.ts b/static/scripts/rewards/gift-cards/gift-card.ts index edc37ed1..6ccc8c16 100644 --- a/static/scripts/rewards/gift-cards/gift-card.ts +++ b/static/scripts/rewards/gift-cards/gift-card.ts @@ -16,7 +16,7 @@ export function getGiftCardHtml(giftCard: GiftCard, rewardAmount: BigNumberish)
${giftCard.denominationType == "FIXED" ? getFixedPricesHtml(giftCard, rewardAmount) : getRangePricesHtml(giftCard, rewardAmount)}
- - -
`; } diff --git a/static/styles/rewards/gift-cards.css b/static/styles/rewards/gift-cards.css index 1da78f9a..a32094d9 100644 --- a/static/styles/rewards/gift-cards.css +++ b/static/styles/rewards/gift-cards.css @@ -3,6 +3,8 @@ text-align: center; position: absolute; margin-top: -30px; + display: flex; + align-items: center; } #gift-cards { padding-top: 44px; @@ -23,6 +25,7 @@ width: 100vw; align-items: end; row-gap: 12px; + position: relative; } .gift-card { @@ -66,26 +69,7 @@ row-gap: 12px; flex: 1; } -.gift-card div.buttons { - display: flex; - flex-direction: row; - justify-content: space-evenly; - margin: 10px 0; -} -.gift-card div.buttons span { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 6px; -} -.gift-card div.buttons button { - background-color: #80808020; - border: none; - color: #fff; - cursor: pointer; -} .gift-card img { box-sizing: border-box; width: 100%; @@ -130,19 +114,6 @@ border-color: var(--light-mode-border-color); } -.mint-btn { - width: 100%; - background-color: var(--background-color-default); - border: none; - color: #808080; - opacity: 0.5; - height: 48px; -} -.mint-btn[data-loading="false"]:hover { - background-color: #80808020; - opacity: 1; - cursor: pointer; -} .mint-btn[data-loading="true"] > .icon { display: none; } @@ -171,22 +142,20 @@ display: none; } -#reveal-btn { +.btn { width: 100%; - background-color: var(--background-color-default); border: none; color: #808080; cursor: pointer; - opacity: 0.5; height: 48px; + background-color: inherit; } -#reveal-btn:hover { - background-color: #80808020; - opacity: 1; - cursor: pointer; +.btn .icon { + opacity: 0.5; } - -.action { +.btn:hover { + cursor: pointer; + background-color: #80808020; color: #fff; } @@ -230,16 +199,18 @@ @media (prefers-color-scheme: light) { .gift-card, - .redeem-info-wrapper { + .redeem-info-wrapper, + .redeem-code { background-color: #fff; } - .gift-card h3, - .gift-card .pricing .available, - .gift-card div.buttons button, - .close-btn { - color: #000; - } + .gift-card img { border-color: var(--light-mode-border-color); } + .gift-card .pricing .available div .amount { + color: #000; + } + .btn:hover { + color: #000; + } } From 11d6dd9a8fd9be42d8b6bde5099de28d48531826 Mon Sep 17 00:00:00 2001 From: EresDev Date: Tue, 27 Aug 2024 17:53:27 -0400 Subject: [PATCH 124/174] fix: stop minting card if permit is not claimable --- .../rewards/gift-cards/claim/claim-action.ts | 91 ++++++++++--------- .../rewards/gift-cards/list-gift-cards.ts | 4 +- 2 files changed, 48 insertions(+), 47 deletions(-) diff --git a/static/scripts/rewards/gift-cards/claim/claim-action.ts b/static/scripts/rewards/gift-cards/claim/claim-action.ts index 5bc9c82e..160797c8 100644 --- a/static/scripts/rewards/gift-cards/claim/claim-action.ts +++ b/static/scripts/rewards/gift-cards/claim/claim-action.ts @@ -11,63 +11,64 @@ import { OrderRequestParams, GiftCard } from "../../../../../shared/types"; import { isErc20Permit } from "../../render-transaction/render-transaction"; import { initClaimGiftCard } from "../list-gift-cards"; -export function attachClaimAction(className: string, giftCard: GiftCard, app: AppState) { - const claimButtons: HTMLCollectionOf = document.getElementsByClassName(className); - Array.from(claimButtons).forEach((claimButton: Element) => { - (claimButton as HTMLButtonElement).addEventListener("click", async () => { - claimButton.setAttribute("data-loading", "true"); - const productId = Number(claimButton.parentElement?.parentElement?.parentElement?.getAttribute("data-product-id")); +export function attachMintAction(giftCard: GiftCard, app: AppState) { + const claimButtons: HTMLCollectionOf = document.getElementsByClassName("mint-btn"); - if (!isErc20Permit(app.reward)) { - toaster.create("error", "Only ERC20 permits are allowed to claim a card."); - } else if (!isClaimableForAmount(giftCard, app.reward.amount)) { - toaster.create("error", "Your reward amount is not equal to the price of available card."); - } else { - await claimGiftCard(productId, app); - } + (claimButtons[0] as HTMLButtonElement).addEventListener("click", async () => { + claimButtons[0].setAttribute("data-loading", "true"); + const productId = Number(claimButtons[0].parentElement?.parentElement?.parentElement?.getAttribute("data-product-id")); + + if (!isErc20Permit(app.reward)) { + toaster.create("error", "Only ERC20 permits are allowed to claim a card."); + } else if (!isClaimableForAmount(giftCard, app.reward.amount)) { + toaster.create("error", "Your reward amount is not equal to the price of available card."); + } else { + await mintGiftCard(productId, app); + } - claimButton.setAttribute("data-loading", "false"); - }); + claimButtons[0].setAttribute("data-loading", "false"); }); } -async function claimGiftCard(productId: number, app: AppState) { +async function mintGiftCard(productId: number, app: AppState) { if (app.signer) { - await checkPermitClaimable(app); - const permit2Contract = new ethers.Contract(permit2Address, permit2Abi, app.signer); - if (!permit2Contract) return; + const isClaimiablle = await checkPermitClaimable(app); + if (isClaimiablle) { + const permit2Contract = new ethers.Contract(permit2Address, permit2Abi, app.signer); + if (!permit2Contract) return; - const reward = { - ...app.reward, - }; - reward.beneficiary = giftCardTreasuryAddress; + const reward = { + ...app.reward, + }; + reward.beneficiary = giftCardTreasuryAddress; - const tx = await transferFromPermit(permit2Contract, reward, "Processing... Please wait. Do not close this page."); - if (!tx) return; - await waitForTransaction(tx, `Transaction confirmed. Loading your card now.`); + const tx = await transferFromPermit(permit2Contract, reward, "Processing... Please wait. Do not close this page."); + if (!tx) return; + await waitForTransaction(tx, `Transaction confirmed. Loading your card now.`); - const url = `${getApiBaseUrl()}/post-order`; + const url = `${getApiBaseUrl()}/post-order`; - const orderParams: OrderRequestParams = { - chainId: app.signer.provider.network.chainId, - txHash: tx.hash, - productId, - }; - const response = await fetch(url, { - method: "POST", - headers: { - Accept: "application/json", - }, - body: JSON.stringify(orderParams), - }); + const orderParams: OrderRequestParams = { + chainId: app.signer.provider.network.chainId, + txHash: tx.hash, + productId, + }; + const response = await fetch(url, { + method: "POST", + headers: { + Accept: "application/json", + }, + body: JSON.stringify(orderParams), + }); - if (response.status != 200) { - toaster.create("error", "Order failed. Try again later."); - return; - } + if (response.status != 200) { + toaster.create("error", "Order failed. Try again later."); + return; + } - toaster.create("success", "Gift card claimed successfully."); - await initClaimGiftCard(app); + toaster.create("success", "Gift card claimed successfully."); + await initClaimGiftCard(app); + } } else { toaster.create("error", "Connect your wallet to proceed."); } diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index a5845db3..92be9426 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -2,7 +2,7 @@ import { isGiftCardAvailable, getGiftCardOrderId } from "../../../../shared/help import { GiftCard, OrderTransaction } from "../../../../shared/types"; import { AppState } from "../app-state"; import { attachActivateInfoAction } from "./activate/activate-action"; -import { attachClaimAction } from "./claim/claim-action"; +import { attachMintAction as attachMintAction } from "./claim/claim-action"; import { attachRevealAction } from "./reveal/reveal-action"; import { getApiBaseUrl, getUserCountryCode } from "./helpers"; import { getGiftCardActivateInfoHtml } from "./activate/activate-html"; @@ -108,7 +108,7 @@ function addAvailableCardsHtml(giftCard: GiftCard | null, app: AppState, giftCar activateInfoHtmlParts.push(getGiftCardActivateInfoHtml(giftCard)); activateInfoSection.innerHTML = activateInfoHtmlParts.join(""); - attachClaimAction("mint-btn", giftCard, app); + attachMintAction(giftCard, app); } else { htmlParts.push(`

There are no Visa/Mastercard available to claim at the moment.

`); giftCardsSection.innerHTML = htmlParts.join(""); From 619667d78a86eb98506b8bf1cdbe8db81431b4c9 Mon Sep 17 00:00:00 2001 From: EresDev Date: Wed, 28 Aug 2024 15:02:36 +0500 Subject: [PATCH 125/174] fix: make sandbox usable with special function --- functions/list-gift-cards.ts | 42 ++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/functions/list-gift-cards.ts b/functions/list-gift-cards.ts index 48257bd6..4c1505b8 100644 --- a/functions/list-gift-cards.ts +++ b/functions/list-gift-cards.ts @@ -32,9 +32,17 @@ export async function onRequest(ctx: Context): Promise { } async function getGiftCards(productQuery: string, country: string, accessToken: AccessToken): Promise { + if (accessToken.isSandbox) { + // Load product differently on sandbox + // Sandbox doesn't have mastercard, it has only 1 visa card for US. + // This visa card doesn't loadd with above url, let's use special url + // for this so that we have something to try on sandbox + return await getSandboxGiftCards(productQuery, country, accessToken); + } // productCategoryId = 1 = Finance. // This should prevent mixing of other gift cards with similar keywords const url = `${getBaseUrl(accessToken.isSandbox)}/countries/${country}/products?productName=${productQuery}&productCategoryId=1`; + console.log(`Retrieving gift cards from ${url}`); const options = { method: "GET", @@ -65,3 +73,37 @@ async function getGiftCards(productQuery: string, country: string, accessToken: return responseJson as GiftCard[]; } + +async function getSandboxGiftCards(productQuery: string, country: string, accessToken: AccessToken): Promise { + const url = `${getBaseUrl(accessToken.isSandbox)}/products?productName=${productQuery}&productCategoryId=1`; + + console.log(`Retrieving gift cards from ${url}`); + const options = { + method: "GET", + headers: { + ...commonHeaders, + Authorization: `Bearer ${accessToken.token}`, + }, + }; + + const response = await fetch(url, options); + const responseJson = await response.json(); + + console.log("Response status", response.status); + console.log(`Response from ${url}`, responseJson); + + if (response.status == 404) { + return []; + } + + if (response.status != 200) { + throw new Error( + `Error from Reloadly API: ${JSON.stringify({ + status: response.status, + message: (responseJson as ReloadlyFailureResponse).message, + })}` + ); + } + + return (responseJson as { content: GiftCard[] })?.content; +} From c57c245ff2784c63d7dca2b76f3a6fb4414013c4 Mon Sep 17 00:00:00 2001 From: EresDev Date: Wed, 28 Aug 2024 06:19:24 -0400 Subject: [PATCH 126/174] fix: check allowed country before loading cards --- functions/helpers.ts | 5 +- functions/reloadly-lists.ts | 563 ------------------ shared/allowed-country-list.ts | 562 +++++++++++++++++ .../rewards/gift-cards/list-gift-cards.ts | 6 + 4 files changed, 571 insertions(+), 565 deletions(-) create mode 100644 shared/allowed-country-list.ts diff --git a/functions/helpers.ts b/functions/helpers.ts index 07051126..91867e62 100644 --- a/functions/helpers.ts +++ b/functions/helpers.ts @@ -1,6 +1,7 @@ import { GiftCard } from "../shared/types"; +import { allowedCountries } from "../shared/allowed-country-list"; import { getGiftCardById } from "./post-order"; -import { countryAllowList, fallbackIntlMastercard, fallbackIntlVisa, masterCardIntlSkus, visaIntlSkus } from "./reloadly-lists"; +import { fallbackIntlMastercard, fallbackIntlVisa, masterCardIntlSkus, visaIntlSkus } from "./reloadly-lists"; import { AccessToken } from "./types"; export const allowedChainIds = [1, 5, 100, 31337]; @@ -57,7 +58,7 @@ export function getBaseUrl(isSandbox: boolean): string { } export async function pickBestCard(giftCards: GiftCard[], countryCode: string, accessToken: AccessToken): Promise { - const supportedCountry = countryAllowList.find((listItem) => listItem.code == countryCode); + const supportedCountry = allowedCountries.find((listItem) => listItem.code == countryCode); if (!supportedCountry) { throw new Error(`Country ${countryCode} is not in the allowed country list.`); } diff --git a/functions/reloadly-lists.ts b/functions/reloadly-lists.ts index ceea5627..392255c7 100644 --- a/functions/reloadly-lists.ts +++ b/functions/reloadly-lists.ts @@ -416,566 +416,3 @@ export const visaIntlSkus = [ sku: 18629, }, ]; - -/** - * There are separate allow list for visa & mastercard - * But right now, both lists contain same countries - */ -export const countryAllowList = [ - { - code: "GP", - name: "Guadeloupe", - }, - { - code: "AO", - name: "Angola", - }, - { - code: "KI", - name: "Kiribati", - }, - { - code: "CA", - name: "Canada", - }, - { - code: "CM", - name: "Cameroon", - }, - { - code: "QA", - name: "Qatar", - }, - { - code: "VU", - name: "Vanuatu", - }, - { - code: "EC", - name: "Ecuador", - }, - { - code: "AE", - name: "United Arab Emirates", - }, - { - code: "KZ", - name: "Kazakhstan", - }, - { - code: "GI", - name: "Gibraltar", - }, - { - code: "ID", - name: "Indonesia", - }, - { - code: "BG", - name: "Bulgaria", - }, - { - code: "BE", - name: "Belgium", - }, - { - code: "CO", - name: "Colombia", - }, - { - code: "BR", - name: "Brazil", - }, - { - code: "IT", - name: "Italy", - }, - { - code: "EG", - name: "Egypt", - }, - { - code: "KR", - name: "South Korea", - }, - { - code: "ZA", - name: "South Africa", - }, - { - code: "OM", - name: "Oman", - }, - { - code: "NF", - name: "Norfolk Island", - }, - { - code: "SI", - name: "Slovak Republic", - }, - { - code: "SB", - name: "Solomon Islands", - }, - { - code: "LU", - name: "Luxembourg", - }, - { - code: "BV", - name: "Bouvet Island", - }, - { - code: "GG", - name: "Guernsey", - }, - { - code: "GD", - name: "Grenada", - }, - { - code: "AW", - name: "Aruba", - }, - { - code: "JM", - name: "Jamaica", - }, - { - code: "GF", - name: "French Guiana", - }, - { - code: "NO", - name: "Norway", - }, - { - code: "LI", - name: "Liechtenstein", - }, - { - code: "HK", - name: "Hong Kong", - }, - { - code: "HU", - name: "Hungary", - }, - { - code: "PE", - name: "Peru", - }, - { - code: "AM", - name: "Armenia", - }, - { - code: "NL", - name: "Netherlands", - }, - { - code: "BN", - name: "Brunei Darussalam", - }, - { - code: "BM", - name: "Bermuda", - }, - { - code: "VI", - name: "Virgin Islands (U.S.)", - }, - { - code: "MS", - name: "Montserrat", - }, - { - code: "GY", - name: "Guyana", - }, - { - code: "DJ", - name: "Djibouti", - }, - { - code: "PL", - name: "Poland", - }, - { - code: "DK", - name: "Denmark", - }, - { - code: "FM", - name: "Federated States of Micronesia", - }, - { - code: "GH", - name: "Ghana", - }, - { - code: "AD", - name: "Andorra", - }, - { - code: "PF", - name: "French Polynesia", - }, - { - code: "LV", - name: "Latvia", - }, - { - code: "AZ", - name: "Azerbaijan", - }, - { - code: "TO", - name: "Tonga", - }, - { - code: "CC", - name: "Cocos (Keeling) Islands", - }, - { - code: "MR", - name: "Mauritania", - }, - { - code: "IL", - name: "Israel", - }, - { - code: "GB", - name: "UK", - }, - { - code: "LT", - name: "Lithuania", - }, - { - code: "CL", - name: "Chile", - }, - { - code: "DE", - name: "Germany", - }, - { - code: "IN", - name: "India", - }, - { - code: "BW", - name: "Botswana", - }, - { - code: "IS", - name: "Iceland", - }, - { - code: "FI", - name: "Finland", - }, - { - code: "BH", - name: "Bahrain", - }, - { - code: "US", - name: "USA", - }, - { - code: "AI", - name: "Anguilla", - }, - { - code: "CZ", - name: "Czech Republic", - }, - { - code: "ES", - name: "Spain", - }, - { - code: "MT", - name: "Malta", - }, - { - code: "SG", - name: "Singapore", - }, - { - code: "DZ", - name: "Algeria", - }, - { - code: "CY", - name: "Cyprus", - }, - { - code: "YT", - name: "Mayotte", - }, - { - code: "MP", - name: "Northern Mariana Islands", - }, - { - code: "HR", - name: "Croatia", - }, - { - code: "CK", - name: "Cook Islands", - }, - { - code: "GL", - name: "Greenland", - }, - { - code: "SA", - name: "Saudi Arabia", - }, - { - code: "GT", - name: "Guatemala", - }, - { - code: "MY", - name: "Malaysia", - }, - { - code: "JO", - name: "Jordan", - }, - { - code: "IE", - name: "Ireland", - }, - { - code: "CX", - name: "Christmas Island", - }, - { - code: "RO", - name: "Romania", - }, - { - code: "NZ", - name: "New Zealand", - }, - { - code: "SV", - name: "El Salvador", - }, - { - code: "FR", - name: "France", - }, - { - code: "KE", - name: "Kenya", - }, - { - code: "DM", - name: "Dominica", - }, - { - code: "MA", - name: "Morocco", - }, - { - code: "TW", - name: "Taiwan", - }, - { - code: "NU", - name: "Niue", - }, - { - code: "JP", - name: "Japan", - }, - { - code: "PH", - name: "Philippines", - }, - { - code: "GE", - name: "Georgia", - }, - { - code: "GU", - name: "Guam", - }, - { - code: "PW", - name: "Palau", - }, - { - code: "AU", - name: "Australia", - }, - { - code: "AS", - name: "American Samoa", - }, - { - code: "CR", - name: "Costa Rica", - }, - { - code: "GM", - name: "Gambia", - }, - { - code: "TH", - name: "Thailand", - }, - { - code: "CW", - name: "Curaçao", - }, - { - code: "MQ", - name: "Martinique", - }, - { - code: "PR", - name: "Puerto Rico", - }, - { - code: "BQ", - name: "Caribbean Netherlands", - }, - { - code: "BZ", - name: "Belize", - }, - { - code: "MW", - name: "Malawi", - }, - { - code: "NE", - name: "Niger", - }, - { - code: "SI", - name: "Slovenia", - }, - { - code: "AT", - name: "Austria", - }, - { - code: "MX", - name: "Mexico", - }, - { - code: "LK", - name: "Sri lanka", - }, - { - code: "PT", - name: "Portugal", - }, - { - code: "FK", - name: "Falkland Islands", - }, - { - code: "UY", - name: "Uruguay", - }, - { - code: "IO", - name: "British Indian Ocean Territory", - }, - { - code: "GR", - name: "Greece", - }, - { - code: "VA", - name: "Vatican City", - }, - { - code: "AQ", - name: "Antarctica", - }, - { - code: "FO", - name: "Faroe Islands", - }, - { - code: "EE", - name: "Estonia", - }, - { - code: "TV", - name: "Tuvalu", - }, - { - code: "TF", - name: "French Southern Territories", - }, - { - code: "SE", - name: "Sweden", - }, - { - code: "AG", - name: "Antigua and Barbuda", - }, - { - code: "BO", - name: "Bolivia", - }, - { - code: "GA", - name: "Gabon", - }, - { - code: "TM", - name: "Turkmenistan", - }, - { - code: "AR", - name: "Argentina", - }, - { - code: "JE", - name: "Jersey", - }, - { - code: "CV", - name: "Cabo Verde", - }, - { - code: "HM", - name: "Heard Island and McDonald Islands", - }, - { - code: "BD", - name: "Bangladesh", - }, - { - code: "BT", - name: "Bhutan", - }, - { - code: "FJ", - name: "Fiji", - }, - { - code: "CH", - name: "Switzerland", - }, - { - code: "MC", - name: "Monaco", - }, -]; diff --git a/shared/allowed-country-list.ts b/shared/allowed-country-list.ts new file mode 100644 index 00000000..676b7e96 --- /dev/null +++ b/shared/allowed-country-list.ts @@ -0,0 +1,562 @@ +/** + * There are separate allow list for visa & mastercard + * But right now, both lists contain same countries + */ +export const allowedCountries = [ + { + code: "GP", + name: "Guadeloupe", + }, + { + code: "AO", + name: "Angola", + }, + { + code: "KI", + name: "Kiribati", + }, + { + code: "CA", + name: "Canada", + }, + { + code: "CM", + name: "Cameroon", + }, + { + code: "QA", + name: "Qatar", + }, + { + code: "VU", + name: "Vanuatu", + }, + { + code: "EC", + name: "Ecuador", + }, + { + code: "AE", + name: "United Arab Emirates", + }, + { + code: "KZ", + name: "Kazakhstan", + }, + { + code: "GI", + name: "Gibraltar", + }, + { + code: "ID", + name: "Indonesia", + }, + { + code: "BG", + name: "Bulgaria", + }, + { + code: "BE", + name: "Belgium", + }, + { + code: "CO", + name: "Colombia", + }, + { + code: "BR", + name: "Brazil", + }, + { + code: "IT", + name: "Italy", + }, + { + code: "EG", + name: "Egypt", + }, + { + code: "KR", + name: "South Korea", + }, + { + code: "ZA", + name: "South Africa", + }, + { + code: "OM", + name: "Oman", + }, + { + code: "NF", + name: "Norfolk Island", + }, + { + code: "SI", + name: "Slovak Republic", + }, + { + code: "SB", + name: "Solomon Islands", + }, + { + code: "LU", + name: "Luxembourg", + }, + { + code: "BV", + name: "Bouvet Island", + }, + { + code: "GG", + name: "Guernsey", + }, + { + code: "GD", + name: "Grenada", + }, + { + code: "AW", + name: "Aruba", + }, + { + code: "JM", + name: "Jamaica", + }, + { + code: "GF", + name: "French Guiana", + }, + { + code: "NO", + name: "Norway", + }, + { + code: "LI", + name: "Liechtenstein", + }, + { + code: "HK", + name: "Hong Kong", + }, + { + code: "HU", + name: "Hungary", + }, + { + code: "PE", + name: "Peru", + }, + { + code: "AM", + name: "Armenia", + }, + { + code: "NL", + name: "Netherlands", + }, + { + code: "BN", + name: "Brunei Darussalam", + }, + { + code: "BM", + name: "Bermuda", + }, + { + code: "VI", + name: "Virgin Islands (U.S.)", + }, + { + code: "MS", + name: "Montserrat", + }, + { + code: "GY", + name: "Guyana", + }, + { + code: "DJ", + name: "Djibouti", + }, + { + code: "PL", + name: "Poland", + }, + { + code: "DK", + name: "Denmark", + }, + { + code: "FM", + name: "Federated States of Micronesia", + }, + { + code: "GH", + name: "Ghana", + }, + { + code: "AD", + name: "Andorra", + }, + { + code: "PF", + name: "French Polynesia", + }, + { + code: "LV", + name: "Latvia", + }, + { + code: "AZ", + name: "Azerbaijan", + }, + { + code: "TO", + name: "Tonga", + }, + { + code: "CC", + name: "Cocos (Keeling) Islands", + }, + { + code: "MR", + name: "Mauritania", + }, + { + code: "IL", + name: "Israel", + }, + { + code: "GB", + name: "UK", + }, + { + code: "LT", + name: "Lithuania", + }, + { + code: "CL", + name: "Chile", + }, + { + code: "DE", + name: "Germany", + }, + { + code: "IN", + name: "India", + }, + { + code: "BW", + name: "Botswana", + }, + { + code: "IS", + name: "Iceland", + }, + { + code: "FI", + name: "Finland", + }, + { + code: "BH", + name: "Bahrain", + }, + { + code: "US", + name: "USA", + }, + { + code: "AI", + name: "Anguilla", + }, + { + code: "CZ", + name: "Czech Republic", + }, + { + code: "ES", + name: "Spain", + }, + { + code: "MT", + name: "Malta", + }, + { + code: "SG", + name: "Singapore", + }, + { + code: "DZ", + name: "Algeria", + }, + { + code: "CY", + name: "Cyprus", + }, + { + code: "YT", + name: "Mayotte", + }, + { + code: "MP", + name: "Northern Mariana Islands", + }, + { + code: "HR", + name: "Croatia", + }, + { + code: "CK", + name: "Cook Islands", + }, + { + code: "GL", + name: "Greenland", + }, + { + code: "SA", + name: "Saudi Arabia", + }, + { + code: "GT", + name: "Guatemala", + }, + { + code: "MY", + name: "Malaysia", + }, + { + code: "JO", + name: "Jordan", + }, + { + code: "IE", + name: "Ireland", + }, + { + code: "CX", + name: "Christmas Island", + }, + { + code: "RO", + name: "Romania", + }, + { + code: "NZ", + name: "New Zealand", + }, + { + code: "SV", + name: "El Salvador", + }, + { + code: "FR", + name: "France", + }, + { + code: "KE", + name: "Kenya", + }, + { + code: "DM", + name: "Dominica", + }, + { + code: "MA", + name: "Morocco", + }, + { + code: "TW", + name: "Taiwan", + }, + { + code: "NU", + name: "Niue", + }, + { + code: "JP", + name: "Japan", + }, + { + code: "PH", + name: "Philippines", + }, + { + code: "GE", + name: "Georgia", + }, + { + code: "GU", + name: "Guam", + }, + { + code: "PW", + name: "Palau", + }, + { + code: "AU", + name: "Australia", + }, + { + code: "AS", + name: "American Samoa", + }, + { + code: "CR", + name: "Costa Rica", + }, + { + code: "GM", + name: "Gambia", + }, + { + code: "TH", + name: "Thailand", + }, + { + code: "CW", + name: "Curaçao", + }, + { + code: "MQ", + name: "Martinique", + }, + { + code: "PR", + name: "Puerto Rico", + }, + { + code: "BQ", + name: "Caribbean Netherlands", + }, + { + code: "BZ", + name: "Belize", + }, + { + code: "MW", + name: "Malawi", + }, + { + code: "NE", + name: "Niger", + }, + { + code: "SI", + name: "Slovenia", + }, + { + code: "AT", + name: "Austria", + }, + { + code: "MX", + name: "Mexico", + }, + { + code: "LK", + name: "Sri lanka", + }, + { + code: "PT", + name: "Portugal", + }, + { + code: "FK", + name: "Falkland Islands", + }, + { + code: "UY", + name: "Uruguay", + }, + { + code: "IO", + name: "British Indian Ocean Territory", + }, + { + code: "GR", + name: "Greece", + }, + { + code: "VA", + name: "Vatican City", + }, + { + code: "AQ", + name: "Antarctica", + }, + { + code: "FO", + name: "Faroe Islands", + }, + { + code: "EE", + name: "Estonia", + }, + { + code: "TV", + name: "Tuvalu", + }, + { + code: "TF", + name: "French Southern Territories", + }, + { + code: "SE", + name: "Sweden", + }, + { + code: "AG", + name: "Antigua and Barbuda", + }, + { + code: "BO", + name: "Bolivia", + }, + { + code: "GA", + name: "Gabon", + }, + { + code: "TM", + name: "Turkmenistan", + }, + { + code: "AR", + name: "Argentina", + }, + { + code: "JE", + name: "Jersey", + }, + { + code: "CV", + name: "Cabo Verde", + }, + { + code: "HM", + name: "Heard Island and McDonald Islands", + }, + { + code: "BD", + name: "Bangladesh", + }, + { + code: "BT", + name: "Bhutan", + }, + { + code: "FJ", + name: "Fiji", + }, + { + code: "CH", + name: "Switzerland", + }, + { + code: "MC", + name: "Monaco", + }, +]; diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index 92be9426..191486c5 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -8,6 +8,7 @@ import { getApiBaseUrl, getUserCountryCode } from "./helpers"; import { getGiftCardActivateInfoHtml } from "./activate/activate-html"; import { getGiftCardHtml } from "./gift-card"; import { getRedeemCodeHtml } from "./reveal/redeem-code-html"; +import { allowedCountries } from "../../../../shared/allowed-country-list"; export async function initClaimGiftCard(app: AppState) { const giftCardsSection = document.getElementById("gift-cards"); @@ -30,6 +31,11 @@ export async function initClaimGiftCard(app: AppState) { return; } + if (!allowedCountries.find((allowedCountry) => allowedCountry.code == country)) { + giftCardsSection.innerHTML = `

Virtual cards are not available for your location.

Use other methods to claim your reward.

`; + return; + } + const retrieveOrderUrl = `${getApiBaseUrl()}/get-order?orderId=${getGiftCardOrderId(app.reward.beneficiary, app.reward.signature)}`; const listGiftCardsUrl = `${getApiBaseUrl()}/list-gift-cards?country=${country}`; From 61e7b242d8d365850c13b72df166f9b773fbfb8d Mon Sep 17 00:00:00 2001 From: EresDev Date: Wed, 28 Aug 2024 06:51:01 -0400 Subject: [PATCH 127/174] refactor: load cards list in selector function --- functions/helpers.ts | 84 +++++++++++++++++++++++++++++++++- functions/list-gift-cards.ts | 87 ++---------------------------------- 2 files changed, 85 insertions(+), 86 deletions(-) diff --git a/functions/helpers.ts b/functions/helpers.ts index 91867e62..384e3f34 100644 --- a/functions/helpers.ts +++ b/functions/helpers.ts @@ -2,7 +2,7 @@ import { GiftCard } from "../shared/types"; import { allowedCountries } from "../shared/allowed-country-list"; import { getGiftCardById } from "./post-order"; import { fallbackIntlMastercard, fallbackIntlVisa, masterCardIntlSkus, visaIntlSkus } from "./reloadly-lists"; -import { AccessToken } from "./types"; +import { AccessToken, ReloadlyFailureResponse } from "./types"; export const allowedChainIds = [1, 5, 100, 31337]; @@ -57,12 +57,15 @@ export function getBaseUrl(isSandbox: boolean): string { return "https://giftcards-sandbox.reloadly.com"; } -export async function pickBestCard(giftCards: GiftCard[], countryCode: string, accessToken: AccessToken): Promise { +export async function getSuitableCard(countryCode: string, accessToken: AccessToken): Promise { const supportedCountry = allowedCountries.find((listItem) => listItem.code == countryCode); if (!supportedCountry) { throw new Error(`Country ${countryCode} is not in the allowed country list.`); } + const [masterCards, visaCards] = await Promise.all([getGiftCards("mastercard", countryCode, accessToken), getGiftCards("visa", countryCode, accessToken)]); + const giftCards = [...masterCards, ...visaCards]; + const masterCardIntlSku = masterCardIntlSkus.find((sku) => sku.countryCode == countryCode); if (masterCardIntlSku) { const tokenizedIntlMastercard = giftCards.find((giftCard) => giftCard.productId == masterCardIntlSku.sku); @@ -121,3 +124,80 @@ async function getFallbackIntlVisa(accessToken: AccessToken): Promise { + if (accessToken.isSandbox) { + // Load product differently on Reloadly sandbox + // Sandbox doesn't have mastercard, it has only 1 visa card for US. + // This visa card doesn't load with above url, let's use special url + // for this so that we have something to try on sandbox + return await getSandboxGiftCards(productQuery, country, accessToken); + } + // productCategoryId = 1 = Finance. + // This should prevent mixing of other gift cards with similar keywords + const url = `${getBaseUrl(accessToken.isSandbox)}/countries/${country}/products?productName=${productQuery}&productCategoryId=1`; + + console.log(`Retrieving gift cards from ${url}`); + const options = { + method: "GET", + headers: { + ...commonHeaders, + Authorization: `Bearer ${accessToken.token}`, + }, + }; + + const response = await fetch(url, options); + const responseJson = await response.json(); + + console.log("Response status", response.status); + console.log(`Response from ${url}`, responseJson); + + if (response.status == 404) { + return []; + } + + if (response.status != 200) { + throw new Error( + `Error from Reloadly API: ${JSON.stringify({ + status: response.status, + message: (responseJson as ReloadlyFailureResponse).message, + })}` + ); + } + + return responseJson as GiftCard[]; +} + +async function getSandboxGiftCards(productQuery: string, country: string, accessToken: AccessToken): Promise { + const url = `${getBaseUrl(accessToken.isSandbox)}/products?productName=${productQuery}&productCategoryId=1`; + + console.log(`Retrieving gift cards from ${url}`); + const options = { + method: "GET", + headers: { + ...commonHeaders, + Authorization: `Bearer ${accessToken.token}`, + }, + }; + + const response = await fetch(url, options); + const responseJson = await response.json(); + + console.log("Response status", response.status); + console.log(`Response from ${url}`, responseJson); + + if (response.status == 404) { + return []; + } + + if (response.status != 200) { + throw new Error( + `Error from Reloadly API: ${JSON.stringify({ + status: response.status, + message: (responseJson as ReloadlyFailureResponse).message, + })}` + ); + } + + return (responseJson as { content: GiftCard[] })?.content; +} diff --git a/functions/list-gift-cards.ts b/functions/list-gift-cards.ts index 4c1505b8..ac2ba7b6 100644 --- a/functions/list-gift-cards.ts +++ b/functions/list-gift-cards.ts @@ -1,6 +1,5 @@ -import { GiftCard } from "../shared/types"; -import { commonHeaders, getAccessToken, getBaseUrl, pickBestCard } from "./helpers"; -import { AccessToken, Context, ReloadlyFailureResponse } from "./types"; +import { getAccessToken, getSuitableCard } from "./helpers"; +import { Context } from "./types"; import { validateEnvVars, validateRequestMethod } from "./validators"; export async function onRequest(ctx: Context): Promise { @@ -16,10 +15,7 @@ export async function onRequest(ctx: Context): Promise { } const accessToken = await getAccessToken(ctx.env); - const [masterCards, visaCards] = await Promise.all([getGiftCards("mastercard", country, accessToken), getGiftCards("visa", country, accessToken)]); - - const giftCards = [...masterCards, ...visaCards]; - const suitableCard = await pickBestCard(giftCards, country, accessToken); + const suitableCard = await getSuitableCard(country, accessToken); if (suitableCard) { return Response.json(suitableCard, { status: 200 }); @@ -30,80 +26,3 @@ export async function onRequest(ctx: Context): Promise { return Response.json({ message: "There was an error while processing your request." }, { status: 500 }); } } - -async function getGiftCards(productQuery: string, country: string, accessToken: AccessToken): Promise { - if (accessToken.isSandbox) { - // Load product differently on sandbox - // Sandbox doesn't have mastercard, it has only 1 visa card for US. - // This visa card doesn't loadd with above url, let's use special url - // for this so that we have something to try on sandbox - return await getSandboxGiftCards(productQuery, country, accessToken); - } - // productCategoryId = 1 = Finance. - // This should prevent mixing of other gift cards with similar keywords - const url = `${getBaseUrl(accessToken.isSandbox)}/countries/${country}/products?productName=${productQuery}&productCategoryId=1`; - - console.log(`Retrieving gift cards from ${url}`); - const options = { - method: "GET", - headers: { - ...commonHeaders, - Authorization: `Bearer ${accessToken.token}`, - }, - }; - - const response = await fetch(url, options); - const responseJson = await response.json(); - - console.log("Response status", response.status); - console.log(`Response from ${url}`, responseJson); - - if (response.status == 404) { - return []; - } - - if (response.status != 200) { - throw new Error( - `Error from Reloadly API: ${JSON.stringify({ - status: response.status, - message: (responseJson as ReloadlyFailureResponse).message, - })}` - ); - } - - return responseJson as GiftCard[]; -} - -async function getSandboxGiftCards(productQuery: string, country: string, accessToken: AccessToken): Promise { - const url = `${getBaseUrl(accessToken.isSandbox)}/products?productName=${productQuery}&productCategoryId=1`; - - console.log(`Retrieving gift cards from ${url}`); - const options = { - method: "GET", - headers: { - ...commonHeaders, - Authorization: `Bearer ${accessToken.token}`, - }, - }; - - const response = await fetch(url, options); - const responseJson = await response.json(); - - console.log("Response status", response.status); - console.log(`Response from ${url}`, responseJson); - - if (response.status == 404) { - return []; - } - - if (response.status != 200) { - throw new Error( - `Error from Reloadly API: ${JSON.stringify({ - status: response.status, - message: (responseJson as ReloadlyFailureResponse).message, - })}` - ); - } - - return (responseJson as { content: GiftCard[] })?.content; -} From e366bc2bc006b8931a9715f327c9db7c417b304d Mon Sep 17 00:00:00 2001 From: EresDev Date: Wed, 28 Aug 2024 07:08:47 -0400 Subject: [PATCH 128/174] fix: check suitable card on order placement --- functions/post-order.ts | 10 +++++++--- shared/types.ts | 1 + .../rewards/gift-cards/claim/claim-action.ts | 18 ++++++++++++------ 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/functions/post-order.ts b/functions/post-order.ts index b4a18ac2..a7f9ffb4 100644 --- a/functions/post-order.ts +++ b/functions/post-order.ts @@ -7,7 +7,7 @@ import { getGiftCardValue, isClaimableForAmount } from "../shared/pricing"; import { ExchangeRate, GiftCard, OrderRequestParams } from "../shared/types"; import { permit2Abi } from "../static/scripts/rewards/abis/permit2-abi"; import { getTransactionFromOrderId } from "./get-order"; -import { allowedChainIds, commonHeaders, getAccessToken, getBaseUrl } from "./helpers"; +import { allowedChainIds, commonHeaders, getAccessToken, getBaseUrl, getSuitableCard } from "./helpers"; import { AccessToken, Context, ReloadlyFailureResponse, ReloadlyOrderResponse } from "./types"; import { validateEnvVars, validateRequestMethod } from "./validators"; @@ -18,12 +18,16 @@ export async function onRequest(ctx: Context): Promise { const accessToken = await getAccessToken(ctx.env); - const { productId, txHash, chainId } = (await ctx.request.json()) as OrderRequestParams; + const { productId, txHash, chainId, country } = (await ctx.request.json()) as OrderRequestParams; - if (isNaN(productId) || isNaN(chainId) || !(productId && txHash && chainId)) { + if (isNaN(productId) || isNaN(chainId) || !(productId && txHash && chainId && country)) { throw new Error(`Invalid post parameters: ${JSON.stringify({ productId, txHash, chainId })}`); } + const suitableCard = await getSuitableCard(country, accessToken); + if (suitableCard.productId != productId) { + throw new Error(`You are not ordering the suitable card: ${JSON.stringify({ ordered: productId, suitable: suitableCard })}`); + } if (!allowedChainIds.includes(chainId)) { throw new Error(`Unsupported chain: ${JSON.stringify({ chainId })}`); } diff --git a/shared/types.ts b/shared/types.ts index a328d14c..91ae882d 100644 --- a/shared/types.ts +++ b/shared/types.ts @@ -88,6 +88,7 @@ export interface OrderRequestParams { productId: number; txHash: string; chainId: number; + country: string; } export interface ExchangeRate { diff --git a/static/scripts/rewards/gift-cards/claim/claim-action.ts b/static/scripts/rewards/gift-cards/claim/claim-action.ts index 160797c8..19a03719 100644 --- a/static/scripts/rewards/gift-cards/claim/claim-action.ts +++ b/static/scripts/rewards/gift-cards/claim/claim-action.ts @@ -1,14 +1,13 @@ import { ethers } from "ethers"; +import { giftCardTreasuryAddress, permit2Address } from "../../../../../shared/constants"; +import { isClaimableForAmount } from "../../../../../shared/pricing"; +import { GiftCard, OrderRequestParams } from "../../../../../shared/types"; import { permit2Abi } from "../../abis"; import { AppState } from "../../app-state"; -import { permit2Address } from "../../../../../shared/constants"; -import { giftCardTreasuryAddress } from "../../../../../shared/constants"; +import { isErc20Permit } from "../../render-transaction/render-transaction"; import { toaster } from "../../toaster"; import { checkPermitClaimable, transferFromPermit, waitForTransaction } from "../../web3/erc20-permit"; -import { getApiBaseUrl } from "../helpers"; -import { isClaimableForAmount } from "../../../../../shared/pricing"; -import { OrderRequestParams, GiftCard } from "../../../../../shared/types"; -import { isErc20Permit } from "../../render-transaction/render-transaction"; +import { getApiBaseUrl, getUserCountryCode } from "../helpers"; import { initClaimGiftCard } from "../list-gift-cards"; export function attachMintAction(giftCard: GiftCard, app: AppState) { @@ -32,6 +31,12 @@ export function attachMintAction(giftCard: GiftCard, app: AppState) { async function mintGiftCard(productId: number, app: AppState) { if (app.signer) { + const country = await getUserCountryCode(); + if (!country) { + toaster.create("error", "Failed to detect your location to pick a suitable card for you."); + return; + } + const isClaimiablle = await checkPermitClaimable(app); if (isClaimiablle) { const permit2Contract = new ethers.Contract(permit2Address, permit2Abi, app.signer); @@ -52,6 +57,7 @@ async function mintGiftCard(productId: number, app: AppState) { chainId: app.signer.provider.network.chainId, txHash: tx.hash, productId, + country: country, }; const response = await fetch(url, { method: "POST", From 7994fa12df9c901c73a5ed2108e733096e1114c8 Mon Sep 17 00:00:00 2001 From: EresDev Date: Wed, 28 Aug 2024 10:14:35 -0400 Subject: [PATCH 129/174] fix: send correct product id to post order --- static/scripts/rewards/gift-cards/claim/claim-action.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/static/scripts/rewards/gift-cards/claim/claim-action.ts b/static/scripts/rewards/gift-cards/claim/claim-action.ts index 19a03719..d9dfb1f5 100644 --- a/static/scripts/rewards/gift-cards/claim/claim-action.ts +++ b/static/scripts/rewards/gift-cards/claim/claim-action.ts @@ -15,7 +15,7 @@ export function attachMintAction(giftCard: GiftCard, app: AppState) { (claimButtons[0] as HTMLButtonElement).addEventListener("click", async () => { claimButtons[0].setAttribute("data-loading", "true"); - const productId = Number(claimButtons[0].parentElement?.parentElement?.parentElement?.getAttribute("data-product-id")); + const productId = Number(document.getElementsByClassName("gift-card")[0].getAttribute("data-product-id")); if (!isErc20Permit(app.reward)) { toaster.create("error", "Only ERC20 permits are allowed to claim a card."); @@ -72,7 +72,7 @@ async function mintGiftCard(productId: number, app: AppState) { return; } - toaster.create("success", "Gift card claimed successfully."); + toaster.create("success", "Gift card minted successfully."); await initClaimGiftCard(app); } } else { From 2589db9faca4312aa91aeb66745ef8fbdea05545 Mon Sep 17 00:00:00 2001 From: EresDev Date: Wed, 28 Aug 2024 10:16:37 -0400 Subject: [PATCH 130/174] refactor: reword claim to mint --- static/scripts/rewards/gift-cards/list-gift-cards.ts | 2 +- .../gift-cards/{claim/claim-action.ts => mint/mint-action.ts} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename static/scripts/rewards/gift-cards/{claim/claim-action.ts => mint/mint-action.ts} (100%) diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/list-gift-cards.ts index 191486c5..6d879440 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/list-gift-cards.ts @@ -2,7 +2,7 @@ import { isGiftCardAvailable, getGiftCardOrderId } from "../../../../shared/help import { GiftCard, OrderTransaction } from "../../../../shared/types"; import { AppState } from "../app-state"; import { attachActivateInfoAction } from "./activate/activate-action"; -import { attachMintAction as attachMintAction } from "./claim/claim-action"; +import { attachMintAction } from "./mint/mint-action"; import { attachRevealAction } from "./reveal/reveal-action"; import { getApiBaseUrl, getUserCountryCode } from "./helpers"; import { getGiftCardActivateInfoHtml } from "./activate/activate-html"; diff --git a/static/scripts/rewards/gift-cards/claim/claim-action.ts b/static/scripts/rewards/gift-cards/mint/mint-action.ts similarity index 100% rename from static/scripts/rewards/gift-cards/claim/claim-action.ts rename to static/scripts/rewards/gift-cards/mint/mint-action.ts From 56f62af359724707ca9826c9f268a48d0f819bf2 Mon Sep 17 00:00:00 2001 From: EresDev Date: Wed, 28 Aug 2024 10:43:23 -0400 Subject: [PATCH 131/174] chore: fix spellings --- .cspell.json | 1 + functions/helpers.ts | 4 ++-- shared/allowed-country-list.ts | 4 ++++ static/scripts/rewards/gift-cards/mint/mint-action.ts | 4 ++-- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/.cspell.json b/.cspell.json index a89f082e..b32eb680 100644 --- a/.cspell.json +++ b/.cspell.json @@ -36,6 +36,7 @@ "Rpcs", "scalarmult", "servedir", + "skus", "solmate", "sonarjs", "SUPABASE", diff --git a/functions/helpers.ts b/functions/helpers.ts index 384e3f34..d0486707 100644 --- a/functions/helpers.ts +++ b/functions/helpers.ts @@ -74,7 +74,7 @@ export async function getSuitableCard(countryCode: string, accessToken: AccessTo } } - const fallbackMastercard = await getFallbackIntlMasteracrd(accessToken); + const fallbackMastercard = await getFallbackIntlMastercard(accessToken); if (fallbackMastercard) { return fallbackMastercard; } @@ -107,7 +107,7 @@ export async function getSuitableCard(countryCode: string, accessToken: AccessTo throw new Error(`No suitable card found for country code ${countryCode}`); } -async function getFallbackIntlMasteracrd(accessToken: AccessToken): Promise { +async function getFallbackIntlMastercard(accessToken: AccessToken): Promise { try { return await getGiftCardById(fallbackIntlMastercard.sku, accessToken); } catch (e) { diff --git a/shared/allowed-country-list.ts b/shared/allowed-country-list.ts index 676b7e96..73693299 100644 --- a/shared/allowed-country-list.ts +++ b/shared/allowed-country-list.ts @@ -105,6 +105,7 @@ export const allowedCountries = [ }, { code: "BV", + //cspell:disable-next-line name: "Bouvet Island", }, { @@ -405,6 +406,7 @@ export const allowedCountries = [ }, { code: "CR", + //cspell:disable-next-line name: "Costa Rica", }, { @@ -417,6 +419,7 @@ export const allowedCountries = [ }, { code: "CW", + //cspell:disable-next-line name: "Curaçao", }, { @@ -533,6 +536,7 @@ export const allowedCountries = [ }, { code: "CV", + //cspell:disable-next-line name: "Cabo Verde", }, { diff --git a/static/scripts/rewards/gift-cards/mint/mint-action.ts b/static/scripts/rewards/gift-cards/mint/mint-action.ts index d9dfb1f5..d922739a 100644 --- a/static/scripts/rewards/gift-cards/mint/mint-action.ts +++ b/static/scripts/rewards/gift-cards/mint/mint-action.ts @@ -37,8 +37,8 @@ async function mintGiftCard(productId: number, app: AppState) { return; } - const isClaimiablle = await checkPermitClaimable(app); - if (isClaimiablle) { + const isClaimable = await checkPermitClaimable(app); + if (isClaimable) { const permit2Contract = new ethers.Contract(permit2Address, permit2Abi, app.signer); if (!permit2Contract) return; From f36277bf8659952279dd525c11d39cb77d1f9ed9 Mon Sep 17 00:00:00 2001 From: EresDev Date: Wed, 28 Aug 2024 14:09:24 -0400 Subject: [PATCH 132/174] refactor: rename functions & routes --- functions/{list-gift-cards.ts => get-best-card.ts} | 8 ++++---- functions/helpers.ts | 2 +- functions/post-order.ts | 8 ++++---- .../gift-cards/{list-gift-cards.ts => index.ts} | 14 +++++++------- .../scripts/rewards/gift-cards/mint/mint-action.ts | 2 +- static/scripts/rewards/init.ts | 2 +- .../render-transaction/claim-rewards-pagination.ts | 2 +- 7 files changed, 19 insertions(+), 19 deletions(-) rename functions/{list-gift-cards.ts => get-best-card.ts} (79%) rename static/scripts/rewards/gift-cards/{list-gift-cards.ts => index.ts} (88%) diff --git a/functions/list-gift-cards.ts b/functions/get-best-card.ts similarity index 79% rename from functions/list-gift-cards.ts rename to functions/get-best-card.ts index ac2ba7b6..6fdf8634 100644 --- a/functions/list-gift-cards.ts +++ b/functions/get-best-card.ts @@ -1,4 +1,4 @@ -import { getAccessToken, getSuitableCard } from "./helpers"; +import { getAccessToken, findBestCard } from "./helpers"; import { Context } from "./types"; import { validateEnvVars, validateRequestMethod } from "./validators"; @@ -15,10 +15,10 @@ export async function onRequest(ctx: Context): Promise { } const accessToken = await getAccessToken(ctx.env); - const suitableCard = await getSuitableCard(country, accessToken); + const bestCard = await findBestCard(country, accessToken); - if (suitableCard) { - return Response.json(suitableCard, { status: 200 }); + if (bestCard) { + return Response.json(bestCard, { status: 200 }); } return Response.json({ message: "There are no gift cards available." }, { status: 404 }); } catch (error) { diff --git a/functions/helpers.ts b/functions/helpers.ts index d0486707..ca5ae6ec 100644 --- a/functions/helpers.ts +++ b/functions/helpers.ts @@ -57,7 +57,7 @@ export function getBaseUrl(isSandbox: boolean): string { return "https://giftcards-sandbox.reloadly.com"; } -export async function getSuitableCard(countryCode: string, accessToken: AccessToken): Promise { +export async function findBestCard(countryCode: string, accessToken: AccessToken): Promise { const supportedCountry = allowedCountries.find((listItem) => listItem.code == countryCode); if (!supportedCountry) { throw new Error(`Country ${countryCode} is not in the allowed country list.`); diff --git a/functions/post-order.ts b/functions/post-order.ts index a7f9ffb4..50079b47 100644 --- a/functions/post-order.ts +++ b/functions/post-order.ts @@ -7,7 +7,7 @@ import { getGiftCardValue, isClaimableForAmount } from "../shared/pricing"; import { ExchangeRate, GiftCard, OrderRequestParams } from "../shared/types"; import { permit2Abi } from "../static/scripts/rewards/abis/permit2-abi"; import { getTransactionFromOrderId } from "./get-order"; -import { allowedChainIds, commonHeaders, getAccessToken, getBaseUrl, getSuitableCard } from "./helpers"; +import { allowedChainIds, commonHeaders, getAccessToken, getBaseUrl, findBestCard } from "./helpers"; import { AccessToken, Context, ReloadlyFailureResponse, ReloadlyOrderResponse } from "./types"; import { validateEnvVars, validateRequestMethod } from "./validators"; @@ -24,9 +24,9 @@ export async function onRequest(ctx: Context): Promise { throw new Error(`Invalid post parameters: ${JSON.stringify({ productId, txHash, chainId })}`); } - const suitableCard = await getSuitableCard(country, accessToken); - if (suitableCard.productId != productId) { - throw new Error(`You are not ordering the suitable card: ${JSON.stringify({ ordered: productId, suitable: suitableCard })}`); + const bestCard = await findBestCard(country, accessToken); + if (bestCard.productId != productId) { + throw new Error(`You are not ordering the suitable card: ${JSON.stringify({ ordered: productId, suitable: bestCard })}`); } if (!allowedChainIds.includes(chainId)) { throw new Error(`Unsupported chain: ${JSON.stringify({ chainId })}`); diff --git a/static/scripts/rewards/gift-cards/list-gift-cards.ts b/static/scripts/rewards/gift-cards/index.ts similarity index 88% rename from static/scripts/rewards/gift-cards/list-gift-cards.ts rename to static/scripts/rewards/gift-cards/index.ts index 6d879440..5d8f27dc 100644 --- a/static/scripts/rewards/gift-cards/list-gift-cards.ts +++ b/static/scripts/rewards/gift-cards/index.ts @@ -37,7 +37,7 @@ export async function initClaimGiftCard(app: AppState) { } const retrieveOrderUrl = `${getApiBaseUrl()}/get-order?orderId=${getGiftCardOrderId(app.reward.beneficiary, app.reward.signature)}`; - const listGiftCardsUrl = `${getApiBaseUrl()}/list-gift-cards?country=${country}`; + const bestCardUrl = `${getApiBaseUrl()}/get-best-card?country=${country}`; const requestInit = { method: "GET", @@ -46,22 +46,22 @@ export async function initClaimGiftCard(app: AppState) { }, }; - const [retrieveOrderResponse, retrieveGiftCardResponse] = await Promise.all([fetch(retrieveOrderUrl, requestInit), fetch(listGiftCardsUrl, requestInit)]); + const [orderResponse, bestCardResponse] = await Promise.all([fetch(retrieveOrderUrl, requestInit), fetch(bestCardUrl, requestInit)]); - const giftCard = (await retrieveGiftCardResponse.json()) as GiftCard; + const giftCard = (await bestCardResponse.json()) as GiftCard; - if (retrieveOrderResponse.status == 200) { - const { transaction, product } = (await retrieveOrderResponse.json()) as { + if (orderResponse.status == 200) { + const { transaction, product } = (await orderResponse.json()) as { transaction: OrderTransaction; product: GiftCard | null; }; addPurchasedCardHtml(product, transaction, app, giftCardsSection, activateInfoSection); - } else if (retrieveGiftCardResponse.status == 200) { + } else if (bestCardResponse.status == 200) { const availableGiftCard = isGiftCardAvailable(giftCard, app.reward.amount) ? giftCard : null; addAvailableCardsHtml(availableGiftCard, app, giftCardsSection, activateInfoSection); - } else if (retrieveGiftCardResponse.status == 404) { + } else if (bestCardResponse.status == 404) { giftCardsSection.innerHTML = "

There are no Visa/Mastercard available to claim at the moment.

"; } else { giftCardsSection.innerHTML = "

There was a problem in fetching gift cards. Try again later.

"; diff --git a/static/scripts/rewards/gift-cards/mint/mint-action.ts b/static/scripts/rewards/gift-cards/mint/mint-action.ts index d922739a..c10951b1 100644 --- a/static/scripts/rewards/gift-cards/mint/mint-action.ts +++ b/static/scripts/rewards/gift-cards/mint/mint-action.ts @@ -8,7 +8,7 @@ import { isErc20Permit } from "../../render-transaction/render-transaction"; import { toaster } from "../../toaster"; import { checkPermitClaimable, transferFromPermit, waitForTransaction } from "../../web3/erc20-permit"; import { getApiBaseUrl, getUserCountryCode } from "../helpers"; -import { initClaimGiftCard } from "../list-gift-cards"; +import { initClaimGiftCard } from "../index"; export function attachMintAction(giftCard: GiftCard, app: AppState) { const claimButtons: HTMLCollectionOf = document.getElementsByClassName("mint-btn"); diff --git a/static/scripts/rewards/init.ts b/static/scripts/rewards/init.ts index 37952c0c..3e8559bf 100644 --- a/static/scripts/rewards/init.ts +++ b/static/scripts/rewards/init.ts @@ -1,5 +1,5 @@ import { app } from "./app-state"; -import { initClaimGiftCard } from "./gift-cards/list-gift-cards"; +import { initClaimGiftCard } from "./gift-cards/index"; import { displayCommitHash } from "./render-transaction/display-commit-hash"; import { readClaimDataFromUrl } from "./render-transaction/read-claim-data-from-url"; import { grid } from "./the-grid"; diff --git a/static/scripts/rewards/render-transaction/claim-rewards-pagination.ts b/static/scripts/rewards/render-transaction/claim-rewards-pagination.ts index 5e4ca4e5..2c58c149 100644 --- a/static/scripts/rewards/render-transaction/claim-rewards-pagination.ts +++ b/static/scripts/rewards/render-transaction/claim-rewards-pagination.ts @@ -1,5 +1,5 @@ import { app } from "../app-state"; -import { initClaimGiftCard } from "../gift-cards/list-gift-cards"; +import { initClaimGiftCard } from "../gift-cards/index"; import { getMakeClaimButton } from "../toaster"; import { table } from "./read-claim-data-from-url"; import { renderTransaction } from "./render-transaction"; From 71e017aaf0b7e2b26772dd66c08a18cf9b9eda95 Mon Sep 17 00:00:00 2001 From: EresDev Date: Wed, 28 Aug 2024 14:22:57 -0400 Subject: [PATCH 133/174] refactor: move activate info with card html --- static/index.html | 1 - .../scripts/rewards/gift-cards/gift-card.ts | 2 + static/scripts/rewards/gift-cards/index.ts | 42 ++++--------------- 3 files changed, 11 insertions(+), 34 deletions(-) diff --git a/static/index.html b/static/index.html index 17f393b0..7e34b86d 100644 --- a/static/index.html +++ b/static/index.html @@ -180,7 +180,6 @@
Loading...
-

Disclaimer

All Visa/Mastercard are non-exchangeable & non-refundable.

diff --git a/static/scripts/rewards/gift-cards/gift-card.ts b/static/scripts/rewards/gift-cards/gift-card.ts index 55e7e3e4..4c8c17b9 100644 --- a/static/scripts/rewards/gift-cards/gift-card.ts +++ b/static/scripts/rewards/gift-cards/gift-card.ts @@ -2,6 +2,7 @@ import { BigNumberish } from "ethers"; import { GiftCard } from "../../../../shared/types"; import { getFixedPriceToValueMap, getGiftCardValue, isRangePriceGiftCardClaimable } from "../../../../shared/pricing"; import { formatEther } from "ethers/lib/utils"; +import { getGiftCardActivateInfoHtml } from "./activate/activate-html"; const html = String.raw; @@ -41,6 +42,7 @@ export function getGiftCardHtml(giftCard: GiftCard, rewardAmount: BigNumberish)
+ ${getGiftCardActivateInfoHtml(giftCard)} `; } diff --git a/static/scripts/rewards/gift-cards/index.ts b/static/scripts/rewards/gift-cards/index.ts index 5d8f27dc..7880e123 100644 --- a/static/scripts/rewards/gift-cards/index.ts +++ b/static/scripts/rewards/gift-cards/index.ts @@ -1,14 +1,13 @@ -import { isGiftCardAvailable, getGiftCardOrderId } from "../../../../shared/helpers"; +import { allowedCountries } from "../../../../shared/allowed-country-list"; +import { getGiftCardOrderId, isGiftCardAvailable } from "../../../../shared/helpers"; import { GiftCard, OrderTransaction } from "../../../../shared/types"; import { AppState } from "../app-state"; import { attachActivateInfoAction } from "./activate/activate-action"; -import { attachMintAction } from "./mint/mint-action"; -import { attachRevealAction } from "./reveal/reveal-action"; -import { getApiBaseUrl, getUserCountryCode } from "./helpers"; -import { getGiftCardActivateInfoHtml } from "./activate/activate-html"; import { getGiftCardHtml } from "./gift-card"; +import { getApiBaseUrl, getUserCountryCode } from "./helpers"; +import { attachMintAction } from "./mint/mint-action"; import { getRedeemCodeHtml } from "./reveal/redeem-code-html"; -import { allowedCountries } from "../../../../shared/allowed-country-list"; +import { attachRevealAction } from "./reveal/reveal-action"; export async function initClaimGiftCard(app: AppState) { const giftCardsSection = document.getElementById("gift-cards"); @@ -18,13 +17,6 @@ export async function initClaimGiftCard(app: AppState) { } giftCardsSection.innerHTML = "Loading..."; - const activateInfoSection = document.getElementById("activate-info"); - if (!activateInfoSection) { - console.error("Missing gift cards activate info section #activate-info"); - return; - } - activateInfoSection.innerHTML = ""; - const country = await getUserCountryCode(); if (!country) { giftCardsSection.innerHTML = `

Failed to load suitable virtual cards for you. Refresh or try disabling adblocker.

`; @@ -56,11 +48,11 @@ export async function initClaimGiftCard(app: AppState) { product: GiftCard | null; }; - addPurchasedCardHtml(product, transaction, app, giftCardsSection, activateInfoSection); + addPurchasedCardHtml(product, transaction, app, giftCardsSection); } else if (bestCardResponse.status == 200) { const availableGiftCard = isGiftCardAvailable(giftCard, app.reward.amount) ? giftCard : null; - addAvailableCardsHtml(availableGiftCard, app, giftCardsSection, activateInfoSection); + addAvailableCardsHtml(availableGiftCard, app, giftCardsSection); } else if (bestCardResponse.status == 404) { giftCardsSection.innerHTML = "

There are no Visa/Mastercard available to claim at the moment.

"; } else { @@ -70,13 +62,7 @@ export async function initClaimGiftCard(app: AppState) { attachActivateInfoAction(); } -function addPurchasedCardHtml( - giftCard: GiftCard | null, - transaction: OrderTransaction, - app: AppState, - giftCardsSection: HTMLElement, - activateInfoSection: HTMLElement -) { +function addPurchasedCardHtml(giftCard: GiftCard | null, transaction: OrderTransaction, app: AppState, giftCardsSection: HTMLElement) { const htmlParts: string[] = []; htmlParts.push(`

Your virtual visa/mastercard

`); htmlParts.push(`
`); @@ -90,16 +76,10 @@ function addPurchasedCardHtml( giftCardsSection.innerHTML = htmlParts.join(""); - if (giftCard) { - const activateInfoHtmlParts: string[] = []; - activateInfoHtmlParts.push(getGiftCardActivateInfoHtml(giftCard)); - activateInfoSection.innerHTML = activateInfoHtmlParts.join(""); - } - attachRevealAction(transaction, app); } -function addAvailableCardsHtml(giftCard: GiftCard | null, app: AppState, giftCardsSection: HTMLElement, activateInfoSection: HTMLElement) { +function addAvailableCardsHtml(giftCard: GiftCard | null, app: AppState, giftCardsSection: HTMLElement) { const htmlParts: string[] = []; htmlParts.push(`

Or mint a virtual visa/mastercard

`); @@ -110,10 +90,6 @@ function addAvailableCardsHtml(giftCard: GiftCard | null, app: AppState, giftCar giftCardsSection.innerHTML = htmlParts.join(""); - const activateInfoHtmlParts: string[] = []; - activateInfoHtmlParts.push(getGiftCardActivateInfoHtml(giftCard)); - activateInfoSection.innerHTML = activateInfoHtmlParts.join(""); - attachMintAction(giftCard, app); } else { htmlParts.push(`

There are no Visa/Mastercard available to claim at the moment.

`); From af0b71f95dba4c4ba381275b7ff1b0aab799af95 Mon Sep 17 00:00:00 2001 From: EresDev Date: Wed, 28 Aug 2024 15:22:59 -0400 Subject: [PATCH 134/174] refactor: improve html class names --- .../scripts/rewards/gift-cards/gift-card.ts | 4 +- static/scripts/rewards/gift-cards/index.ts | 24 +--- .../rewards/gift-cards/mint/mint-action.ts | 10 +- .../gift-cards/reveal/redeem-code-html.ts | 4 +- .../gift-cards/reveal/reveal-action.ts | 18 +-- static/styles/rewards/gift-cards.css | 125 ++++++------------ 6 files changed, 67 insertions(+), 118 deletions(-) diff --git a/static/scripts/rewards/gift-cards/gift-card.ts b/static/scripts/rewards/gift-cards/gift-card.ts index 4c8c17b9..2b0a205a 100644 --- a/static/scripts/rewards/gift-cards/gift-card.ts +++ b/static/scripts/rewards/gift-cards/gift-card.ts @@ -8,7 +8,7 @@ const html = String.raw; export function getGiftCardHtml(giftCard: GiftCard, rewardAmount: BigNumberish) { return html` -
+
${giftCard.productName}
@@ -17,7 +17,7 @@ export function getGiftCardHtml(giftCard: GiftCard, rewardAmount: BigNumberish)
${giftCard.denominationType == "FIXED" ? getFixedPricesHtml(giftCard, rewardAmount) : getRangePricesHtml(giftCard, rewardAmount)}
-
+ + + + + + + ${txs.map((tx) => transactionRowHtml(tx)).join("")} +
Transaction HashDateAmountAction
+ `; + + txs.forEach((tx) => { + if (!tx.txHash) { + return; + } + const button = document.getElementById(tx.txHash); + if (!button) { + return; + } + button.addEventListener("click", async () => { + button.setAttribute("data-loading", "true"); + await checkTransaction(tx); + button.setAttribute("data-loading", "false"); + }); + }); +} + +function transactionRowHtml(transaction: Transaction) { + return ` + + ${transaction.txHash?.slice(0, 16)}... + ${transaction.date.toISOString().split("T")[0]} + ${transaction.amount ? formatUnits(transaction.amount, 18) : 0} uAD + + + + + `; +} + +async function checkTransaction(transaction: Transaction) { + if (!transaction.txHash || !transaction.walletAddress || !transaction.chainId || !transaction.country || !transaction.productId) { + return; + } + const orderId = getGiftCardOrderId(transaction.walletAddress, transaction.txHash); + const response = await getOrder({ orderId }); + if (!response) { + const order = await postOrder({ + type: "ubiquity-dollar", + chainId: transaction.chainId, + txHash: transaction.txHash, + productId: transaction.productId, + country: transaction.country, + }); + if (!order) { + toaster.create("error", "Order failed. Try again later."); + return; + } + } + + app.transaction = transaction; + await showPurchasedCard(orderId); +} diff --git a/static/styles/rewards/ubiquity-dollar.css b/static/styles/rewards/ubiquity-dollar.css new file mode 100644 index 00000000..be798213 --- /dev/null +++ b/static/styles/rewards/ubiquity-dollar.css @@ -0,0 +1,28 @@ +#transaction-history { + margin-top: 50px; +} + +.amount-input { + height: 20px; + width: 150px; + appearance: none; + margin-bottom: 15px; + margin-right: 5px; + padding: 5px; + border: none; + border-radius: 5px; +} + +tbody { + position: inherit; + transform: none; +} + +table th { + padding-left: 0px; + padding: 12px; +} + +table td { + padding: 12px; +} \ No newline at end of file diff --git a/static/ubiquity-dollar.html b/static/ubiquity-dollar.html new file mode 100644 index 00000000..121d8ee6 --- /dev/null +++ b/static/ubiquity-dollar.html @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Ubiquity Rewards | Ubiquity DAO + + + + +
+
+
+
+
+
+ + + +
+
+
+
+ + uAD +
+ +
+
+ +
+
+
+
+
+

Disclaimer

+

All Visa/Mastercard are non-exchangeable & non-refundable.

+

Exact value of a card can be slightly different due to exchange rate.

+
+ +
+
    + + + + + diff --git a/yarn.lock b/yarn.lock index 9c75a508..40491147 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6357,16 +6357,7 @@ string-argv@0.3.2: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== -"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== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 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== @@ -6443,14 +6434,7 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -"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@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", 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== @@ -7039,7 +7023,7 @@ wrangler@^3.51.2: optionalDependencies: fsevents "~2.3.2" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.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== @@ -7057,15 +7041,6 @@ wrap-ansi@^6.2.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== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" @@ -7199,7 +7174,7 @@ zod@3.22.4: resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== -zod@^3.22.3: +zod@^3.22.3, zod@^3.23.8: version "3.23.8" resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== From 5fb3c535bbfb751020d23fa746d3dd57fb0a4f7e Mon Sep 17 00:00:00 2001 From: whilefoo Date: Sun, 22 Sep 2024 20:13:47 +0200 Subject: [PATCH 162/174] fix: knip --- .github/knip.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/knip.ts b/.github/knip.ts index 05734a2c..47ae4ba9 100644 --- a/.github/knip.ts +++ b/.github/knip.ts @@ -1,7 +1,7 @@ import type { KnipConfig } from "knip"; const config: KnipConfig = { - entry: ["build/esbuild-build.ts", "static/scripts/rewards/init.ts"], + entry: ["build/esbuild-build.ts", "static/scripts/rewards/init.ts", "static/scripts/ubiquity-dollar/init.ts"], project: ["src/**/*.ts", "static/scripts/**/*.ts"], ignore: ["src/types/config.ts", "**/__mocks__/**", "**/__fixtures__/**", "lib/**/*"], ignoreExportsUsedInFile: true, From a0ebf5e131eae211f0a106fed3a2af9b6cdbc998 Mon Sep 17 00:00:00 2001 From: whilefoo Date: Sat, 28 Sep 2024 22:36:35 +0200 Subject: [PATCH 163/174] feat: handle multiple networks for ubiquity dollar --- functions/helpers.ts | 4 ---- shared/constants.ts | 20 ++++++++++++++++++-- static/scripts/ubiquity-dollar/gift-card.ts | 5 +++-- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/functions/helpers.ts b/functions/helpers.ts index 817b8667..016b6800 100644 --- a/functions/helpers.ts +++ b/functions/helpers.ts @@ -6,10 +6,6 @@ import { getGiftCardById } from "./post-order"; import { fallbackIntlMastercard, fallbackIntlVisa, masterCardIntlSkus, visaIntlSkus } from "./reloadly-lists"; import { AccessToken, ReloadlyFailureResponse } from "./types"; -export const permitAllowedChainIds = [1, 5, 100, 31337]; - -export const ubiquityDollarAllowedChainIds = [1, 31337]; - export const commonHeaders = { "Content-Type": "application/json", Accept: "application/com.reloadly.giftcards-v1+json", diff --git a/shared/constants.ts b/shared/constants.ts index 3ab3ca89..8f4c9f47 100644 --- a/shared/constants.ts +++ b/shared/constants.ts @@ -3,12 +3,28 @@ export enum Tokens { WXDAI = "0xe91d153e0b41518a2ce8dd3d7944fa863463a97d", } +export const permitAllowedChainIds = [1, 5, 100, 31337]; + +export const ubiquityDollarAllowedChainIds = [1, 100, 31337]; + export const permit2Address = "0x000000000022D473030F116dDEE9F6B43aC78BA3"; -export const ubiquityDollarErc20Address = "0x0F644658510c95CB46955e55D7BA9DDa9E9fBEc6"; export const giftCardTreasuryAddress = "0xD51B09ad92e08B962c994374F4e417d4AD435189"; -export const chainIdToRewardTokenMap = { +export const ubiquityDollarChainAddresses: Record = { + 1: "0x0F644658510c95CB46955e55D7BA9DDa9E9fBEc6", + 100: "0xC6ed4f520f6A4e4DC27273509239b7F8A68d2068", + 31337: "0x0F644658510c95CB46955e55D7BA9DDa9E9fBEc6", +}; + +export const chainIdToRewardTokenMap: Record = { 1: Tokens.DAI, 100: Tokens.WXDAI, 31337: Tokens.WXDAI, }; + +export const chainIdToNameMap: Record = { + 1: "Ethereum", + 5: "Goerli Testnet", + 100: "Gnosis", + 31337: "Local Testnet", +}; diff --git a/static/scripts/ubiquity-dollar/gift-card.ts b/static/scripts/ubiquity-dollar/gift-card.ts index 90c70dad..0bc9ed6b 100644 --- a/static/scripts/ubiquity-dollar/gift-card.ts +++ b/static/scripts/ubiquity-dollar/gift-card.ts @@ -9,9 +9,9 @@ import { BigNumberish, ethers } from "ethers"; import { parseUnits } from "ethers/lib/utils"; import { erc20Abi } from "../rewards/abis"; import { TransactionResponse } from "@ethersproject/providers"; -import { giftCardTreasuryAddress, ubiquityDollarErc20Address } from "../../../shared/constants"; +import { giftCardTreasuryAddress, ubiquityDollarChainAddresses } from "../../../shared/constants"; import { app } from "./app-state"; -import { ubiquityDollarAllowedChainIds } from "../../../functions/helpers"; +import { ubiquityDollarAllowedChainIds } from "../../../shared/constants"; import { getGiftCardHtml } from "../rewards/gift-cards/gift-card"; import { showTransactionHistory } from "./transaction-history"; import { getOrder, postOrder, getBestCard, getReedemCode } from "../shared/api"; @@ -167,6 +167,7 @@ async function mintGiftCard(productId: number) { return; } + const ubiquityDollarErc20Address = ubiquityDollarChainAddresses[chainId]; const erc20Contract = new ethers.Contract(ubiquityDollarErc20Address, erc20Abi, signer); const tx: TransactionResponse = await erc20Contract.transfer(giftCardTreasuryAddress, amount); From 43820351f9233fa3cb4f66a3c7e2385a41c522cd Mon Sep 17 00:00:00 2001 From: whilefoo Date: Sat, 28 Sep 2024 22:43:08 +0200 Subject: [PATCH 164/174] fix: spelling --- static/scripts/shared/api.ts | 2 +- static/scripts/ubiquity-dollar/gift-card.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/static/scripts/shared/api.ts b/static/scripts/shared/api.ts index e8c59609..24ea4f4d 100644 --- a/static/scripts/shared/api.ts +++ b/static/scripts/shared/api.ts @@ -60,7 +60,7 @@ export async function postOrder(params: PostOrderParams) { return (await response.json()) as ReloadlyOrderResponse; } -export async function getReedemCode(params: GetRedeemCodeParams) { +export async function getRedeemCode(params: GetRedeemCodeParams) { const response = await fetch( `${getApiBaseUrl()}/get-redeem-code?transactionId=${params.transactionId}&signedMessage=${params.signedMessage}&wallet=${params.wallet}&permitSig=${params.permitSig}`, { diff --git a/static/scripts/ubiquity-dollar/gift-card.ts b/static/scripts/ubiquity-dollar/gift-card.ts index 0bc9ed6b..b4595530 100644 --- a/static/scripts/ubiquity-dollar/gift-card.ts +++ b/static/scripts/ubiquity-dollar/gift-card.ts @@ -14,7 +14,7 @@ import { app } from "./app-state"; import { ubiquityDollarAllowedChainIds } from "../../../shared/constants"; import { getGiftCardHtml } from "../rewards/gift-cards/gift-card"; import { showTransactionHistory } from "./transaction-history"; -import { getOrder, postOrder, getBestCard, getReedemCode } from "../shared/api"; +import { getOrder, postOrder, getBestCard, getRedeemCode } from "../shared/api"; import { toaster } from "../rewards/toaster"; const loaderAttribute = "data-loading"; @@ -247,7 +247,7 @@ export function attachRevealAction(transaction: OrderTransaction) { } async function revealRedeemCode(transactionId: number, wallet: string, txHash: string, signedMessage: string) { - const redeemCodes = await getReedemCode({ + const redeemCodes = await getRedeemCode({ transactionId: transactionId, signedMessage: signedMessage, wallet: wallet, From 7030020a091c5156769ad51eee65f649103659c8 Mon Sep 17 00:00:00 2001 From: whilefoo Date: Mon, 30 Sep 2024 20:25:29 +0200 Subject: [PATCH 165/174] feat: support optimism network --- functions/post-order.ts | 6 ++++-- shared/constants.ts | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/functions/post-order.ts b/functions/post-order.ts index fef12a9a..01584da4 100644 --- a/functions/post-order.ts +++ b/functions/post-order.ts @@ -2,17 +2,18 @@ import { TransactionReceipt, TransactionResponse } from "@ethersproject/provider import { JsonRpcProvider } from "@ethersproject/providers/lib/json-rpc-provider"; import { BigNumber } from "ethers"; import { Interface, TransactionDescription } from "ethers/lib/utils"; -import { Tokens, chainIdToRewardTokenMap, giftCardTreasuryAddress, permit2Address, ubiquityDollarErc20Address } from "../shared/constants"; +import { Tokens, chainIdToRewardTokenMap, giftCardTreasuryAddress, permit2Address } from "../shared/constants"; import { getFastestRpcUrl, getGiftCardOrderId } from "../shared/helpers"; import { getGiftCardValue, isClaimableForAmount } from "../shared/pricing"; import { ExchangeRate, GiftCard } from "../shared/types"; import { permit2Abi } from "../static/scripts/rewards/abis/permit2-abi"; import { erc20Abi } from "../static/scripts/rewards/abis/erc20-abi"; import { getTransactionFromOrderId } from "./get-order"; -import { permitAllowedChainIds, commonHeaders, findBestCard, getAccessToken, getBaseUrl, ubiquityDollarAllowedChainIds } from "./helpers"; +import { commonHeaders, findBestCard, getAccessToken, getBaseUrl } from "./helpers"; import { AccessToken, Context, ReloadlyFailureResponse, ReloadlyOrderResponse } from "./types"; import { validateEnvVars, validateRequestMethod } from "./validators"; import { postOrderParamsSchema } from "../shared/api-types"; +import { permitAllowedChainIds, ubiquityDollarAllowedChainIds, ubiquityDollarChainAddresses } from "../shared/constants"; export async function onRequest(ctx: Context): Promise { try { @@ -230,6 +231,7 @@ function validateTransferTransaction(txParsed: TransactionDescription, txReceipt return Response.json({ message: "Given transaction is not a token transfer" }, { status: 403 }); } + const ubiquityDollarErc20Address = ubiquityDollarChainAddresses[chainId]; if (txReceipt.to.toLowerCase() != ubiquityDollarErc20Address.toLowerCase()) { return Response.json({ message: "Given transaction is not a Ubiquity Dollar transfer" }, { status: 403 }); } diff --git a/shared/constants.ts b/shared/constants.ts index 8f4c9f47..d783281a 100644 --- a/shared/constants.ts +++ b/shared/constants.ts @@ -3,7 +3,7 @@ export enum Tokens { WXDAI = "0xe91d153e0b41518a2ce8dd3d7944fa863463a97d", } -export const permitAllowedChainIds = [1, 5, 100, 31337]; +export const permitAllowedChainIds = [1, 5, 10, 100, 31337]; export const ubiquityDollarAllowedChainIds = [1, 100, 31337]; @@ -25,6 +25,7 @@ export const chainIdToRewardTokenMap: Record = { export const chainIdToNameMap: Record = { 1: "Ethereum", 5: "Goerli Testnet", + 10: "Optimism", 100: "Gnosis", 31337: "Local Testnet", }; From ee89f7d5a3b4158fe975e6bb36a75bbd52774f3b Mon Sep 17 00:00:00 2001 From: whilefoo Date: Mon, 30 Sep 2024 20:25:41 +0200 Subject: [PATCH 166/174] fix: throw error --- static/scripts/ubiquity-dollar/transaction-history.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/static/scripts/ubiquity-dollar/transaction-history.ts b/static/scripts/ubiquity-dollar/transaction-history.ts index 0c6e1959..63f818bc 100644 --- a/static/scripts/ubiquity-dollar/transaction-history.ts +++ b/static/scripts/ubiquity-dollar/transaction-history.ts @@ -8,8 +8,7 @@ import { toaster } from "../rewards/toaster"; export function showTransactionHistory() { const transactionHistory = document.getElementById("transaction-history"); if (!transactionHistory) { - console.error("Missing check div #transaction-history"); - return; + throw new Error("Could not find transaction-history element"); } const txs = Storage.loadTransactions().filter((tx) => tx.date.getTime() > Date.now() - 1000 * 60 * 60 * 24 * 7); if (txs.length === 0) { @@ -31,11 +30,11 @@ export function showTransactionHistory() { txs.forEach((tx) => { if (!tx.txHash) { - return; + throw new Error("Could not find txHash"); } const button = document.getElementById(tx.txHash); if (!button) { - return; + throw new Error("Could not find button"); } button.addEventListener("click", async () => { button.setAttribute("data-loading", "true"); @@ -77,7 +76,7 @@ function transactionRowHtml(transaction: Transaction) { async function checkTransaction(transaction: Transaction) { if (!transaction.txHash || !transaction.walletAddress || !transaction.chainId || !transaction.country || !transaction.productId) { - return; + throw new Error("Unexpected error"); } const orderId = getGiftCardOrderId(transaction.walletAddress, transaction.txHash); const response = await getOrder({ orderId }); From c8f42099087a729f401e867d25c3f02a7f7ff72a Mon Sep 17 00:00:00 2001 From: rndquu Date: Mon, 14 Oct 2024 11:28:43 +0300 Subject: [PATCH 167/174] fix: show rewards page --- static/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/index.html b/static/index.html index 7e34b86d..05de5f0b 100644 --- a/static/index.html +++ b/static/index.html @@ -204,7 +204,7 @@

    Disclaimer

      - + From ca5fb097790ced796d8efdb1801d01cccb30da3d Mon Sep 17 00:00:00 2001 From: rndquu Date: Mon, 14 Oct 2024 12:41:04 +0300 Subject: [PATCH 168/174] build: fix --- build/esbuild-build.ts | 6 +++--- static/index.html | 4 ++-- static/ubiquity-dollar.html | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/build/esbuild-build.ts b/build/esbuild-build.ts index c5638c11..16796a99 100644 --- a/build/esbuild-build.ts +++ b/build/esbuild-build.ts @@ -17,7 +17,7 @@ const cssFiles: string[] = [ ]; // Output bundles file -const outputFilePath = "static/bundles/bundles.css"; +const outputFilePath = "static/out/bundles.css"; const typescriptEntries = ["static/scripts/rewards/init.ts", "static/scripts/ubiquity-dollar/init.ts"]; export const entries = [...typescriptEntries]; @@ -35,8 +35,8 @@ export const esBuildContext: esbuild.BuildOptions = { ".ttf": "dataurl", ".svg": "dataurl", }, - outfile: "static/bundles/bundles.js", - entryNames: "bundles", // Ensure the CSS is named bundles.css + outdir: "static/out", + entryNames: "[dir]", // Ensure the CSS is named bundles.css define: createEnvDefines(["SUPABASE_URL", "SUPABASE_ANON_KEY"], { commitHash: execSync(`git rev-parse --short HEAD`).toString().trim(), }), diff --git a/static/index.html b/static/index.html index 991ca6d5..48c5efe6 100644 --- a/static/index.html +++ b/static/index.html @@ -2,7 +2,7 @@ - + @@ -198,6 +198,6 @@

      Disclaimer

        - + diff --git a/static/ubiquity-dollar.html b/static/ubiquity-dollar.html index 121d8ee6..508b96c5 100644 --- a/static/ubiquity-dollar.html +++ b/static/ubiquity-dollar.html @@ -113,7 +113,7 @@

        Disclaimer

          - + From ae4d8d90ce2c7f6f4a3c5b6a850f485d8d2174a9 Mon Sep 17 00:00:00 2001 From: rndquu Date: Mon, 14 Oct 2024 12:48:58 +0300 Subject: [PATCH 169/174] ci: fix cspell --- .cspell.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.cspell.json b/.cspell.json index fe986635..733671ee 100644 --- a/.cspell.json +++ b/.cspell.json @@ -33,6 +33,7 @@ "outdir", "outfile", "pageable", + "ress", "Reloadly", "Rpcs", "scalarmult", From 68f2a442b4c914308a73cd83efead1d1f48eb357 Mon Sep 17 00:00:00 2001 From: rndquu Date: Mon, 14 Oct 2024 12:53:30 +0300 Subject: [PATCH 170/174] ci: fix knip --- .github/knip.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/knip.ts b/.github/knip.ts index 47ae4ba9..c70c9889 100644 --- a/.github/knip.ts +++ b/.github/knip.ts @@ -1,8 +1,8 @@ import type { KnipConfig } from "knip"; const config: KnipConfig = { - entry: ["build/esbuild-build.ts", "static/scripts/rewards/init.ts", "static/scripts/ubiquity-dollar/init.ts"], - project: ["src/**/*.ts", "static/scripts/**/*.ts"], + entry: ["build/esbuild-build.ts", "static/scripts/rewards/init.ts", "static/scripts/ubiquity-dollar/init.ts", "static/scripts/shared/api.ts"], + project: ["src/**/*.ts", "static/scripts/**/*.ts", "shared/**/api-types.ts"], ignore: ["src/types/config.ts", "**/__mocks__/**", "**/__fixtures__/**", "lib/**/*"], ignoreExportsUsedInFile: true, // eslint can also be safely ignored as per the docs: https://knip.dev/guides/handling-issues#eslint--jest From affddbbfc65db6ccefef7a2407f04f0e974fcc55 Mon Sep 17 00:00:00 2001 From: rndquu Date: Mon, 14 Oct 2024 14:23:06 +0300 Subject: [PATCH 171/174] style: fix --- build/esbuild-build.ts | 8 +-- static/styles/rewards/pay.css | 78 +++++++++++------------ static/styles/rewards/ubiquity-dollar.css | 10 +-- static/ubiquity-dollar.html | 2 +- 4 files changed, 48 insertions(+), 50 deletions(-) diff --git a/build/esbuild-build.ts b/build/esbuild-build.ts index 16796a99..52e31783 100644 --- a/build/esbuild-build.ts +++ b/build/esbuild-build.ts @@ -5,15 +5,15 @@ import { appendFileSync, readFileSync, writeFileSync } from "fs"; // CSS files in order const cssFiles: string[] = [ + "static/styles/rewards/pay.css", "static/styles/rewards/background.css", + "static/styles/toast.css", "static/styles/rewards/claim-table.css", "static/styles/rewards/gift-cards.css", - "static/styles/rewards/light-mode.css", - "static/styles/rewards/media-queries.css", - "static/styles/rewards/pay.css", "static/styles/rewards/ubiquity-dollar.css", + "static/styles/rewards/media-queries.css", + "static/styles/rewards/light-mode.css", "static/styles/proxima.css", - "static/styles/toast.css", ]; // Output bundles file diff --git a/static/styles/rewards/pay.css b/static/styles/rewards/pay.css index f7547bac..b2ffae94 100644 --- a/static/styles/rewards/pay.css +++ b/static/styles/rewards/pay.css @@ -20,46 +20,38 @@ font-weight: 400; text-transform: uppercase; letter-spacing: 2px; - box-sizing: border-box; -} -html { - display: block; - width: 100%; - height: 100%; -} -body, -main { - width: 100%; - height: 100%; } + a { color: #808080; } -body { - overflow: hidden; -} + body, main { - max-width: 100%; + max-width: 100vw; display: flex; flex-direction: column; justify-content: center; align-items: center; color: #808080; } + main { - width: 100%; + width: 100vw; position: relative; } + a { text-decoration: none; } + #logo a { display: block; border: 1px solid transparent; border-radius: 3px; flex-direction: row; } + #logo { letter-spacing: 2px; padding: 48px 0; @@ -68,33 +60,41 @@ a { line-height: 1; text-align: center; } + #logo > #logo-icon { display: inline-block; vertical-align: middle; + padding: 4px; text-rendering: geometricPrecision; } + #logo-icon > svg { - height: 28px; + height: 36px; display: block; margin: 0; - width: 28px; + width: 36px; padding: 0; - margin-right: 6px; - color: #fff; + margin-right: 10px; + fill: #fff; } + #logo > div#logo-text { display: inline-block; vertical-align: middle; } +#logo > div#logo-text > span::after { + content: " "; + display: inline-block; + width: 8px; +} #logo > div#logo-text > span { - line-height: 1; - font-size: 16px; - letter-spacing: 2px; + font-size: 20px; + letter-spacing: 5px; text-transform: uppercase; text-rendering: geometricPrecision; color: #fff; - font-weight: 400; } + div.footer > div { padding: 48px 0; text-align: center; @@ -105,11 +105,13 @@ div.footer > div { display: inline-block; vertical-align: middle; } + footer a { opacity: 0.25; font-size: 12px; color: #fff; } + footer a:hover { opacity: 1; } @@ -119,6 +121,7 @@ header a #logo { header a:hover #logo { opacity: 1; } + main { display: flex; flex-direction: column; @@ -128,17 +131,16 @@ main div.receipt-container { height: 120px; margin-bottom: 32px; } + footer { width: 100%; position: relative; } + #carousel { flex-direction: row; align-items: center; align-self: center; - /* margin: 12px auto; */ - /* opacity: 0.5; */ - /* display: none; */ opacity: 0; transition: opacity 1s; text-align: center; @@ -155,17 +157,17 @@ footer { } #carousel > #rewardsCount { pointer-events: none; - display: inline-block; + display: inline-block; /* vertical-align: middle; */ } -#nextTx, -#prevTx { +#prevTx, +#nextTx { padding: 3px; margin: 3px; border: 2px solid; cursor: pointer; transform: rotate(45deg); border-radius: 3px; - width: 0; + width: 0px; display: inline-block; } #prevTx { @@ -177,31 +179,27 @@ footer { border-left-color: transparent; } -#faq-icon > a { - /* position: fixed; */ - /* right: 20px; */ - /* cursor: pointer; */ -} - #faq-icon > a > div { font-size: 12px; color: #fff; } + #faq-icon > a > div:hover { opacity: 1; } + .footer { - /* display: flex; */ - /* align-items: center; */ opacity: 0; transition: opacity 1s; text-align: center; } + .footer.ready { opacity: 1; } + #faq-icon { position: absolute; padding: 42px; right: 0; -} +} \ No newline at end of file diff --git a/static/styles/rewards/ubiquity-dollar.css b/static/styles/rewards/ubiquity-dollar.css index be798213..ab9e4e30 100644 --- a/static/styles/rewards/ubiquity-dollar.css +++ b/static/styles/rewards/ubiquity-dollar.css @@ -1,8 +1,8 @@ -#transaction-history { +#ubiquity-dollar-page #transaction-history { margin-top: 50px; } -.amount-input { +#ubiquity-dollar-page .amount-input { height: 20px; width: 150px; appearance: none; @@ -13,16 +13,16 @@ border-radius: 5px; } -tbody { +#ubiquity-dollar-page tbody { position: inherit; transform: none; } -table th { +#ubiquity-dollar-page table th { padding-left: 0px; padding: 12px; } -table td { +#ubiquity-dollar-page table td { padding: 12px; } \ No newline at end of file diff --git a/static/ubiquity-dollar.html b/static/ubiquity-dollar.html index 508b96c5..1ffc268f 100644 --- a/static/ubiquity-dollar.html +++ b/static/ubiquity-dollar.html @@ -31,7 +31,7 @@ Ubiquity Rewards | Ubiquity DAO - +
          From 7ca3aa9d2015b5d81cbd75c8929ac9ed18c53e5e Mon Sep 17 00:00:00 2001 From: rndquu Date: Mon, 14 Oct 2024 14:52:03 +0300 Subject: [PATCH 172/174] style: fix fonts --- build/esbuild-build.ts | 1 - static/index.html | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/build/esbuild-build.ts b/build/esbuild-build.ts index 52e31783..9e659c09 100644 --- a/build/esbuild-build.ts +++ b/build/esbuild-build.ts @@ -13,7 +13,6 @@ const cssFiles: string[] = [ "static/styles/rewards/ubiquity-dollar.css", "static/styles/rewards/media-queries.css", "static/styles/rewards/light-mode.css", - "static/styles/proxima.css", ]; // Output bundles file diff --git a/static/index.html b/static/index.html index 48c5efe6..d1317588 100644 --- a/static/index.html +++ b/static/index.html @@ -198,6 +198,7 @@

          Disclaimer

            + From db22f567d6ff0b1c483c54382532c384fca86ffe Mon Sep 17 00:00:00 2001 From: zugdev Date: Tue, 15 Oct 2024 01:13:02 -0300 Subject: [PATCH 173/174] feat: centralize button visibility responsibility and delete a lot of redundant code --- .../read-claim-data-from-url.ts | 65 ++++++++++++++----- .../render-transaction/render-transaction.ts | 11 +--- .../web3/handle-if-on-correct-network.ts | 9 --- .../rewards/web3/not-on-correct-network.ts | 18 ----- static/scripts/rewards/web3/switch-network.ts | 2 - .../rewards/web3/verify-current-network.ts | 23 ------- 6 files changed, 48 insertions(+), 80 deletions(-) delete mode 100644 static/scripts/rewards/web3/handle-if-on-correct-network.ts delete mode 100644 static/scripts/rewards/web3/not-on-correct-network.ts delete mode 100644 static/scripts/rewards/web3/verify-current-network.ts diff --git a/static/scripts/rewards/render-transaction/read-claim-data-from-url.ts b/static/scripts/rewards/render-transaction/read-claim-data-from-url.ts index 225475c7..8e6c7682 100644 --- a/static/scripts/rewards/render-transaction/read-claim-data-from-url.ts +++ b/static/scripts/rewards/render-transaction/read-claim-data-from-url.ts @@ -2,14 +2,16 @@ import { createClient } from "@supabase/supabase-js"; import { decodePermits } from "@ubiquibot/permit-generation/handlers"; import { Permit } from "@ubiquibot/permit-generation/types"; import { app, AppState } from "../app-state"; -import { toaster } from "../toaster"; +import { buttonController, toaster } from "../toaster"; import { connectWallet } from "../web3/connect-wallet"; import { checkRenderInvalidatePermitAdminControl, checkRenderMakeClaimControl } from "../web3/erc20-permit"; -import { verifyCurrentNetwork } from "../web3/verify-current-network"; import { claimRewardsPagination } from "./claim-rewards-pagination"; import { renderTransaction } from "./render-transaction"; import { setClaimMessage } from "./set-claim-message"; import { useRpcHandler } from "../web3/use-rpc-handler"; +import { switchNetwork } from "../web3/switch-network"; +import { ethers } from "ethers"; +import { getNetworkName, NetworkId } from "@ubiquity-dao/rpc-handler"; declare const SUPABASE_URL: string; declare const SUPABASE_ANON_KEY: string; @@ -47,30 +49,57 @@ export async function readClaimDataFromUrl(app: AppState) { /* empty */ } - try { - // this would throw on mobile browsers & non-web3 browsers - window?.ethereum.on("accountsChanged", () => { - checkRenderMakeClaimControl(app).catch(console.error); - checkRenderInvalidatePermitAdminControl(app).catch(console.error); - }); - } catch (err) { - /* - * handled feedback upstream already - * buttons are hidden and non-web3 infinite toast exists - */ - } + await updateButtonVisibility(app); displayRewardDetails(); displayRewardPagination(); await renderTransaction(); - if (app.networkId !== null) { - await verifyCurrentNetwork(app.networkId); - } else { - throw new Error("Network ID is null"); +} + +async function updateButtonVisibility(app: AppState) { + try { + const currentNetworkId = parseInt(await window.ethereum.request({ method: "eth_chainId" }), 16); + + if (currentNetworkId !== app.networkId) { + console.warn(`Incorrect network. Expected ${app.networkId}, but got ${currentNetworkId}.`); + buttonController.hideAll(); // Hide all buttons if the network is incorrect + toaster.create("error", `This dApp currently does not support payouts for network ID ${currentNetworkId}`); + + // Try switching to the propper network id + switchNetwork(new ethers.providers.Web3Provider(window.ethereum), app.reward.networkId).catch((error) => { + console.error(error); + if (app.networkId !== null) { + toaster.create("error", `Please switch to the ${getNetworkName(String(app.networkId) as NetworkId)} network to claim this reward.`); + } + }); + + return; // Stop further checks if the network is incorrect + } + + await checkRenderMakeClaimControl(app); + await checkRenderInvalidatePermitAdminControl(app); + } catch (error) { + console.error("Error updating button visibility:", error); + buttonController.hideAll(); // Hide all buttons if there's an error } } +// Below is a listener that updates buttons on account/network change +if (window.ethereum) { + // Handle account changes + window.ethereum.on("accountsChanged", async () => { + await updateButtonVisibility(app); + }); + + // Handle network changes + window.ethereum.on("chainChanged", async () => { + await updateButtonVisibility(app); + }); +} else { + console.warn("Ethereum provider not detected."); +} + async function getClaimedTxs(app: AppState): Promise> { const txs: Record = Object.create(null); for (const claim of app.claims) { diff --git a/static/scripts/rewards/render-transaction/render-transaction.ts b/static/scripts/rewards/render-transaction/render-transaction.ts index d19583d2..9d8e9cba 100644 --- a/static/scripts/rewards/render-transaction/render-transaction.ts +++ b/static/scripts/rewards/render-transaction/render-transaction.ts @@ -2,9 +2,8 @@ import { ERC20Permit, Permit, TokenType } from "@ubiquibot/permit-generation/typ import { networkExplorers } from "@ubiquity-dao/rpc-handler"; import { app } from "../app-state"; import { buttonController, getMakeClaimButton, viewClaimButton } from "../toaster"; -import { checkRenderInvalidatePermitAdminControl, claimErc20PermitHandlerWrapper, fetchTreasury } from "../web3/erc20-permit"; +import { claimErc20PermitHandlerWrapper, fetchTreasury } from "../web3/erc20-permit"; import { claimErc721PermitHandler } from "../web3/erc721-permit"; -import { verifyCurrentNetwork } from "../web3/verify-current-network"; import { insertErc20PermitTableData, insertErc721PermitTableData } from "./insert-table-data"; import { renderEnsName } from "./render-ens-name"; import { renderNftSymbol, renderTokenSymbol } from "./render-token-symbol"; @@ -26,8 +25,6 @@ export async function renderTransaction(): Promise { return false; } - verifyCurrentNetwork(app.reward.networkId).catch(console.error); - if (isErc20Permit(app.reward)) { const treasury = await fetchTreasury(app.reward); table.setAttribute(`data-additional-data-size`, "small"); @@ -47,16 +44,10 @@ export async function renderTransaction(): Promise { const toElement = document.getElementById(`rewardRecipient`) as Element; renderEnsName({ element: toElement, address: app.reward.beneficiary, networkId: app.networkId }).catch(console.error); - if (app.provider) { - checkRenderInvalidatePermitAdminControl(app).catch(console.error); - } - if (app.claimTxs[app.reward.nonce.toString()] !== undefined) { buttonController.showViewClaim(); viewClaimButton.addEventListener("click", () => window.open(`${app.currentExplorerUrl}/tx/${app.claimTxs[app.reward.nonce.toString()]}`)); } else if (window.ethereum) { - // requires wallet connection to claim - buttonController.showMakeClaim(); getMakeClaimButton().addEventListener("click", claimErc20PermitHandlerWrapper(app)); } diff --git a/static/scripts/rewards/web3/handle-if-on-correct-network.ts b/static/scripts/rewards/web3/handle-if-on-correct-network.ts deleted file mode 100644 index a9d17400..00000000 --- a/static/scripts/rewards/web3/handle-if-on-correct-network.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { buttonController } from "../toaster"; - -export function handleIfOnCorrectNetwork(currentNetworkId: number, desiredNetworkId: number) { - if (desiredNetworkId === currentNetworkId) { - buttonController.showMakeClaim(); - } else { - buttonController.hideMakeClaim(); - } -} diff --git a/static/scripts/rewards/web3/not-on-correct-network.ts b/static/scripts/rewards/web3/not-on-correct-network.ts deleted file mode 100644 index d04a6334..00000000 --- a/static/scripts/rewards/web3/not-on-correct-network.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { ethers } from "ethers"; -import { getNetworkName } from "@ubiquity-dao/rpc-handler"; -import { buttonController, toaster } from "../toaster"; -import { switchNetwork } from "./switch-network"; - -export function notOnCorrectNetwork(currentNetworkId: number, desiredNetworkId: number, web3provider: ethers.providers.Web3Provider) { - if (currentNetworkId !== desiredNetworkId) { - const networkName = getNetworkName(desiredNetworkId); - if (!networkName) { - toaster.create("error", `This dApp currently does not support payouts for network ID ${desiredNetworkId}`); - } - switchNetwork(web3provider, desiredNetworkId).catch((error) => { - console.error(error); - toaster.create("error", `Please switch to the ${networkName} network to claim this reward.`); - buttonController.hideAll(); - }); - } -} diff --git a/static/scripts/rewards/web3/switch-network.ts b/static/scripts/rewards/web3/switch-network.ts index 98266c2f..51ddae7c 100644 --- a/static/scripts/rewards/web3/switch-network.ts +++ b/static/scripts/rewards/web3/switch-network.ts @@ -1,11 +1,9 @@ import { ethers } from "ethers"; import { addNetwork } from "./add-network"; -import { buttonController } from "../toaster"; export async function switchNetwork(provider: ethers.providers.Web3Provider, networkId: number): Promise { try { await provider.send("wallet_switchEthereumChain", [{ chainId: "0x" + networkId.toString(16) }]); - buttonController.showMakeClaim(); return true; } catch (error: unknown) { // Add network if it doesn't exist. diff --git a/static/scripts/rewards/web3/verify-current-network.ts b/static/scripts/rewards/web3/verify-current-network.ts deleted file mode 100644 index 8d1e530d..00000000 --- a/static/scripts/rewards/web3/verify-current-network.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ethers } from "ethers"; -import { buttonController } from "../toaster"; -import { handleIfOnCorrectNetwork } from "./handle-if-on-correct-network"; -import { notOnCorrectNetwork } from "./not-on-correct-network"; - -// verifyCurrentNetwork checks if the user is on the correct network and displays an error if not -export async function verifyCurrentNetwork(desiredNetworkId: number) { - if (!window.ethereum) { - buttonController.hideAll(); - return; - } - - const web3provider = new ethers.providers.Web3Provider(window.ethereum); - - const network = await web3provider.getNetwork(); - const currentNetworkId = network.chainId; - - // watch for network changes - window.ethereum.on("chainChanged", (newNetworkId: T | string) => handleIfOnCorrectNetwork(parseInt(newNetworkId as string, 16), desiredNetworkId)); - - // if its not on ethereum mainnet, gnosis, or goerli, display error - notOnCorrectNetwork(currentNetworkId, desiredNetworkId, web3provider); -} From 722e7bb9cc6729d71e49dbcf3bf3f139aa654ab9 Mon Sep 17 00:00:00 2001 From: rndquu Date: Tue, 15 Oct 2024 10:20:22 +0300 Subject: [PATCH 174/174] ci: fix cspell --- .../rewards/render-transaction/read-claim-data-from-url.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/scripts/rewards/render-transaction/read-claim-data-from-url.ts b/static/scripts/rewards/render-transaction/read-claim-data-from-url.ts index 1e5aa5fd..9119d617 100644 --- a/static/scripts/rewards/render-transaction/read-claim-data-from-url.ts +++ b/static/scripts/rewards/render-transaction/read-claim-data-from-url.ts @@ -68,7 +68,7 @@ async function updateButtonVisibility(app: AppState) { buttonController.hideAll(); // Hide all buttons if the network is incorrect toaster.create("error", `This dApp currently does not support payouts for network ID ${currentNetworkId}`); - // Try switching to the propper network id + // Try switching to the proper network id switchNetwork(new ethers.providers.Web3Provider(window.ethereum), app.reward.networkId).catch((error) => { console.error(error); if (app.networkId !== null) {